diff --git a/WebServer/AppLoader.js b/WebServer/AppLoader.js index fd1ac76e4..f8f02c142 100644 --- a/WebServer/AppLoader.js +++ b/WebServer/AppLoader.js @@ -54,7 +54,12 @@ function newAppLoader() { 'DesignSpace/Workspace/FunctionLibraries/WebhookFunctions.js', 'DesignSpace/Workspace/FunctionLibraries/DependenciesFilter.js', - 'Utilities/RoundedCornersBackground.js', + 'Utilities/CoordinateTransformations.js', + 'Utilities/DateRateTransformations.js', + 'Utilities/Download.js', + 'Utilities/DrawPrint.js', + 'Utilities/LoadSaveFrame.js', + 'Utilities/NodeConfig.js', 'Panels/LayersPanel.js', 'Panels/UpDownButton.js', @@ -63,8 +68,9 @@ function newAppLoader() { 'Panels/PlotterPanel.js', 'Panels/PanelsVisibleButton.js', - 'ControlsToolBox/SidePanel.js', - 'ControlsToolBox/SidePanelTab.js', + 'SideSpace/SidePanelTab.js', + 'SideSpace/ListView.js', + 'SideSpace/ListItem.js', 'Spaces/CockpitSpace.js', 'Spaces/TopSpace.js', @@ -72,6 +78,7 @@ function newAppLoader() { 'Spaces/ChartingSpace.js', 'Spaces/FloatingSpace.js', 'Spaces/DesignSpace.js', + 'Spaces/SideSpace.js', 'Files/SingleFile.js', 'Files/FileCloud.js', @@ -185,7 +192,7 @@ function newAppLoader() { 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulation.js', 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulationAssetBalancesPanel.js', 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulationCurrentPositionPanel.js', - 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulationPartialResultsPanel.js', + 'Plotters/TradingEngines/Plotters-Trading-Simulation/TradingSimulationEpisodePanel.js', 'Plotters/TradingEngines/Plotters-Trading-Simulation/Conditions.js', 'Plotters/TradingEngines/Plotters-Trading-Simulation/Strategies.js', 'Plotters/TradingEngines/Plotters-Trading-Simulation/Trades.js', diff --git a/WebServer/Images/Icons/style-01/cancel-order.png b/WebServer/Images/Icons/style-01/cancel-order.png new file mode 100644 index 000000000..4d7b9dfa6 Binary files /dev/null and b/WebServer/Images/Icons/style-01/cancel-order.png differ diff --git a/WebServer/Images/Icons/style-01/execution-algorithm.png b/WebServer/Images/Icons/style-01/execution-algorithm.png new file mode 100644 index 000000000..66c3b88e6 Binary files /dev/null and b/WebServer/Images/Icons/style-01/execution-algorithm.png differ diff --git a/WebServer/Images/Icons/style-01/limit-order.png b/WebServer/Images/Icons/style-01/limit-order.png new file mode 100644 index 000000000..071808daf Binary files /dev/null and b/WebServer/Images/Icons/style-01/limit-order.png differ diff --git a/WebServer/Images/Icons/style-01/market-order.png b/WebServer/Images/Icons/style-01/market-order.png new file mode 100644 index 000000000..5ff1ee736 Binary files /dev/null and b/WebServer/Images/Icons/style-01/market-order.png differ diff --git a/WebServer/Images/Icons/style-01/move-order.png b/WebServer/Images/Icons/style-01/move-order.png new file mode 100644 index 000000000..6f1c26d1b Binary files /dev/null and b/WebServer/Images/Icons/style-01/move-order.png differ diff --git a/WebServer/Images/Icons/style-01/open-execution.png b/WebServer/Images/Icons/style-01/open-execution.png new file mode 100644 index 000000000..788edb635 Binary files /dev/null and b/WebServer/Images/Icons/style-01/open-execution.png differ diff --git a/WebServer/Images/superalgos-header-background.png b/WebServer/Images/superalgos-header-background.png index 5c980aa38..fe2c14c0d 100644 Binary files a/WebServer/Images/superalgos-header-background.png and b/WebServer/Images/superalgos-header-background.png differ diff --git a/WebServer/PlotterPanel.js b/WebServer/PlotterPanel.js index 75e63863e..40fad93d6 100644 --- a/WebServer/PlotterPanel.js +++ b/WebServer/PlotterPanel.js @@ -2,5 +2,10 @@ let functionName = pDataMineOrHost + pPlotter + pModule + pPanel; functionName = functionName.replace(/-/g, ""); functionName = 'new' + functionName - return window[functionName](); + try { + return window[functionName](); + } catch (err) { + console.log('[ERROR] getNewPlotterPanel -> Error trying to Load a Plotter Panel. err = ' + err.stack) + console.log('[ERROR] getNewPlotterPanel -> functionName = ' + functionName) + } } diff --git a/webServer.js b/webServer.js index 6e1f9b190..a1463db4b 100644 --- a/webServer.js +++ b/webServer.js @@ -55,19 +55,30 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { if (CONSOLE_LOG === true && request.url.indexOf('NO-LOG') === -1) { console.log('[INFO] webServer -> onBrowserRequest -> request.url = ' + request.url) } function getBody(callback) { // Gets the de body from a POST request to the web server - let body = '' + try { - request.on('data', function (data) { - body += data - // Too much POST data - if (body.length > 1e6) { - request.connection.destroy() - } - }) + let body = '' - request.on('end', function () { - callback(body) - }) + request.on('data', function (data) { + body += data + // Too much POST data + //if (body.length > 1e6) { + // request.connection.destroy() + //} + }) + + request.on('end', function () { + callback(body) + }) + + request.on('error', function (err) { + if (CONSOLE_LOG === true) { console.log('[INFO] webServer -> onBrowserRequest -> getBody -> err = ' + err.stack) } + respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), response) + }) + } catch (err) { + if (CONSOLE_LOG === true) { console.log('[INFO] webServer -> onBrowserRequest -> getBody -> err = ' + err.stack) } + respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), response) + } } let requestParameters = request.url.split('/') @@ -170,8 +181,10 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } break } + break - case 'Webhook': { + case 'Webhook': + { switch (requestParameters[2]) { // switch by command case 'Fetch-Messages': { let exchange = requestParameters[3] @@ -243,9 +256,10 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { break } } - break } + break + case 'ResetLogsAndData': { try { @@ -378,6 +392,7 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { respondWithFile(filePath, response) } break + case 'Panels': { respondWithFile(process.env.PATH_TO_CANVAS_APP + '/' + requestParameters[1] + '/' + requestParameters[2], response) @@ -420,6 +435,12 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } break + case 'SideSpace': + { + respondWithFile(process.env.PATH_TO_CANVAS_APP + '/' + requestParameters[1] + '/' + requestParameters[2], response) + } + break + case 'AppSchema.js': { let fs = require('fs') @@ -464,6 +485,81 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } break + case 'ListWorkspaces': + { + let dirPath = process.env.MY_WORKSPACES_PATH + + try { + let fs = require('fs') + + fs.readdir(dirPath, onDirRead) + + function onDirRead(err, fileList) { + if (err) { + if (CONSOLE_LOG === true) { console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath) } + respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) + return + } else { + respondWithContent(JSON.stringify(fileList), response) + return + } + } + + } catch (err) { + if (CONSOLE_LOG === true) { console.log('[ERROR] Error reading a directory content. filePath = ' + dirPath) } + respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), response) + return + } + + } + break + + case 'LoadWorkspace': + { + let fileName = unescape(requestParameters[2]) + let filePath = process.env.MY_WORKSPACES_PATH + '/' + fileName + '.json' + respondWithFile(filePath, response) + } + break + + case 'SaveWorkspace': + { + getBody(processRequest) + + async function processRequest(body) { + + let fileContent = body + let fileName = unescape(requestParameters[2]) + let filePath = process.env.MY_WORKSPACES_PATH + '/' + fileName + '.json' + + try { + let fs = require('fs') + let dir = process.env.MY_WORKSPACES_PATH; + + /* Create Dir if it does not exist */ + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir); + } + + fs.writeFile(filePath, fileContent, onFileWritten) + + function onFileWritten(err) { + if (err) { + if (CONSOLE_LOG === true) { console.log('[ERROR] Error writting the Workspace file. fileName = ' + fileName) } + respondWithContent(JSON.stringify(exchanges), response) + } else { + respondWithContent(JSON.stringify(global.DEFAULT_OK_RESPONSE), response) + } + } + + } catch (err) { + if (CONSOLE_LOG === true) { console.log('[ERROR] Error writting the Workspace file. fileName = ' + fileName) } + respondWithContent(JSON.stringify(exchanges), response) + } + } + } + break + case 'DataMines': { respondWithFile(process.env.DATA_MINES_PATH + '/' + requestParameters[2] + '.json', response) @@ -488,46 +584,6 @@ exports.newWebServer = function newWebServer(EVENTS_SERVER) { } break - case 'GetDefinition': - { - respondWithFile(process.env.INTER_PROCESS_FILES_PATH + '/definition.json', response) - } - break - - case 'SaveDefinition': - { - let fs = require('fs') - let body = '' - - request.on('data', function (data) { - body += data - // Too much POST data - if (body.length > 1e6) { - request.connection.destroy() - } - }) - - request.on('end', function () { - try { - let filePath = process.env.INTER_PROCESS_FILES_PATH + '/definition.json' - fs.writeFile(filePath, body, onFileWrite) - } catch (e) { - console.log('[ERROR] Error writing user config.', e) - respondWithContent(undefined, response) - } - - function onFileWrite(err) { - if (err) { - respondWithContent(undefined, response) - } else { - let responseContent = 'User config updated.' - respondWithContent(responseContent, response) - } - } - }) - } - break - default: { homePage()