From 0ff2809f0d26a30875445e83d9315ae4ddf340d3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 6 Sep 2021 14:11:54 +0200 Subject: [PATCH 01/65] Reorg of UI loader --- Desktop/{ => Client}/httpInterface.js | 2 +- Desktop/DesktopApp.js | 4 +- Desktop/UI/AppPostLoader.js | 232 ++++++++++++++++++++++++++ Desktop/UI/AppPreLoader.js | 181 ++++++++++++++++++++ Platform/UI/AppLoader.js | 22 +-- 5 files changed, 427 insertions(+), 14 deletions(-) rename Desktop/{ => Client}/httpInterface.js (95%) create mode 100644 Desktop/UI/AppPostLoader.js create mode 100644 Desktop/UI/AppPreLoader.js diff --git a/Desktop/httpInterface.js b/Desktop/Client/httpInterface.js similarity index 95% rename from Desktop/httpInterface.js rename to Desktop/Client/httpInterface.js index ddbddda7e..22a202645 100644 --- a/Desktop/httpInterface.js +++ b/Desktop/Client/httpInterface.js @@ -37,7 +37,7 @@ exports.newHttpInterface = function newHttpInterface() { switch (endpointOrFile) { case 'Images': // This means the Images folder. { - let path = global.env.PATH_TO_CLIENT + '/WebServer/Images/' + requestPath[2] + let path = global.env.PATH_TO_DESKTOP + '/WebServer/Images/' + requestPath[2] if (requestPath[3] !== undefined) { path = path + '/' + requestPath[3] diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index d2bb686db..e04a0ddad 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -19,8 +19,8 @@ exports.newDesktopApp = function newDesktopApp() { //await DK.webSocketsClient.initialize() /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/ - //let WEB_SOCKETS_INTERFACE = require('./webSocketsInterface.js') - let HTTP_INTERFACE = require('./httpInterface.js') + //let WEB_SOCKETS_INTERFACE = require('./Client/webSocketsInterface.js') + let HTTP_INTERFACE = require('./Client/httpInterface.js') /* WEB_SOCKETS_INTERFACE = WEB_SOCKETS_INTERFACE.newWebSocketsInterface() diff --git a/Desktop/UI/AppPostLoader.js b/Desktop/UI/AppPostLoader.js new file mode 100644 index 000000000..b73803e3c --- /dev/null +++ b/Desktop/UI/AppPostLoader.js @@ -0,0 +1,232 @@ + + +function newAppPostLoader() { + const MODULE_NAME = 'Post Loader' + const ERROR_LOG = true + const logger = newWebDebugLog() + + + let thisObject = { + start: start + } + + return thisObject + + function start() { + try { + + // autoSaveWhenClosingTheBrowser() + setupProjectsSchema() + + function setupProjectsSchema() { + httpRequest(undefined, 'ProjectsSchema', onResponse) + + function onResponse(err, file) { + PROJECTS_SCHEMA = JSON.parse(file) + setupSchemas() + } + } + + function setupSchemas() { + + let totalWebServerCalls = 0 + let webServerResponses = 0 + + for (let i = 0; i < PROJECTS_SCHEMA.length; i++) { + let project = PROJECTS_SCHEMA[i].name + let schemas = { + array: { + appSchema: [], + docsNodeSchema: [], + docsConceptSchema: [], + docsTopicSchema: [], + docsTutorialSchema: [], + docsReviewSchema: [], + docsBookSchema: [] + }, + map: { + appSchema: new Map(), + docsNodeSchema: new Map(), + docsConceptSchema: new Map(), + docsTopicSchema: new Map(), + docsTutorialSchema: new Map(), + docsReviewSchema: new Map(), + docsBookSchema: new Map() + } + } + SCHEMAS_BY_PROJECT.set(project, schemas) + + totalWebServerCalls++ + httpRequest(undefined, 'Schema/' + project + '/AppSchema', onResponseAppSchema) + + function onResponseAppSchema(err, schema) { + try { + schemas.array.appSchema = JSON.parse(schema) + + for (let j = 0; j < schemas.array.appSchema.length; j++) { + let schemaDocument = schemas.array.appSchema[j] + let key = schemaDocument.type + schemas.map.appSchema.set(key, schemaDocument) + } + } catch (err) { + console.log(err.stack) + } + + webServerResponses++ + if (webServerResponses === totalWebServerCalls) { startCanvas() } + } + + totalWebServerCalls++ + httpRequest(undefined, 'Schema/' + project + '/DocsNodeSchema', onResponseDocSchema) + + function onResponseDocSchema(err, schema) { + try { + schemas.array.docsNodeSchema = JSON.parse(schema) + + for (let j = 0; j < schemas.array.docsNodeSchema.length; j++) { + let schemaDocument = schemas.array.docsNodeSchema[j] + let key = schemaDocument.type + schemas.map.docsNodeSchema.set(key, schemaDocument) + } + } catch (err) { + console.log(err.stack) + } + + webServerResponses++ + if (webServerResponses === totalWebServerCalls) { startCanvas() } + } + + totalWebServerCalls++ + httpRequest(undefined, 'Schema/' + project + '/DocsConceptSchema', onResponseConceptSchema) + + function onResponseConceptSchema(err, schema) { + try { + schemas.array.docsConceptSchema = JSON.parse(schema) + + for (let j = 0; j < schemas.array.docsConceptSchema.length; j++) { + let schemaDocument = schemas.array.docsConceptSchema[j] + let key = schemaDocument.type + schemas.map.docsConceptSchema.set(key, schemaDocument) + } + } catch (err) { + console.log(err.stack) + } + + webServerResponses++ + if (webServerResponses === totalWebServerCalls) { startCanvas() } + } + + totalWebServerCalls++ + httpRequest(undefined, 'Schema/' + project + '/DocsTopicSchema', onResponseTopicSchema) + + function onResponseTopicSchema(err, schema) { + try { + schemas.array.docsTopicSchema = JSON.parse(schema) + + for (let j = 0; j < schemas.array.docsTopicSchema.length; j++) { + let schemaDocument = schemas.array.docsTopicSchema[j] + let key = schemaDocument.type + schemas.map.docsTopicSchema.set(key, schemaDocument) + } + } catch (err) { + console.log(err.stack) + } + + webServerResponses++ + if (webServerResponses === totalWebServerCalls) { startCanvas() } + } + + totalWebServerCalls++ + httpRequest(undefined, 'Schema/' + project + '/DocsTutorialSchema', onResponseTutorialSchema) + + function onResponseTutorialSchema(err, schema) { + try { + schemas.array.docsTutorialSchema = JSON.parse(schema) + + for (let j = 0; j < schemas.array.docsTutorialSchema.length; j++) { + let schemaDocument = schemas.array.docsTutorialSchema[j] + let key = schemaDocument.type + schemas.map.docsTutorialSchema.set(key, schemaDocument) + } + } catch (err) { + console.log(err.stack) + } + + webServerResponses++ + if (webServerResponses === totalWebServerCalls) { startCanvas() } + } + + totalWebServerCalls++ + httpRequest(undefined, 'Schema/' + project + '/DocsReviewSchema', onResponseReviewSchema) + + function onResponseReviewSchema(err, schema) { + try { + schemas.array.docsReviewSchema = JSON.parse(schema) + + for (let j = 0; j < schemas.array.docsReviewSchema.length; j++) { + let schemaDocument = schemas.array.docsReviewSchema[j] + let key = schemaDocument.type + schemas.map.docsReviewSchema.set(key, schemaDocument) + } + } catch (err) { + console.log(err.stack) + } + + webServerResponses++ + if (webServerResponses === totalWebServerCalls) { startCanvas() } + } + + totalWebServerCalls++ + httpRequest(undefined, 'Schema/' + project + '/DocsBookSchema', onResponseBookSchema) + + function onResponseBookSchema(err, schema) { + try { + schemas.array.docsBookSchema = JSON.parse(schema) + + for (let j = 0; j < schemas.array.docsBookSchema.length; j++) { + let schemaDocument = schemas.array.docsBookSchema[j] + let key = schemaDocument.type + schemas.map.docsBookSchema.set(key, schemaDocument) + } + } catch (err) { + console.log(err.stack) + } + + webServerResponses++ + if (webServerResponses === totalWebServerCalls) { startCanvas() } + } + } + } + + function startCanvas() { + /* If this method is executed for a second time, it should finalize the current execution structure */ + if (canvas !== undefined) { canvas.finalize() } + + canvas = newCanvas() + canvas.initialize() + } + } catch (err) { + if (ERROR_LOG === true) { logger.write('[ERROR] start -> err = ' + err.stack) } + } + } + + function autoSaveWhenClosingTheBrowser() { + window.onbeforeunload = saveWorkspace + + /* handles backspace and refresh(F5) from keyboard */ + window.manageBackRefresh = function (event) { + var tag = event.target.tagName.toLowerCase() + if (event.keyCode === 8 && tag !== 'input' && tag !== 'textarea') { // Backbutton pressed + saveWorkspace() + } else if (event.keyCode === 116) { // F5 pressed + saveWorkspace() + } + } + + window.addEventListener('keydown', window.manageBackRefresh) + + function saveWorkspace() { + UI.projects.foundations.spaces.designSpace.workspace.save() + } + } +} diff --git a/Desktop/UI/AppPreLoader.js b/Desktop/UI/AppPreLoader.js new file mode 100644 index 000000000..09002d258 --- /dev/null +++ b/Desktop/UI/AppPreLoader.js @@ -0,0 +1,181 @@ + +/* Callbacks default responses. */ + +let GLOBAL = {} + +GLOBAL.DEFAULT_OK_RESPONSE = { + result: "Ok", + message: "Operation Succeeded" +} + +GLOBAL.DEFAULT_FAIL_RESPONSE = { + result: "Fail", + message: "Operation Failed" +} + +GLOBAL.DEFAULT_RETRY_RESPONSE = { + result: "Retry", + message: "Retry Later" +} + +GLOBAL.CUSTOM_OK_RESPONSE = { + result: "Ok, but check Message", + message: "Custom Message" +} + +GLOBAL.CUSTOM_FAIL_RESPONSE = { + result: "Fail Because", + message: "Custom Message" +} + +let browserCanvas // This is the canvas object of the browser. + +function spacePad(str, max) { + str = str.toString() + return str.length < max ? spacePad(" " + str, max) : str +} + +function loadSuperalgos() { + + const MODULE_NAME = "App Pre-Loader" + const INFO_LOG = false + + let browser = checkBrowserVersion() + setupHTMLTextArea() + setupHTMLInput() + setupHTMLCanvas() + loadDebugModule() + + if ((browser.name !== "Chrome" && browser.name!=="Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) { + alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version) + } + + function checkBrowserVersion () { + + let ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [] + if(/trident/i.test(M[1])){ + tem=/\brv[ :]+(\d+)/g.exec(ua) || [] + return {name:'IE',version:(tem[1]||'')} + } + if(M[1]==='Chrome'){ + tem=ua.match(/\bOPR|Edge\/(\d+)/) + if(tem!=null) {return {name:'Opera', version:tem[1]}} + } + M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'] + if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1])} + return { + name: M[0], + version: M[1] + } + } + + function setupHTMLTextArea() { + let textArea = document.createElement('textarea') + textArea.id = "textArea" + textArea.spellcheck = false + textArea.style = 'resize: none;' + + ' border: none;' + + ' outline: none;' + + 'box-shadow: none;' + + 'overflow:hidden;' + + 'font-family: ' + 'Saira' + ';' + + 'font-size: 12px;' + + 'background-color: rgb(255, 255, 255);' + + 'color:rgb(255, 255, 255);' + + 'width: ' + 600 + 'px;' + + 'height: ' + 400 + 'px' + + let textAreaDiv = document.getElementById('textAreaDiv') + textAreaDiv.appendChild(textArea) + textAreaDiv.style = 'position:fixed; top:' + -1500 + 'px; left:' + 500 + 'px; z-index:10; ' + } + + function setupHTMLInput() { + let input = document.createElement('input') + input.id = "input" + input.spellcheck = false + input.style = "border: none; outline: none; box-shadow: none; overflow:hidden; width: 0px; height: 0px;" + + let inputDiv = document.getElementById('inputDiv') + inputDiv.appendChild(input) + } + + function setupHTMLCanvas() { + let canvas = document.createElement('canvas') + + canvas.id = "canvas" + canvas.width = 1400 + canvas.height = 600 + canvas.style.border = "0" + canvas.style = "position:absolute; top:0px; left:0px; z-index:1" + + let canvasApp = document.getElementById('canvasApp') + canvasApp.appendChild(canvas) + + browserCanvas = document.getElementById('canvas') + + browserCanvas.width = window.innerWidth + browserCanvas.height = window.innerHeight + browserCanvas.style.border = "none" + + browserCanvas.style.top = 0 + 'px' + } + + function loadDebugModule() { + let path = "WebDebugLog.js" + REQUIREJS([path], onRequired) + + function onRequired(pModule) { + if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded.") } + loadModules() + } + } + + /* And Finally, we start loading all the scripts we will inmediatelly need. */ + function loadModules() { + let path = "AppLoader.js" + REQUIREJS([path], onRequired) + + function onRequired(pModule) { + if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded.") } + let APP_LOADER_MODULE = newAppLoader() + APP_LOADER_MODULE.loadModules() + } + } +} + +function httpRequest(pContentToSend, pPath, callBackFunction) { + let xmlHttpRequest = new XMLHttpRequest() + xmlHttpRequest.onreadystatechange = function () { + if (this.readyState === 4 && this.status === 200) { + try { + callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE, xmlHttpRequest.responseText) + } catch(err) { + console.log('[ERROR] httpRequest -> httpRequest -> err.stack = '+ err.stack) + console.log('[ERROR] httpRequest -> httpRequest -> pContentToSend = '+ pContentToSend) + console.log('[ERROR] httpRequest -> httpRequest -> pPath = '+ pPath) + console.log('[ERROR] httpRequest -> httpRequest -> xmlHttpRequest.responseText = '+ xmlHttpRequest.responseText) + console.log('[ERROR] httpRequest -> httpRequest -> callBackFunction = '+ callBackFunction) + + } + return + } else if (this.readyState === 4 && this.status === 404) { + callBackFunction({ result: "Fail", message: xmlHttpRequest.responseText.trim(), code: xmlHttpRequest.responseText.trim() }) + return + } + } + + if (pContentToSend === undefined) { + xmlHttpRequest.open("GET", pPath, true) + xmlHttpRequest.send() + } else { + try { + let blob = new Blob([pContentToSend], { type: 'text/plain' }) + xmlHttpRequest.open("POST", pPath, true) + xmlHttpRequest.send(blob) + } catch (err) { + if (ERROR_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[ERROR] callServer -> err.message = " & err.message) } + callBackFunction({ result: "Fail", message: err.message }) + } + } +} diff --git a/Platform/UI/AppLoader.js b/Platform/UI/AppLoader.js index b17587624..eb8f87864 100644 --- a/Platform/UI/AppLoader.js +++ b/Platform/UI/AppLoader.js @@ -5,7 +5,7 @@ function newAppLoader() { const INFO_LOG = false const ERROR_LOG = true const logger = newWebDebugLog() - + let thisObject = { loadModules: loadModules @@ -64,16 +64,16 @@ function newAppLoader() { let fileArray = JSON.parse(fileList) for (let i = 0; i < fileArray.length; i++) { let item = fileArray[i] - + project = item[0] fileName = item[1] - urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName) + urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName) } modulesArray = modulesArray.concat(urlArray) utilities() } - } + } function utilities() { let url = 'ListUtilitiesFiles' @@ -84,16 +84,16 @@ function newAppLoader() { let fileArray = JSON.parse(fileList) for (let i = 0; i < fileArray.length; i++) { let item = fileArray[i] - + project = item[0] fileName = item[1] - urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName) + urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName) } modulesArray = modulesArray.concat(urlArray) globals() } - } + } function globals() { let url = 'ListGlobalFiles' @@ -104,16 +104,16 @@ function newAppLoader() { let fileArray = JSON.parse(fileList) for (let i = 0; i < fileArray.length; i++) { let item = fileArray[i] - + project = item[0] fileName = item[1] - urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName) + urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName) } modulesArray = modulesArray.concat(urlArray) spaces() } - } + } function spaces() { let url = 'ListSpaceFiles' @@ -138,7 +138,7 @@ function newAppLoader() { for (let i = 0; i < modulesArray.length; i++) { let path = modulesArray[i] - + console.log(path) REQUIREJS([path], onRequired) if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Module Requested.') } From ecc7b7d7b641955801f230ea47c1fd02b94f5adb Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 6 Sep 2021 17:59:44 +0200 Subject: [PATCH 02/65] Web App basic code --- Desktop/UI/AppLoader.js | 84 +++----------- Desktop/UI/AppPostLoader.js | 220 +----------------------------------- Desktop/UI/AppPreLoader.js | 112 +----------------- Desktop/UI/Globals.js | 9 ++ Desktop/UI/WebApp.js | 63 +++++++++++ 5 files changed, 91 insertions(+), 397 deletions(-) create mode 100644 Desktop/UI/Globals.js create mode 100644 Desktop/UI/WebApp.js diff --git a/Desktop/UI/AppLoader.js b/Desktop/UI/AppLoader.js index b17587624..1f8de0d3e 100644 --- a/Desktop/UI/AppLoader.js +++ b/Desktop/UI/AppLoader.js @@ -1,58 +1,22 @@ -let postLoader function newAppLoader() { - const MODULE_NAME = 'App Loader' - const INFO_LOG = false - const ERROR_LOG = true - const logger = newWebDebugLog() - let thisObject = { loadModules: loadModules } + let postLoader return thisObject async function loadModules() { try { - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Entering function.') } - - let plotters let modulesArray = [] - plotters = defaultPlotters() - modulesArray = modulesArray.concat([ - 'Globals.js', - 'Workspace.js', - - 'Files/SingleFile.js', - 'Files/FileCloud.js', - 'Files/MarketFiles.js', - 'Files/DailyFiles.js', - 'Files/FileCursor.js', - 'Files/FileSequence.js', - 'Files/FileStorage.js', - - 'EventsServerClient.js', - - 'LegacyPlotter.js', - 'PlotterPanel.js', - - 'VideoRecorder.js', - 'ProductStorage.js', - 'Canvas.js', - 'EventHandler.js', - 'Frame.js', - 'Animation.js', - 'Container.js', - 'Utilities.js', - 'AppPostLoader.js' + 'WebApp.js' ]) - modulesArray = modulesArray.concat(plotters) - functionLibraries() function functionLibraries() { @@ -64,16 +28,16 @@ function newAppLoader() { let fileArray = JSON.parse(fileList) for (let i = 0; i < fileArray.length; i++) { let item = fileArray[i] - + project = item[0] fileName = item[1] - urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName) + urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Function-Libraries' + '/' + fileName) } modulesArray = modulesArray.concat(urlArray) utilities() } - } + } function utilities() { let url = 'ListUtilitiesFiles' @@ -84,16 +48,16 @@ function newAppLoader() { let fileArray = JSON.parse(fileList) for (let i = 0; i < fileArray.length; i++) { let item = fileArray[i] - + project = item[0] fileName = item[1] - urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName) + urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Utilities' + '/' + fileName) } modulesArray = modulesArray.concat(urlArray) globals() } - } + } function globals() { let url = 'ListGlobalFiles' @@ -104,16 +68,16 @@ function newAppLoader() { let fileArray = JSON.parse(fileList) for (let i = 0; i < fileArray.length; i++) { let item = fileArray[i] - + project = item[0] fileName = item[1] - urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName) + urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName) } modulesArray = modulesArray.concat(urlArray) spaces() } - } + } function spaces() { let url = 'ListSpaceFiles' @@ -141,22 +105,12 @@ function newAppLoader() { REQUIREJS([path], onRequired) - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> Module Requested.') } - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> path = ' + path) } - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> total requested = ' + (i + 1)) } - function onRequired(pModule) { try { - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Entering function.') } - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Module Downloaded.') } - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> path = ' + path) } downloadedCounter++ - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> downloadedCounter = ' + downloadedCounter) } - if (downloadedCounter === modulesArray.length) { - if (INFO_LOG === true) { logger.write('[INFO] loadModules -> onRequired -> Starting Advanced Algos Platform.') } setTimeout(() => { postLoader = newAppPostLoader() postLoader.start() @@ -164,27 +118,15 @@ function newAppLoader() { } } catch (err) { - if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> onRequired -> err = ' + err.stack) } + console.log('[ERROR] loadModules -> onRequired -> err = ' + err.stack) } } } } } catch (err) { - if (ERROR_LOG === true) { logger.write('[ERROR] loadModules -> err = ' + err.stack) } + console.log('[ERROR] loadModules -> err = ' + err.stack) } } - - function defaultPlotters() { - return [ - 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Candles.js', - 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/CandlePanel.js', - 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/Volumes.js', - 'Plotters/Foundations/Candles/Plotters-Candles-Volumes/VolumePanel.js', - 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBands.js', - 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/BollingerBandsPanel.js', - 'Plotters/Foundations/Bollinger/Plotters-Bollinger-Bands/PercentageBandwidth.js' - ] - } } diff --git a/Desktop/UI/AppPostLoader.js b/Desktop/UI/AppPostLoader.js index b73803e3c..3e962a181 100644 --- a/Desktop/UI/AppPostLoader.js +++ b/Desktop/UI/AppPostLoader.js @@ -1,232 +1,18 @@ function newAppPostLoader() { - const MODULE_NAME = 'Post Loader' - const ERROR_LOG = true - const logger = newWebDebugLog() - let thisObject = { start: start } - return thisObject function start() { try { - - // autoSaveWhenClosingTheBrowser() - setupProjectsSchema() - - function setupProjectsSchema() { - httpRequest(undefined, 'ProjectsSchema', onResponse) - - function onResponse(err, file) { - PROJECTS_SCHEMA = JSON.parse(file) - setupSchemas() - } - } - - function setupSchemas() { - - let totalWebServerCalls = 0 - let webServerResponses = 0 - - for (let i = 0; i < PROJECTS_SCHEMA.length; i++) { - let project = PROJECTS_SCHEMA[i].name - let schemas = { - array: { - appSchema: [], - docsNodeSchema: [], - docsConceptSchema: [], - docsTopicSchema: [], - docsTutorialSchema: [], - docsReviewSchema: [], - docsBookSchema: [] - }, - map: { - appSchema: new Map(), - docsNodeSchema: new Map(), - docsConceptSchema: new Map(), - docsTopicSchema: new Map(), - docsTutorialSchema: new Map(), - docsReviewSchema: new Map(), - docsBookSchema: new Map() - } - } - SCHEMAS_BY_PROJECT.set(project, schemas) - - totalWebServerCalls++ - httpRequest(undefined, 'Schema/' + project + '/AppSchema', onResponseAppSchema) - - function onResponseAppSchema(err, schema) { - try { - schemas.array.appSchema = JSON.parse(schema) - - for (let j = 0; j < schemas.array.appSchema.length; j++) { - let schemaDocument = schemas.array.appSchema[j] - let key = schemaDocument.type - schemas.map.appSchema.set(key, schemaDocument) - } - } catch (err) { - console.log(err.stack) - } - - webServerResponses++ - if (webServerResponses === totalWebServerCalls) { startCanvas() } - } - - totalWebServerCalls++ - httpRequest(undefined, 'Schema/' + project + '/DocsNodeSchema', onResponseDocSchema) - - function onResponseDocSchema(err, schema) { - try { - schemas.array.docsNodeSchema = JSON.parse(schema) - - for (let j = 0; j < schemas.array.docsNodeSchema.length; j++) { - let schemaDocument = schemas.array.docsNodeSchema[j] - let key = schemaDocument.type - schemas.map.docsNodeSchema.set(key, schemaDocument) - } - } catch (err) { - console.log(err.stack) - } - - webServerResponses++ - if (webServerResponses === totalWebServerCalls) { startCanvas() } - } - - totalWebServerCalls++ - httpRequest(undefined, 'Schema/' + project + '/DocsConceptSchema', onResponseConceptSchema) - - function onResponseConceptSchema(err, schema) { - try { - schemas.array.docsConceptSchema = JSON.parse(schema) - - for (let j = 0; j < schemas.array.docsConceptSchema.length; j++) { - let schemaDocument = schemas.array.docsConceptSchema[j] - let key = schemaDocument.type - schemas.map.docsConceptSchema.set(key, schemaDocument) - } - } catch (err) { - console.log(err.stack) - } - - webServerResponses++ - if (webServerResponses === totalWebServerCalls) { startCanvas() } - } - - totalWebServerCalls++ - httpRequest(undefined, 'Schema/' + project + '/DocsTopicSchema', onResponseTopicSchema) - - function onResponseTopicSchema(err, schema) { - try { - schemas.array.docsTopicSchema = JSON.parse(schema) - - for (let j = 0; j < schemas.array.docsTopicSchema.length; j++) { - let schemaDocument = schemas.array.docsTopicSchema[j] - let key = schemaDocument.type - schemas.map.docsTopicSchema.set(key, schemaDocument) - } - } catch (err) { - console.log(err.stack) - } - - webServerResponses++ - if (webServerResponses === totalWebServerCalls) { startCanvas() } - } - - totalWebServerCalls++ - httpRequest(undefined, 'Schema/' + project + '/DocsTutorialSchema', onResponseTutorialSchema) - - function onResponseTutorialSchema(err, schema) { - try { - schemas.array.docsTutorialSchema = JSON.parse(schema) - - for (let j = 0; j < schemas.array.docsTutorialSchema.length; j++) { - let schemaDocument = schemas.array.docsTutorialSchema[j] - let key = schemaDocument.type - schemas.map.docsTutorialSchema.set(key, schemaDocument) - } - } catch (err) { - console.log(err.stack) - } - - webServerResponses++ - if (webServerResponses === totalWebServerCalls) { startCanvas() } - } - - totalWebServerCalls++ - httpRequest(undefined, 'Schema/' + project + '/DocsReviewSchema', onResponseReviewSchema) - - function onResponseReviewSchema(err, schema) { - try { - schemas.array.docsReviewSchema = JSON.parse(schema) - - for (let j = 0; j < schemas.array.docsReviewSchema.length; j++) { - let schemaDocument = schemas.array.docsReviewSchema[j] - let key = schemaDocument.type - schemas.map.docsReviewSchema.set(key, schemaDocument) - } - } catch (err) { - console.log(err.stack) - } - - webServerResponses++ - if (webServerResponses === totalWebServerCalls) { startCanvas() } - } - - totalWebServerCalls++ - httpRequest(undefined, 'Schema/' + project + '/DocsBookSchema', onResponseBookSchema) - - function onResponseBookSchema(err, schema) { - try { - schemas.array.docsBookSchema = JSON.parse(schema) - - for (let j = 0; j < schemas.array.docsBookSchema.length; j++) { - let schemaDocument = schemas.array.docsBookSchema[j] - let key = schemaDocument.type - schemas.map.docsBookSchema.set(key, schemaDocument) - } - } catch (err) { - console.log(err.stack) - } - - webServerResponses++ - if (webServerResponses === totalWebServerCalls) { startCanvas() } - } - } - } - - function startCanvas() { - /* If this method is executed for a second time, it should finalize the current execution structure */ - if (canvas !== undefined) { canvas.finalize() } - - canvas = newCanvas() - canvas.initialize() - } + webApp = newWebApp() + webApp.initialize() } catch (err) { - if (ERROR_LOG === true) { logger.write('[ERROR] start -> err = ' + err.stack) } - } - } - - function autoSaveWhenClosingTheBrowser() { - window.onbeforeunload = saveWorkspace - - /* handles backspace and refresh(F5) from keyboard */ - window.manageBackRefresh = function (event) { - var tag = event.target.tagName.toLowerCase() - if (event.keyCode === 8 && tag !== 'input' && tag !== 'textarea') { // Backbutton pressed - saveWorkspace() - } else if (event.keyCode === 116) { // F5 pressed - saveWorkspace() - } - } - - window.addEventListener('keydown', window.manageBackRefresh) - - function saveWorkspace() { - UI.projects.foundations.spaces.designSpace.workspace.save() + console.log('[ERROR] err.stack = ' + err.stack) } } } diff --git a/Desktop/UI/AppPreLoader.js b/Desktop/UI/AppPreLoader.js index 09002d258..a21df4ccb 100644 --- a/Desktop/UI/AppPreLoader.js +++ b/Desktop/UI/AppPreLoader.js @@ -1,55 +1,13 @@  -/* Callbacks default responses. */ - -let GLOBAL = {} - -GLOBAL.DEFAULT_OK_RESPONSE = { - result: "Ok", - message: "Operation Succeeded" -} - -GLOBAL.DEFAULT_FAIL_RESPONSE = { - result: "Fail", - message: "Operation Failed" -} - -GLOBAL.DEFAULT_RETRY_RESPONSE = { - result: "Retry", - message: "Retry Later" -} - -GLOBAL.CUSTOM_OK_RESPONSE = { - result: "Ok, but check Message", - message: "Custom Message" -} - -GLOBAL.CUSTOM_FAIL_RESPONSE = { - result: "Fail Because", - message: "Custom Message" -} - -let browserCanvas // This is the canvas object of the browser. - -function spacePad(str, max) { - str = str.toString() - return str.length < max ? spacePad(" " + str, max) : str -} - function loadSuperalgos() { - const MODULE_NAME = "App Pre-Loader" - const INFO_LOG = false - let browser = checkBrowserVersion() - setupHTMLTextArea() - setupHTMLInput() - setupHTMLCanvas() - loadDebugModule() - if ((browser.name !== "Chrome" && browser.name!=="Safari") || (browser.name === "Chrome" && parseInt(browser.version) < 85) || (browser.name === "Safari" && parseInt(browser.version) < 13)) { alert("Superalgos is officially supported on Google Chrome 85 or Safari 13.1 and above. Your browser version has been detected as potentially beneath this. If you continue you may experience some functionaility issues.\n\nDetected Browser: " + browser.name + "\nVersion: " + browser.version) } + loadModules() + function checkBrowserVersion () { let ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [] @@ -69,75 +27,11 @@ function loadSuperalgos() { } } - function setupHTMLTextArea() { - let textArea = document.createElement('textarea') - textArea.id = "textArea" - textArea.spellcheck = false - textArea.style = 'resize: none;' + - ' border: none;' + - ' outline: none;' + - 'box-shadow: none;' + - 'overflow:hidden;' + - 'font-family: ' + 'Saira' + ';' + - 'font-size: 12px;' + - 'background-color: rgb(255, 255, 255);' + - 'color:rgb(255, 255, 255);' + - 'width: ' + 600 + 'px;' + - 'height: ' + 400 + 'px' - - let textAreaDiv = document.getElementById('textAreaDiv') - textAreaDiv.appendChild(textArea) - textAreaDiv.style = 'position:fixed; top:' + -1500 + 'px; left:' + 500 + 'px; z-index:10; ' - } - - function setupHTMLInput() { - let input = document.createElement('input') - input.id = "input" - input.spellcheck = false - input.style = "border: none; outline: none; box-shadow: none; overflow:hidden; width: 0px; height: 0px;" - - let inputDiv = document.getElementById('inputDiv') - inputDiv.appendChild(input) - } - - function setupHTMLCanvas() { - let canvas = document.createElement('canvas') - - canvas.id = "canvas" - canvas.width = 1400 - canvas.height = 600 - canvas.style.border = "0" - canvas.style = "position:absolute; top:0px; left:0px; z-index:1" - - let canvasApp = document.getElementById('canvasApp') - canvasApp.appendChild(canvas) - - browserCanvas = document.getElementById('canvas') - - browserCanvas.width = window.innerWidth - browserCanvas.height = window.innerHeight - browserCanvas.style.border = "none" - - browserCanvas.style.top = 0 + 'px' - } - - function loadDebugModule() { - let path = "WebDebugLog.js" - REQUIREJS([path], onRequired) - - function onRequired(pModule) { - if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded.") } - loadModules() - } - } - - /* And Finally, we start loading all the scripts we will inmediatelly need. */ function loadModules() { let path = "AppLoader.js" REQUIREJS([path], onRequired) function onRequired(pModule) { - if (INFO_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[INFO] " + path + " downloaded.") } let APP_LOADER_MODULE = newAppLoader() APP_LOADER_MODULE.loadModules() } @@ -174,7 +68,7 @@ function httpRequest(pContentToSend, pPath, callBackFunction) { xmlHttpRequest.open("POST", pPath, true) xmlHttpRequest.send(blob) } catch (err) { - if (ERROR_LOG === true) { console.log(spacePad(MODULE_NAME, 50) + " : " + "[ERROR] callServer -> err.message = " & err.message) } + if (ERROR_LOG === true) { console.log("[ERROR] callServer -> err.message = " & err.message) } callBackFunction({ result: "Fail", message: err.message }) } } diff --git a/Desktop/UI/Globals.js b/Desktop/UI/Globals.js new file mode 100644 index 000000000..219cf4764 --- /dev/null +++ b/Desktop/UI/Globals.js @@ -0,0 +1,9 @@ +/* Global Constatns */ + +let webApp +let PROJECTS_SCHEMA + +/* New Root object*/ +let UI = { + projects: {} +} diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js new file mode 100644 index 000000000..2a6f3a66a --- /dev/null +++ b/Desktop/UI/WebApp.js @@ -0,0 +1,63 @@ +function newWebApp() { + + let thisObject = { + initialize: initialize, + finalize: finalize + } + + return thisObject + + function finalize() { + + } + + function initialize() { + try { + /* + Here we will setup the UI object, with all the + projects and spaces. + */ + for (let i = 0; i < PROJECTS_SCHEMA.length; i++) { + let projectDefinition = PROJECTS_SCHEMA[i] + UI.projects[projectDefinition.propertyName] = {} + let projectInstance = UI.projects[projectDefinition.propertyName] + + projectInstance.utilities = {} + projectInstance.globals = {} + projectInstance.functionLibraries = {} + + + if (projectDefinition.UI === undefined) { continue } + + /* Set up Globals of this Project */ + if (projectDefinition.UI.globals !== undefined) { + for (let j = 0; j < projectDefinition.UI.globals.length; j++) { + let globalDefinition = projectDefinition.UI.globals[j] + + projectInstance.globals[globalDefinition.propertyName] = eval(globalDefinition.functionName + '()') + } + } + + /* Set up Utilities of this Project */ + if (projectDefinition.UI.utilities !== undefined) { + for (let j = 0; j < projectDefinition.UI.utilities.length; j++) { + let utilityDefinition = projectDefinition.UI.utilities[j] + + projectInstance.utilities[utilityDefinition.propertyName] = eval(utilityDefinition.functionName + '()') + } + } + + /* Set up Function Libraries of this Project */ + if (projectDefinition.UI.functionLibraries !== undefined) { + for (let j = 0; j < projectDefinition.UI.functionLibraries.length; j++) { + let functionLibraryDefinition = projectDefinition.UI.functionLibraries[j] + + projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = eval(functionLibraryDefinition.functionName + '()') + } + } + } + } catch (err) { + console.log('[ERROR] initialize -> err.stack = ' + err.stack) + } + } +} From 373f0307d8995861fd36f1fe9bb3a738c2192e52 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Mon, 6 Sep 2021 20:30:05 +0200 Subject: [PATCH 03/65] WebApp Loading all modules declared at Project Schema --- Desktop/Client/httpInterface.js | 51 +++++++++++++++++++++++----- Desktop/UI/AppLoader.js | 25 +++----------- Desktop/UI/AppPostLoader.js | 14 ++++++-- Desktop/UI/AppPreLoader.js | 2 +- Desktop/UI/WebDebugLog.js | 21 ++++++++++++ Desktop/{WebServer => UI}/require.js | 0 Desktop/WebServer/index.html | 2 +- 7 files changed, 82 insertions(+), 33 deletions(-) create mode 100644 Desktop/UI/WebDebugLog.js rename Desktop/{WebServer => UI}/require.js (100%) diff --git a/Desktop/Client/httpInterface.js b/Desktop/Client/httpInterface.js index 22a202645..86ae51201 100644 --- a/Desktop/Client/httpInterface.js +++ b/Desktop/Client/httpInterface.js @@ -19,13 +19,13 @@ exports.newHttpInterface = function newHttpInterface() { /* We will create an HTTP Server and leave it running forever. */ - SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.DESKTOP_HTTP_INTERFACE_PORT) - /* Starting the browser now is optional */ - if (process.argv.includes("noBrowser")) { - //Running Client only with no UI. - } else { - SA.nodeModules.open('http://localhost:' + global.env.DESKTOP_HTTP_INTERFACE_PORT) - } + SA.nodeModules.http.createServer(onHttpRequest).listen(global.env.DESKTOP_HTTP_INTERFACE_PORT) + /* Starting the browser now is optional */ + if (process.argv.includes("noBrowser")) { + //Running Client only with no UI. + } else { + SA.nodeModules.open('http://localhost:' + global.env.DESKTOP_HTTP_INTERFACE_PORT) + } } function onHttpRequest(httpRequest, httpResponse) { @@ -35,6 +35,41 @@ exports.newHttpInterface = function newHttpInterface() { let endpointOrFile = requestPath[1] switch (endpointOrFile) { + case 'ProjectsSchema': + { + let path = global.env.PATH_TO_PROJECTS + '/' + 'ProjectsSchema.json' + SA.projects.foundations.utilities.httpResponses.respondWithFile(path, httpResponse) + } + break + case 'ListFunctionLibraries': + { + SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Function-Libraries', 'UI') + } + break + case 'ListUtilitiesFiles': + { + SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Utilities', 'UI') + } + break + case 'ListGlobalFiles': + { + SA.projects.foundations.utilities.httpResponses.respondWithProjectFolderFileList(httpResponse, 'Globals', 'UI') + } + break + case 'Projects': + { + let path = '' + for (let i = 2; i < 10; i++) { + if (requestPath[i] !== undefined) { + let parameter = unescape(requestPath[i]) + path = path + '/' + parameter + } + + } + let filePath = global.env.PATH_TO_PROJECTS + path + SA.projects.foundations.utilities.httpResponses.respondWithFile(filePath, httpResponse) + } + break case 'Images': // This means the Images folder. { let path = global.env.PATH_TO_DESKTOP + '/WebServer/Images/' + requestPath[2] @@ -58,7 +93,7 @@ exports.newHttpInterface = function newHttpInterface() { break default: { - SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_DESKTOP) + SA.projects.foundations.utilities.httpResponses.respondWithWebFile(httpResponse, endpointOrFile, global.env.PATH_TO_DESKTOP) } } } catch (err) { diff --git a/Desktop/UI/AppLoader.js b/Desktop/UI/AppLoader.js index 1f8de0d3e..24c5ccd21 100644 --- a/Desktop/UI/AppLoader.js +++ b/Desktop/UI/AppLoader.js @@ -10,12 +10,12 @@ function newAppLoader() { async function loadModules() { try { - let modulesArray = [] - - modulesArray = modulesArray.concat([ + let modulesArray = [ + 'WebDebugLog.js', + 'AppPostLoader.js', 'Globals.js', 'WebApp.js' - ]) + ] functionLibraries() @@ -74,23 +74,6 @@ function newAppLoader() { urlArray.push('Projects' + '/' + project + '/' + 'UI' + '/' + 'Globals' + '/' + fileName) } - modulesArray = modulesArray.concat(urlArray) - spaces() - } - } - - function spaces() { - let url = 'ListSpaceFiles' - httpRequest(undefined, url, onResponse) - - function onResponse(err, fileList) { - let urlArray = [] - let fileArray = JSON.parse(fileList) - for (let i = 0; i < fileArray.length; i++) { - let path = fileArray[i] - urlArray.push('Projects' + '/' + path) - } - modulesArray = modulesArray.concat(urlArray) downloadIncludedFiles() } diff --git a/Desktop/UI/AppPostLoader.js b/Desktop/UI/AppPostLoader.js index 3e962a181..e0040e951 100644 --- a/Desktop/UI/AppPostLoader.js +++ b/Desktop/UI/AppPostLoader.js @@ -9,8 +9,18 @@ function newAppPostLoader() { function start() { try { - webApp = newWebApp() - webApp.initialize() + + setupProjectsSchema() + + function setupProjectsSchema() { + httpRequest(undefined, 'ProjectsSchema', onResponse) + + function onResponse(err, file) { + PROJECTS_SCHEMA = JSON.parse(file) + webApp = newWebApp() + webApp.initialize() + } + } } catch (err) { console.log('[ERROR] err.stack = ' + err.stack) } diff --git a/Desktop/UI/AppPreLoader.js b/Desktop/UI/AppPreLoader.js index a21df4ccb..8897aa49d 100644 --- a/Desktop/UI/AppPreLoader.js +++ b/Desktop/UI/AppPreLoader.js @@ -43,7 +43,7 @@ function httpRequest(pContentToSend, pPath, callBackFunction) { xmlHttpRequest.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { try { - callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE, xmlHttpRequest.responseText) + callBackFunction(undefined, xmlHttpRequest.responseText) } catch(err) { console.log('[ERROR] httpRequest -> httpRequest -> err.stack = '+ err.stack) console.log('[ERROR] httpRequest -> httpRequest -> pContentToSend = '+ pContentToSend) diff --git a/Desktop/UI/WebDebugLog.js b/Desktop/UI/WebDebugLog.js new file mode 100644 index 000000000..2a6bc1af1 --- /dev/null +++ b/Desktop/UI/WebDebugLog.js @@ -0,0 +1,21 @@ +function newWebDebugLog() { + try { + let thisObject = { + write: write, + fileName: 'undefined' + } + + return thisObject + + function write(pText) { + console.log(spacePad(thisObject.fileName, 50) + ' : ' + pText) + + function spacePad(str, max) { + str = str.toString() + return str.length < max ? spacePad(' ' + str, max) : str + } + } + } catch (err) { + console.log(spacePad(MODULE_NAME, 50) + ' : ' + '[ERROR] WebDebugLog --> err = ' + err.stack) + } +} diff --git a/Desktop/WebServer/require.js b/Desktop/UI/require.js similarity index 100% rename from Desktop/WebServer/require.js rename to Desktop/UI/require.js diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html index afeb95d14..793a8c5f3 100644 --- a/Desktop/WebServer/index.html +++ b/Desktop/WebServer/index.html @@ -6,7 +6,7 @@ - + + - + Hello World! -
-
- +
+
+
+ + From bac140cf92ec046e5d614fbbeda6a6e00bcb49e4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 7 Sep 2021 13:05:58 +0200 Subject: [PATCH 05/65] sockets connections and disconnections plus callers ordered arrays. --- Desktop/DesktopApp.js | 7 +- .../Network/NT/Modules/WebSocketsInterface.js | 145 ++++++++++++++---- .../NT/Modules/Social-Graph/SocialGraph.js | 20 +++ 3 files changed, 141 insertions(+), 31 deletions(-) create mode 100644 Projects/Social-Trading/NT/Modules/Social-Graph/SocialGraph.js diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index e04a0ddad..8fa39fafc 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -15,9 +15,10 @@ exports.newDesktopApp = function newDesktopApp() { /* This is the Web Sockets client that interacts with the Superalgos Network. */ - //DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient() - //await DK.webSocketsClient.initialize() - + DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient() + await DK.webSocketsClient.initialize() + return + /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/ //let WEB_SOCKETS_INTERFACE = require('./Client/webSocketsInterface.js') let HTTP_INTERFACE = require('./Client/httpInterface.js') diff --git a/Projects/Network/NT/Modules/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js index 003e6798b..baded6584 100644 --- a/Projects/Network/NT/Modules/WebSocketsInterface.js +++ b/Projects/Network/NT/Modules/WebSocketsInterface.js @@ -1,6 +1,9 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSocketsInterface() { let thisObject = { + networkClients: undefined, + networkPeers: undefined, + callersMap: undefined, initialize: initialize, finalize: finalize } @@ -14,6 +17,10 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock return thisObject function finalize() { + thisObject.networkClients = undefined + thisObject.networkPeers = undefined + callersMap = undefined + socketServer = undefined clientInterface = undefined peerInterface = undefined @@ -26,18 +33,35 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock clientInterface = NT.projects.socialTrading.modules.clientInterface.newSocialTradingModulesClientInterface() peerInterface = NT.projects.socialTrading.modules.peerInterface.newSocialTradingModulesPeerInterface() + thisObject.networkClients = [] + thisObject.networkPeers = [] + thisObject.callersMap = new Map() + setUpWebSocketServer() } function setUpWebSocketServer() { try { - socketServer.on('connection', onConnection) + socketServer.on('connection', onConnectionOpened) + + function onConnectionOpened(socket) + + /* + This function is executed every time a new Websockets connection + is stablished. + */ { + let caller = { + socket: socket, + userProfile: undefined, + role: undefined + } + + caller.socket.id = SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId() + caller.socket.on('close', onConnectionClosed) - function onConnection(socket) { - let caller = {} let calledTimestamp = (new Date()).valueOf() - socket.on('message', onMenssage) + caller.socket.on('message', onMenssage) async function onMenssage(message) { try { @@ -49,7 +73,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'messageHeader Not Coorrect JSON Format.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -60,13 +84,13 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'messageType Not Provided.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } switch (messageHeader.messageType) { case "Handshake": { - handshakeProducedure(socket, caller, calledTimestamp, messageHeader) + handshakeProducedure(caller, calledTimestamp, messageHeader) break } case "Request": { @@ -76,19 +100,19 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'Handshake Not Done Yet.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } switch (caller.role) { case 'Network Client': { let response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile) - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) break } case 'Network Peer': { let response = await peerInterface.messageReceived(messageHeader.payload) - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) break } } @@ -99,7 +123,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'messageType Not Supported.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) break } } @@ -109,7 +133,13 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock } } - function handshakeProducedure(socket, caller, calledTimestamp, messageHeader) { + function onConnectionClosed() { + let socketId = this.id + let caller = thisObject.callersMap.get(socketId) + removeCaller(caller) + } + + function handshakeProducedure(caller, calledTimestamp, messageHeader) { /* The handshage producedure have 2 steps, we need to know now which one we are at. @@ -119,7 +149,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'step Not Provided.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } if (messageHeader.step !== 'One' && messageHeader.step !== 'Two') { @@ -127,7 +157,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'step Not Supported.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } switch (messageHeader.step) { @@ -149,7 +179,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'callerRole Not Provided.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } @@ -158,7 +188,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'callerRole Not Supported.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } @@ -171,7 +201,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'callerProfileHandle Not Provided.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } @@ -184,7 +214,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'callerTimestamp Not Provided.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -195,7 +225,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'callerTimestamp Too Old.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -215,7 +245,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock message: 'Handshake Step One Complete', signature: JSON.stringify(signature) } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) } function handshakeStepTwo() { @@ -227,7 +257,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'Handshake Step One Not Completed.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -238,7 +268,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'signature Not Provided.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } @@ -250,7 +280,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'Bad Signature.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -263,7 +293,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'userProfile Not Found.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -277,7 +307,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'callerProfileHandle Does Not Match witnessUserProfile.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -289,7 +319,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'calledProfileHandle Does Not Match This Network Node Handle.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -300,7 +330,7 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock result: 'Error', message: 'calledTimestamp Does Not Match calledTimestamp On Record.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) return } /* @@ -310,15 +340,74 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock We will remember the user profile behind this caller. */ caller.userProfile = witnessUserProfile + /* + We will remember the caller itself. + */ + addCaller(caller) let response = { result: 'Ok', message: 'Handshake Successful.' } - socket.send(JSON.stringify(response)) + caller.socket.send(JSON.stringify(response)) } } + function addCaller(caller) { + + thisObject.callersMap.set(caller.socket.id, caller) + + switch (caller.role) { + case 'Network Client': { + addToArray(thisObject.networkClients, caller) + break + } + case 'Network Peer': { + addToArray(thisObject.networkPeers, caller) + break + } + } + + function addToArray(callersArray, caller) { + /* + We will add the caller to the existing array, first the ones with highest ranking. + */ + for (let i = 0; i < callersArray.length; i++) { + let callerInArray = callersArray[i] + if (caller.userProfile.ranking > callerInArray.userProfile.ranking) { + callersArray.splice(i, 0, caller) + return + } + } + callersArray.push(caller) + } + } + + function removeCaller(caller) { + + thisObject.callersMap.delete(caller.socket.id) + + switch (caller.role) { + case 'Network Client': { + removeFromArray(thisObject.networkClients, caller) + break + } + case 'Network Peer': { + removeFromArray(thisObject.networkPeers, caller) + break + } + } + + function removeFromArray(callersArray, caller) { + for (let i = 0; i < callersArray.length; i++) { + let callerInArray = callersArray[i] + if (caller.socket.id === callerInArray.socket.id) { + callersArray.splice(i, 1) + return + } + } + } + } } catch (err) { console.log('[ERROR] Web Sockets Interface -> setUpWebSocketServer -> err.stack = ' + err.stack) } diff --git a/Projects/Social-Trading/NT/Modules/Social-Graph/SocialGraph.js b/Projects/Social-Trading/NT/Modules/Social-Graph/SocialGraph.js new file mode 100644 index 000000000..864add3cd --- /dev/null +++ b/Projects/Social-Trading/NT/Modules/Social-Graph/SocialGraph.js @@ -0,0 +1,20 @@ +exports.newSocialTradingModulesSocialGraph = function newSocialTradingModulesSocialGraph() { + /* + This object represent the entire Social Graph. + */ + let thisObject = { + + initialize: initialize, + finalize: finalize + } + + return thisObject + + function finalize() { + + } + + function initialize() { + + } +} \ No newline at end of file From 4e92ff174074a507179a71af54d20d8e17550196 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 7 Sep 2021 16:57:48 +0200 Subject: [PATCH 06/65] Event Broadcasting --- .../Network/NT/Modules/WebSocketsInterface.js | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/Projects/Network/NT/Modules/WebSocketsInterface.js b/Projects/Network/NT/Modules/WebSocketsInterface.js index baded6584..6a48a8a8a 100644 --- a/Projects/Network/NT/Modules/WebSocketsInterface.js +++ b/Projects/Network/NT/Modules/WebSocketsInterface.js @@ -104,18 +104,23 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock return } + let response switch (caller.role) { case 'Network Client': { - let response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile) + response = await clientInterface.messageReceived(messageHeader.payload, caller.userProfile) caller.socket.send(JSON.stringify(response)) break } case 'Network Peer': { - let response = await peerInterface.messageReceived(messageHeader.payload) + response = await peerInterface.messageReceived(messageHeader.payload) caller.socket.send(JSON.stringify(response)) break } } + if (response.result === 'Ok' && messageHeader.payload.requestType === 'Event') { + broadcastToPeers(messageHeader, caller) + broadcastToClients(messageHeader, caller) + } break } default: { @@ -408,6 +413,31 @@ exports.newNetworkModulesWebSocketsInterface = function newNetworkModulesWebSock } } } + + function broadcastToPeers(messageHeader, caller) { + let callerIdToAVoid + if (caller.role === 'Network Peer') { + callerIdToAVoid = caller.socket.id + } + for (let i = 0; i < thisObject.networkPeers.length; i++) { + let networkPeer = thisObject.networkPeers[i] + if (networkPeer.socket.id === callerIdToAVoid) { continue } + networkPeer.socket.send(messageHeader) + } + } + + function broadcastToClients(messageHeader, caller) { + let callerIdToAVoid + if (caller.role === 'Network Client') { + callerIdToAVoid = caller.socket.id + } + for (let i = 0; i < thisObject.networkClients.length; i++) { + let networkClient = thisObject.networkClients[i] + if (networkClient.socket.id === callerIdToAVoid) { continue } + networkClient.socket.send(messageHeader) + } + } + } catch (err) { console.log('[ERROR] Web Sockets Interface -> setUpWebSocketServer -> err.stack = ' + err.stack) } From cff738248b6d2acfba859a0d489585f2d2c04685 Mon Sep 17 00:00:00 2001 From: quantum8 Date: Wed, 8 Sep 2021 10:36:48 +1000 Subject: [PATCH 07/65] Spelling fix Minor spelling fix for the deprecated message text. --- run.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run.js b/run.js index 0c9c4b52f..358ad1df9 100644 --- a/run.js +++ b/run.js @@ -2,6 +2,6 @@ console.log('Superalgos is growing! In addition to the Platform for algo-traders console.log('') console.log('For that reason, the "node run" command has been deprecated. Please, use one of these instead:') console.log('') -console.log('node platform --------------- Runs the Superalgos Platform for algo-tarders.') +console.log('node platform --------------- Runs the Superalgos Platform for algo-traders.') console.log('node network --------------- Runs the P2P Network for social trading.') -console.log('node desktop --------------- Runs the Desktop App for crypto users.') \ No newline at end of file +console.log('node desktop --------------- Runs the Desktop App for crypto users.') From 7f0bb521d42676a19bbd3ebe94eb78eae68203e3 Mon Sep 17 00:00:00 2001 From: quantum8 Date: Wed, 8 Sep 2021 11:01:29 +1000 Subject: [PATCH 08/65] Spelling fix Fix typo --- ...torial-029-tutorial-step-user-profile-=-referral-code.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json index 63bfe7cc0..d37166f7a 100644 --- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json +++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-029-tutorial-step-user-profile-=-referral-code.json @@ -23,7 +23,7 @@ }, { "style": "List", - "text": "The Superalgos.org Webiste: Julian-Molina", + "text": "The Superalgos.org Website: Julian-Molina", "updated": 1630927577105 }, { @@ -44,4 +44,4 @@ "text": "Official Social Media Posts: Julian-Molina" } ] -} \ No newline at end of file +} From 591053ef40cdce7461070bd822eba4c76e4502f1 Mon Sep 17 00:00:00 2001 From: quantum8 Date: Wed, 8 Sep 2021 11:08:53 +1000 Subject: [PATCH 09/65] Update creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json Spelling fix --- ...le-tutorial-033-tutorial-step-token-power-requirement.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json index 03c883f2d..8584e102f 100644 --- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json +++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-033-tutorial-step-token-power-requirement.json @@ -59,7 +59,7 @@ }, { "style": "List", - "text": "By default, Token Power flows in equal amounts to all offspring nodes! You may change this tough!", + "text": "By default, Token Power flows in equal amounts to all offspring nodes! You may change this though!", "updated": 1630684072593, "translations": [ { @@ -71,4 +71,4 @@ ] } ] -} \ No newline at end of file +} From 6f8d223142959c7590da62e3e614ba334eca53c8 Mon Sep 17 00:00:00 2001 From: jacob Date: Wed, 8 Sep 2021 11:22:35 +1000 Subject: [PATCH 10/65] User Profile quantum8 --- .../Plugins/User-Profiles/quantum8.json | 496 ++++++++++++++++++ 1 file changed, 496 insertions(+) create mode 100644 Projects/Governance/Plugins/User-Profiles/quantum8.json diff --git a/Projects/Governance/Plugins/User-Profiles/quantum8.json b/Projects/Governance/Plugins/User-Profiles/quantum8.json new file mode 100644 index 000000000..ecfa793bc --- /dev/null +++ b/Projects/Governance/Plugins/User-Profiles/quantum8.json @@ -0,0 +1,496 @@ +{ + "type": "User Profile", + "name": "quantum8", + "config": "{\n \"signature\": {\n \"message\": \"quantum8\",\n \"messageHash\": \"0x9eb09f3e33aa12ba004cec8f8b825ea0960c0bb2571c93c20e447e56be0f76a3\",\n \"v\": \"0x1b\",\n \"r\": \"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f\",\n \"s\": \"0x79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca2\",\n \"signature\": \"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca21b\"\n }\n}", + "project": "Governance", + "tokenPowerSwitch": { + "type": "Token Power Switch", + "name": "New Token Power Switch", + "config": "{}", + "project": "Governance", + "tokenPowerSwitch": [], + "onboardingPrograms": { + "type": "Onboarding Programs", + "name": "New Onboarding Programs", + "config": "{\n \"percentage\": 0\n}", + "project": "Governance", + "airdropProgram": { + "type": "Airdrop Program", + "name": "New Airdrop Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "6565417c-961c-44a8-806b-75464582451b", + "savedPayload": { + "position": { + "x": 13994.807621135331, + "y": 24013.134757729335 + }, + "targetPosition": { + "x": 13844.807621135331, + "y": 24272.942378864667 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3a1f75fa-aa2c-4460-b986-b03e67cdc45f", + "savedPayload": { + "position": { + "x": 13844.807621135331, + "y": 24272.942378864667 + }, + "targetPosition": { + "x": 13694.807621135331, + "y": 24532.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "githubProgram": { + "type": "Github Program", + "name": "New Github Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "f757ff52-6168-495f-81d4-0c60ead02ff5", + "savedPayload": { + "position": { + "x": 14294.807621135331, + "y": 24532.75 + }, + "targetPosition": { + "x": 13994.807621135331, + "y": 24532.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "bc18c9e2-3142-4e2a-9724-a190f79d88dd", + "savedPayload": { + "position": { + "x": 13994.807621135331, + "y": 24532.75 + }, + "targetPosition": { + "x": 13694.807621135331, + "y": 24532.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "5a1c7d96-3077-4ea6-9300-36ccd234290b", + "savedPayload": { + "position": { + "x": 13694.807621135331, + "y": 24532.75 + }, + "targetPosition": { + "x": 13435, + "y": 24682.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "communityBuildingPrograms": { + "type": "Community Building Programs", + "name": "New Community Building Programs", + "config": "{}", + "project": "Governance", + "referralProgram": { + "type": "Referral Program", + "name": "New Referral Program", + "config": "{\n \"percentage\": 10\n}", + "project": "Governance", + "userReferrers": [ + { + "type": "User Referrer", + "name": "Luis-Fernando-Molina", + "config": "{}", + "project": "Governance", + "id": "31721402-7e62-4d72-9037-d2535567c941", + "savedPayload": { + "position": { + "x": 14206.939655491295, + "y": 24620.617965644036 + }, + "targetPosition": { + "x": 13994.807621135331, + "y": 24832.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Luis-Fernando-Molina", + "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "ca9e4046-d3f3-4bd9-85a2-852c67a8c4f8", + "savedPayload": { + "position": { + "x": 14294.807621135331, + "y": 24832.75 + }, + "targetPosition": { + "x": 13994.807621135331, + "y": 24832.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "ed5ec5af-a544-4ad2-b7f8-72228e814c20", + "savedPayload": { + "position": { + "x": 14206.939655491295, + "y": 25044.882034355964 + }, + "targetPosition": { + "x": 13994.807621135331, + "y": 24832.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3648a9b1-b3bc-4348-b940-1b868ea884d3", + "savedPayload": { + "position": { + "x": 13994.807621135331, + "y": 24832.75 + }, + "targetPosition": { + "x": 13694.807621135331, + "y": 24832.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "supportProgram": { + "type": "Support Program", + "name": "New Support Program", + "config": "{}", + "project": "Governance", + "userSupporters": [ + { + "type": "User Supporter", + "name": "Julian-Molina", + "config": "{}", + "project": "Governance", + "id": "013d635e-71ae-4376-86a7-97eaa6a788b5", + "savedPayload": { + "position": { + "x": 14134.585369022052, + "y": 25170.20333466609 + }, + "targetPosition": { + "x": 13844.807621135331, + "y": 25092.557621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Julian-Molina", + "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11" + }, + "referenceParentCombinedNodePath": [ + [ + "Julian-Molina", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "c9a059b6-8a82-4961-9c9e-54aa37ffcf08", + "savedPayload": { + "position": { + "x": 13994.807621135331, + "y": 25352.365242270665 + }, + "targetPosition": { + "x": 13844.807621135331, + "y": 25092.557621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "b17ecb03-af59-4504-83cd-a92c2ac3a0e5", + "savedPayload": { + "position": { + "x": 13767.161907604575, + "y": 25382.335369022054 + }, + "targetPosition": { + "x": 13844.807621135331, + "y": 25092.557621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "8c881a99-9bbc-4854-b849-f9a7d5ef1016", + "savedPayload": { + "position": { + "x": 13844.807621135331, + "y": 25092.557621135333 + }, + "targetPosition": { + "x": 13694.807621135331, + "y": 24832.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3fb1d37b-4db8-438a-a198-cdd2e27d4cc1", + "savedPayload": { + "position": { + "x": 13694.807621135331, + "y": 24832.75 + }, + "targetPosition": { + "x": 13435, + "y": 24682.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "9af8e675-0256-4b47-bb58-ebe914eb16a3", + "savedPayload": { + "position": { + "x": 13435, + "y": 24682.75 + }, + "targetPosition": { + "x": 13135, + "y": 24682.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "7b9b1c90-9101-4b09-bffd-1e5f46cee2c8", + "savedPayload": { + "position": { + "x": 12835, + "y": 24682.75 + }, + "targetPosition": { + "x": 13135, + "y": 24682.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "f2ba562b-9032-4fb4-8b97-0b58d8542905", + "savedPayload": { + "position": { + "x": 13135, + "y": 24682.75 + }, + "targetPosition": { + "x": 13135, + "y": 24682.75 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From e9ea83228102a77c8f7393c9820a405763e90478 Mon Sep 17 00:00:00 2001 From: jacob Date: Wed, 8 Sep 2021 11:38:13 +1000 Subject: [PATCH 11/65] User Profile quantum8 --- .../Plugins/User-Profiles/quantum8.json | 187 +++++++++++------- 1 file changed, 115 insertions(+), 72 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/quantum8.json b/Projects/Governance/Plugins/User-Profiles/quantum8.json index ecfa793bc..746cc1265 100644 --- a/Projects/Governance/Plugins/User-Profiles/quantum8.json +++ b/Projects/Governance/Plugins/User-Profiles/quantum8.json @@ -1,7 +1,7 @@ { "type": "User Profile", "name": "quantum8", - "config": "{\n \"signature\": {\n \"message\": \"quantum8\",\n \"messageHash\": \"0x9eb09f3e33aa12ba004cec8f8b825ea0960c0bb2571c93c20e447e56be0f76a3\",\n \"v\": \"0x1b\",\n \"r\": \"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f\",\n \"s\": \"0x79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca2\",\n \"signature\": \"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca21b\"\n }\n}", + "config": "{\"signature\":{\"message\":\"quantum8\",\"messageHash\":\"0x9eb09f3e33aa12ba004cec8f8b825ea0960c0bb2571c93c20e447e56be0f76a3\",\"v\":\"0x1b\",\"r\":\"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f\",\"s\":\"0x79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca2\",\"signature\":\"0x0c2960da1cec24bc9a59f83a4cfaff7fbc39199c7394698aa58bda25cc2f049f79ac843019064f1830b0466712f62aa3dcf78f550aee958ac6124fd8fde19ca21b\"},\"codeName\":\"quantum8\"}", "project": "Governance", "tokenPowerSwitch": { "type": "Token Power Switch", @@ -26,12 +26,12 @@ "id": "6565417c-961c-44a8-806b-75464582451b", "savedPayload": { "position": { - "x": 13994.807621135331, - "y": 24013.134757729335 + "x": 28132.5348938626, + "y": 20581.384757729335 }, "targetPosition": { - "x": 13844.807621135331, - "y": 24272.942378864667 + "x": 27982.5348938626, + "y": 20841.192378864667 }, "floatingObject": { "isPinned": false, @@ -49,12 +49,12 @@ "id": "3a1f75fa-aa2c-4460-b986-b03e67cdc45f", "savedPayload": { "position": { - "x": 13844.807621135331, - "y": 24272.942378864667 + "x": 27982.5348938626, + "y": 20841.192378864667 }, "targetPosition": { - "x": 13694.807621135331, - "y": 24532.75 + "x": 27832.5348938626, + "y": 21101 }, "floatingObject": { "isPinned": false, @@ -81,12 +81,12 @@ "id": "f757ff52-6168-495f-81d4-0c60ead02ff5", "savedPayload": { "position": { - "x": 14294.807621135331, - "y": 24532.75 + "x": 28432.5348938626, + "y": 21101 }, "targetPosition": { - "x": 13994.807621135331, - "y": 24532.75 + "x": 28132.5348938626, + "y": 21101 }, "floatingObject": { "isPinned": false, @@ -104,12 +104,12 @@ "id": "bc18c9e2-3142-4e2a-9724-a190f79d88dd", "savedPayload": { "position": { - "x": 13994.807621135331, - "y": 24532.75 + "x": 28132.5348938626, + "y": 21101 }, "targetPosition": { - "x": 13694.807621135331, - "y": 24532.75 + "x": 27832.5348938626, + "y": 21101 }, "floatingObject": { "isPinned": false, @@ -127,12 +127,12 @@ "id": "5a1c7d96-3077-4ea6-9300-36ccd234290b", "savedPayload": { "position": { - "x": 13694.807621135331, - "y": 24532.75 + "x": 27832.5348938626, + "y": 21101 }, "targetPosition": { - "x": 13435, - "y": 24682.75 + "x": 27572.72727272727, + "y": 21251 }, "floatingObject": { "isPinned": false, @@ -166,12 +166,12 @@ "id": "31721402-7e62-4d72-9037-d2535567c941", "savedPayload": { "position": { - "x": 14206.939655491295, - "y": 24620.617965644036 + "x": 28344.666928218565, + "y": 21188.867965644036 }, "targetPosition": { - "x": 13994.807621135331, - "y": 24832.75 + "x": 28132.5348938626, + "y": 21401 }, "floatingObject": { "isPinned": false, @@ -192,7 +192,9 @@ "referenceParentCombinedNodePath": [ [ "Luis-Fernando-Molina", - "User Profile" + "User Profile", + "Governance", + "a8de78f0-c3e4-4a2a-b7e8-f659073969db" ] ] } @@ -205,12 +207,12 @@ "id": "ca9e4046-d3f3-4bd9-85a2-852c67a8c4f8", "savedPayload": { "position": { - "x": 14294.807621135331, - "y": 24832.75 + "x": 28432.5348938626, + "y": 21401 }, "targetPosition": { - "x": 13994.807621135331, - "y": 24832.75 + "x": 28132.5348938626, + "y": 21401 }, "floatingObject": { "isPinned": false, @@ -232,12 +234,12 @@ "id": "ed5ec5af-a544-4ad2-b7f8-72228e814c20", "savedPayload": { "position": { - "x": 14206.939655491295, - "y": 25044.882034355964 + "x": 28344.666928218565, + "y": 21613.132034355964 }, "targetPosition": { - "x": 13994.807621135331, - "y": 24832.75 + "x": 28132.5348938626, + "y": 21401 }, "floatingObject": { "isPinned": false, @@ -255,12 +257,12 @@ "id": "3648a9b1-b3bc-4348-b940-1b868ea884d3", "savedPayload": { "position": { - "x": 13994.807621135331, - "y": 24832.75 + "x": 28132.5348938626, + "y": 21401 }, "targetPosition": { - "x": 13694.807621135331, - "y": 24832.75 + "x": 27832.5348938626, + "y": 21401 }, "floatingObject": { "isPinned": false, @@ -278,7 +280,7 @@ "supportProgram": { "type": "Support Program", "name": "New Support Program", - "config": "{}", + "config": "{\n \"percentage\": 10\n}", "project": "Governance", "userSupporters": [ { @@ -289,12 +291,12 @@ "id": "013d635e-71ae-4376-86a7-97eaa6a788b5", "savedPayload": { "position": { - "x": 14134.585369022052, - "y": 25170.20333466609 + "x": 28280.891462473082, + "y": 21692.16616011563 }, "targetPosition": { - "x": 13844.807621135331, - "y": 25092.557621135333 + "x": 27982.5348938626, + "y": 21660.807621135333 }, "floatingObject": { "isPinned": false, @@ -315,6 +317,47 @@ "referenceParentCombinedNodePath": [ [ "Julian-Molina", + "User Profile", + "Governance", + "1fd95e41-4b22-48d5-be3a-904c37afcb11" + ] + ] + } + }, + { + "type": "User Supporter", + "name": "harrellbm", + "config": "{}", + "project": "Governance", + "id": "d96cd4df-2cda-4ff8-a54d-5d81b1fabca7", + "savedPayload": { + "position": { + "x": 28205.47834150582, + "y": 21861.54680304299 + }, + "targetPosition": { + "x": 27982.5348938626, + "y": 21660.807621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "harrellbm", + "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740" + }, + "referenceParentCombinedNodePath": [ + [ + "harrellbm", "User Profile" ] ] @@ -328,12 +371,12 @@ "id": "c9a059b6-8a82-4961-9c9e-54aa37ffcf08", "savedPayload": { "position": { - "x": 13994.807621135331, - "y": 25352.365242270665 + "x": 28044.90840110793, + "y": 21954.251901355474 }, "targetPosition": { - "x": 13844.807621135331, - "y": 25092.557621135333 + "x": 27982.5348938626, + "y": 21660.807621135333 }, "floatingObject": { "isPinned": false, @@ -355,12 +398,12 @@ "id": "b17ecb03-af59-4504-83cd-a92c2ac3a0e5", "savedPayload": { "position": { - "x": 13767.161907604575, - "y": 25382.335369022054 + "x": 27860.513900939863, + "y": 21934.871258428113 }, "targetPosition": { - "x": 13844.807621135331, - "y": 25092.557621135333 + "x": 27982.5348938626, + "y": 21660.807621135333 }, "floatingObject": { "isPinned": false, @@ -378,12 +421,12 @@ "id": "8c881a99-9bbc-4854-b849-f9a7d5ef1016", "savedPayload": { "position": { - "x": 13844.807621135331, - "y": 25092.557621135333 + "x": 27982.5348938626, + "y": 21660.807621135333 }, "targetPosition": { - "x": 13694.807621135331, - "y": 24832.75 + "x": 27832.5348938626, + "y": 21401 }, "floatingObject": { "isPinned": false, @@ -401,17 +444,17 @@ "id": "3fb1d37b-4db8-438a-a198-cdd2e27d4cc1", "savedPayload": { "position": { - "x": 13694.807621135331, - "y": 24832.75 + "x": 27832.5348938626, + "y": 21401 }, "targetPosition": { - "x": 13435, - "y": 24682.75 + "x": 27572.72727272727, + "y": 21251 }, "floatingObject": { "isPinned": false, "isFrozen": false, - "isCollapsed": true, + "isCollapsed": false, "angleToParent": 2, "distanceToParent": 3, "arrangementStyle": 0 @@ -424,12 +467,12 @@ "id": "9af8e675-0256-4b47-bb58-ebe914eb16a3", "savedPayload": { "position": { - "x": 13435, - "y": 24682.75 + "x": 27572.72727272727, + "y": 21251 }, "targetPosition": { - "x": 13135, - "y": 24682.75 + "x": 27272.72727272727, + "y": 21251 }, "floatingObject": { "isPinned": false, @@ -451,12 +494,12 @@ "id": "7b9b1c90-9101-4b09-bffd-1e5f46cee2c8", "savedPayload": { "position": { - "x": 12835, - "y": 24682.75 + "x": 26972.72727272727, + "y": 21251 }, "targetPosition": { - "x": 13135, - "y": 24682.75 + "x": 27272.72727272727, + "y": 21251 }, "floatingObject": { "isPinned": false, @@ -474,12 +517,12 @@ "id": "f2ba562b-9032-4fb4-8b97-0b58d8542905", "savedPayload": { "position": { - "x": 13135, - "y": 24682.75 + "x": 27272.72727272727, + "y": 21251 }, "targetPosition": { - "x": 13135, - "y": 24682.75 + "x": 27272.72727272727, + "y": 21251 }, "floatingObject": { "isPinned": false, From 020e01237a2d749df1f811497c8a45b328554add Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 8 Sep 2021 11:03:43 +0200 Subject: [PATCH 12/65] html layout --- Desktop/DesktopApp.js | 10 +- Desktop/WebServer/css/main.css | 135 +++++++++++++++++- Desktop/WebServer/index.html | 71 ++++++++- .../TradingSimulation.js | 3 +- 4 files changed, 202 insertions(+), 17 deletions(-) diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index 8fa39fafc..e05811c30 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -15,10 +15,11 @@ exports.newDesktopApp = function newDesktopApp() { /* This is the Web Sockets client that interacts with the Superalgos Network. */ - DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient() - await DK.webSocketsClient.initialize() - return - + /* + DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient() + await DK.webSocketsClient.initialize() + */ + /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/ //let WEB_SOCKETS_INTERFACE = require('./Client/webSocketsInterface.js') let HTTP_INTERFACE = require('./Client/httpInterface.js') @@ -35,7 +36,6 @@ exports.newDesktopApp = function newDesktopApp() { return - let queryMessage let query /* diff --git a/Desktop/WebServer/css/main.css b/Desktop/WebServer/css/main.css index 5e3eedde8..fe419c965 100644 --- a/Desktop/WebServer/css/main.css +++ b/Desktop/WebServer/css/main.css @@ -22,13 +22,134 @@ font-style: normal; } - kbd { - padding: 2px 8px; - font-size: 125%; - font-weight: 500; + .page-table { + position:fixed; + top:0px; + left:18%; + width: 64%; + height: 100%; + color: #000; + background-color: #ffffff; + border-width: 1px; + } + + .left-column { + position:relative; + top:0px; + width: 20%; + height: 100%; + color: #000; + border-width: 1px; + } + + .middle-column { + position:relative; + top:0px; + width: 50%; + height: 100%; + color: #000; + border-width: 1px; + } + + .right-column { + position:relative; + top:0px; + left:0px; + width: 30%; + height: 100%; + color: #000; + border-width: 1px; + } + + .left-table { + position:relative; + width: 100%; + height: 100%; + color: #000; + border-width: 1px; + } + + .logo-cell { + vertical-align: top; + width: 100%; + height: 70px; + color: #000; + border-width: 1px; + } + + .menu-cell { + vertical-align: top; + width: 100%; + color: #000; + border-width: 1px; + } + + .profile-cell { + vertical-align: bottom; + width: 100%; + height: 50px; + color: #000; + border-width: 1px; + } + + .middle-table { + position:relative; + width: 100%; + height: 100%; + color: #000; + border-width: 1px; + } + + .content-title-cell { + vertical-align: top; + width: 100%; + height: 50px; + color: #000; + border-width: 1px; + } + + .content-cell { + vertical-align: top; + width: 100%; + color: #000; + border-width: 1px; + } + + .right-table { + position:relative; + width: 100%; + height: 100%; + color: #000; + border-width: 1px; + } + + .search-cell { + vertical-align: top; + width: 100%; + height: 50px; + color: #000; + border-width: 1px; + } + + .context-cell { + vertical-align: top; + width: 100%; + color: #000; + border-width: 1px; + } + + .menu-table { + position:relative; + width: 100%; + height: 65%; + color: #000; + border-width: 1px; + } + + .menu-item-cell { + vertical-align: top; + width: 100%; + height: 50px; color: #000; - background-color: #bcd643; - border-radius: 5px; - border-style: outset; border-width: 1px; } \ No newline at end of file diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html index 362ffc495..6d6572c60 100644 --- a/Desktop/WebServer/index.html +++ b/Desktop/WebServer/index.html @@ -42,11 +42,74 @@ Hello World! -
-
-
- + + + + + + +
+ + + + + + + + + + +
LOGO
PROFILE
+
+ + + + + + + +
CONTENT TITLE
CONTENT
+
+ + + + + + + +
SEARCH
CONTEXT
+
diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js index 0be553078..3e8d114ae 100644 --- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js +++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js @@ -88,7 +88,8 @@ exports.newFoundationsBotModulesTradingSimulation = function (processIndex) { This will happen when the sessionParameters.timeRange.config.initialDatetime is beyond the last candle available, meaning that the dataSet needs to be updated with more up-to-date data. */ - TS.projects.foundations.functionLibraries.sessionFunctions.stopSession(processIndex, 'Data is not up-to-date enough. Please start the Masters Data Mining Operation.') + console.log('DEBUGGING ..................', initialCandle, candles.length) + TS.projects.foundations.functionLibraries.sessionFunctions.stopSession(processIndex, 'Data is not up-to-date enough. Please start the Data Mining Operation.') TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[IMPORTANT] runSimulation -> Data is not up-to-date enough. Stopping the Session now. ') return From c01c9bbca629e479ae0f92fb9ec77b23a369722a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 8 Sep 2021 13:48:48 +0200 Subject: [PATCH 13/65] who to follow --- Desktop/WebServer/css/main.css | 123 ++++++++++++++++++++++++++++----- Desktop/WebServer/index.html | 40 +++++++++-- 2 files changed, 141 insertions(+), 22 deletions(-) diff --git a/Desktop/WebServer/css/main.css b/Desktop/WebServer/css/main.css index fe419c965..a44c65f3f 100644 --- a/Desktop/WebServer/css/main.css +++ b/Desktop/WebServer/css/main.css @@ -22,15 +22,57 @@ font-style: normal; } + .scroll-div { + position:absolute; + overflow-y: scroll; + overflow-x: hidden; + top:0px; + left:0px; + vertical-align: top; + height: 100%; + width: 100%; + color: #000; + border-color: blue; + background-color: #ffffff; + border-width: 0px; + } + + .content-div { + position:relative; + vertical-align: top; + height: 100%; + width: 30%; + left: 31.2%; + color: #000; + border-color: blue; + background-color: transparent; + border-width: 0px; + } + + .post-div { + vertical-align: top; + height: 300px; + width: 100%; + color: #000; + border-color: blue; + background-color: transparent; + border-width: 0px; + } + .page-table { + pointer-events: none; position:fixed; + position: absolute; top:0px; left:18%; width: 64%; height: 100%; + padding: 0; + margin: 0; color: #000; - background-color: #ffffff; - border-width: 1px; + background:transparent; + border-width: 0px; + border-collapse: collapse; } .left-column { @@ -38,8 +80,10 @@ top:0px; width: 20%; height: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .middle-column { @@ -47,8 +91,10 @@ top:0px; width: 50%; height: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .right-column { @@ -57,99 +103,142 @@ left:0px; width: 30%; height: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .left-table { position:relative; width: 100%; height: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; + border-collapse: collapse; } .logo-cell { vertical-align: top; width: 100%; height: 70px; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .menu-cell { vertical-align: top; width: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .profile-cell { vertical-align: bottom; width: 100%; height: 50px; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .middle-table { position:relative; width: 100%; height: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; + border-collapse: collapse; } .content-title-cell { vertical-align: top; width: 100%; height: 50px; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; + background-color: #ffffff; } .content-cell { vertical-align: top; width: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .right-table { position:relative; width: 100%; height: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; + border-collapse: collapse; } .search-cell { vertical-align: top; width: 100%; height: 50px; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; } .context-cell { vertical-align: top; width: 100%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; + background:transparent; } .menu-table { position:relative; width: 100%; height: 65%; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; + border-collapse: collapse; } .menu-item-cell { vertical-align: top; width: 100%; height: 50px; + padding: 0; + margin: 0; color: #000; - border-width: 1px; + border-width: 0px; + } + + .who-to-follow-table { + position:relative; + width: 100%; + height: 30%; + padding: 0; + margin: 0; + color: #000; + border-width: 0px; + border-collapse: collapse; } \ No newline at end of file diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html index 6d6572c60..30b874280 100644 --- a/Desktop/WebServer/index.html +++ b/Desktop/WebServer/index.html @@ -41,9 +41,26 @@ - Hello World! - - +
+
+
+ POST 1 +
+
+ POST 2 +
+
+ POST 3 +
+
+ POST 4 +
+
+ POST 5 +
+
+
+
@@ -104,7 +122,19 @@ - +
@@ -94,7 +111,8 @@ - +
CONTENT TITLE
CONTENT +
SEARCH
CONTEXT + + + + + + + + + + +
+
From 44332a13de04406037d8f41e78d72145591b26d3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Wed, 8 Sep 2021 14:14:27 +0200 Subject: [PATCH 14/65] Initializing the Web App --- Desktop/DesktopApp.js | 6 +- Desktop/UI/WebApp.js | 172 ++++++++++++++---- Desktop/UI/{AppLoader.js => WebAppLoader.js} | 6 +- .../{AppPostLoader.js => WebAppPostLoader.js} | 2 +- .../{AppPreLoader.js => WebAppPreLoader.js} | 4 +- Desktop/WebServer/index.html | 6 +- 6 files changed, 144 insertions(+), 52 deletions(-) rename Desktop/UI/{AppLoader.js => WebAppLoader.js} (96%) rename Desktop/UI/{AppPostLoader.js => WebAppPostLoader.js} (94%) rename Desktop/UI/{AppPreLoader.js => WebAppPreLoader.js} (97%) diff --git a/Desktop/DesktopApp.js b/Desktop/DesktopApp.js index e05811c30..300baff29 100644 --- a/Desktop/DesktopApp.js +++ b/Desktop/DesktopApp.js @@ -15,10 +15,8 @@ exports.newDesktopApp = function newDesktopApp() { /* This is the Web Sockets client that interacts with the Superalgos Network. */ - /* - DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient() - await DK.webSocketsClient.initialize() - */ + DK.webSocketsClient = SA.projects.network.modules.webSocketsClient.newNetworkModulesWebSocketsClient() + await DK.webSocketsClient.initialize() /* These are the Network Interfaces by which the UI interacts with the Desktop App.*/ //let WEB_SOCKETS_INTERFACE = require('./Client/webSocketsInterface.js') diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index 2a6f3a66a..449764ac2 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -13,51 +13,145 @@ function newWebApp() { function initialize() { try { - /* - Here we will setup the UI object, with all the - projects and spaces. - */ - for (let i = 0; i < PROJECTS_SCHEMA.length; i++) { - let projectDefinition = PROJECTS_SCHEMA[i] - UI.projects[projectDefinition.propertyName] = {} - let projectInstance = UI.projects[projectDefinition.propertyName] - - projectInstance.utilities = {} - projectInstance.globals = {} - projectInstance.functionLibraries = {} + setupRootObject() + //setupHomePage() + } catch (err) { + console.log('[ERROR] initialize -> err.stack = ' + err.stack) + } + } + + function setupRootObject() { + /* + Here we will setup the UI object, with all the + projects and spaces. + */ + for (let i = 0; i < PROJECTS_SCHEMA.length; i++) { + let projectDefinition = PROJECTS_SCHEMA[i] + UI.projects[projectDefinition.propertyName] = {} + let projectInstance = UI.projects[projectDefinition.propertyName] + + projectInstance.utilities = {} + projectInstance.globals = {} + projectInstance.functionLibraries = {} - if (projectDefinition.UI === undefined) { continue } + if (projectDefinition.UI === undefined) { continue } - /* Set up Globals of this Project */ - if (projectDefinition.UI.globals !== undefined) { - for (let j = 0; j < projectDefinition.UI.globals.length; j++) { - let globalDefinition = projectDefinition.UI.globals[j] + /* Set up Globals of this Project */ + if (projectDefinition.UI.globals !== undefined) { + for (let j = 0; j < projectDefinition.UI.globals.length; j++) { + let globalDefinition = projectDefinition.UI.globals[j] - projectInstance.globals[globalDefinition.propertyName] = eval(globalDefinition.functionName + '()') - } - } - - /* Set up Utilities of this Project */ - if (projectDefinition.UI.utilities !== undefined) { - for (let j = 0; j < projectDefinition.UI.utilities.length; j++) { - let utilityDefinition = projectDefinition.UI.utilities[j] - - projectInstance.utilities[utilityDefinition.propertyName] = eval(utilityDefinition.functionName + '()') - } - } - - /* Set up Function Libraries of this Project */ - if (projectDefinition.UI.functionLibraries !== undefined) { - for (let j = 0; j < projectDefinition.UI.functionLibraries.length; j++) { - let functionLibraryDefinition = projectDefinition.UI.functionLibraries[j] - - projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = eval(functionLibraryDefinition.functionName + '()') - } + projectInstance.globals[globalDefinition.propertyName] = eval(globalDefinition.functionName + '()') } } - } catch (err) { - console.log('[ERROR] initialize -> err.stack = ' + err.stack) + + /* Set up Utilities of this Project */ + if (projectDefinition.UI.utilities !== undefined) { + for (let j = 0; j < projectDefinition.UI.utilities.length; j++) { + let utilityDefinition = projectDefinition.UI.utilities[j] + + projectInstance.utilities[utilityDefinition.propertyName] = eval(utilityDefinition.functionName + '()') + } + } + + /* Set up Function Libraries of this Project */ + if (projectDefinition.UI.functionLibraries !== undefined) { + for (let j = 0; j < projectDefinition.UI.functionLibraries.length; j++) { + let functionLibraryDefinition = projectDefinition.UI.functionLibraries[j] + + projectInstance.functionLibraries[functionLibraryDefinition.propertyName] = eval(functionLibraryDefinition.functionName + '()') + } + } + } + } + + async function setupHomePage() { + let queryMessage + let query + /* + Test Query User Profiles. + */ + queryMessage = { + queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILES, + emitterUserProfileId: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID, + initialIndex: 'Last', + amountRequested: 10, + direction: 'Past' + } + + query = { + requestType: 'Query', + queryMessage: JSON.stringify(queryMessage) + } + + await DK.webSocketsClient.sendMessage( + JSON.stringify(query) + ) + .then(showProfiles) + .catch(onError) + + async function showProfiles(profiles) { + console.log(profiles) + + for (let i = 0; i < profiles.length; i++) { + let profile = profiles[i] + + /* + Test Following Profiles. + */ + let eventMessage = { + eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), + eventType: SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE, + emitterUserProfileId: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID, + targetUserProfileId: profile.userProfileId + } + + let event = { + requestType: 'Event', + eventMessage: JSON.stringify(eventMessage) + } + + await DK.webSocketsClient.sendMessage( + JSON.stringify(event) + ) + .then(followAdded) + .catch(onError) + + function followAdded() { + console.log("User Profile " + profile.userProfileHandle + " followed.") + } + } + } + /* + Test Query User Profile Stats. + */ + queryMessage = { + queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS, + emitterUserProfileId: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID, + targetUserProfileId: DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID + } + + query = { + requestType: 'Query', + queryMessage: JSON.stringify(queryMessage) + } + + await DK.webSocketsClient.sendMessage( + JSON.stringify(query) + ) + .then(showProfilesStats) + .catch(onError) + + function showProfilesStats(profile) { + console.log(profile) + } + + /* + Error Handling + */ + function onError(errorMessage) { + console.log('[ERROR] Query not executed. ' + errorMessage) } } } diff --git a/Desktop/UI/AppLoader.js b/Desktop/UI/WebAppLoader.js similarity index 96% rename from Desktop/UI/AppLoader.js rename to Desktop/UI/WebAppLoader.js index 24c5ccd21..e7d5fb02e 100644 --- a/Desktop/UI/AppLoader.js +++ b/Desktop/UI/WebAppLoader.js @@ -1,5 +1,5 @@ -function newAppLoader() { +function newWebAppLoader() { let thisObject = { loadModules: loadModules @@ -12,7 +12,7 @@ function newAppLoader() { try { let modulesArray = [ 'WebDebugLog.js', - 'AppPostLoader.js', + 'WebAppPostLoader.js', 'Globals.js', 'WebApp.js' ] @@ -95,7 +95,7 @@ function newAppLoader() { if (downloadedCounter === modulesArray.length) { setTimeout(() => { - postLoader = newAppPostLoader() + postLoader = newWebAppPostLoader() postLoader.start() }, 500) diff --git a/Desktop/UI/AppPostLoader.js b/Desktop/UI/WebAppPostLoader.js similarity index 94% rename from Desktop/UI/AppPostLoader.js rename to Desktop/UI/WebAppPostLoader.js index e0040e951..b22b7796d 100644 --- a/Desktop/UI/AppPostLoader.js +++ b/Desktop/UI/WebAppPostLoader.js @@ -1,6 +1,6 @@ -function newAppPostLoader() { +function newWebAppPostLoader() { let thisObject = { start: start diff --git a/Desktop/UI/AppPreLoader.js b/Desktop/UI/WebAppPreLoader.js similarity index 97% rename from Desktop/UI/AppPreLoader.js rename to Desktop/UI/WebAppPreLoader.js index 8897aa49d..12e5fa54f 100644 --- a/Desktop/UI/AppPreLoader.js +++ b/Desktop/UI/WebAppPreLoader.js @@ -28,11 +28,11 @@ function loadSuperalgos() { } function loadModules() { - let path = "AppLoader.js" + let path = "WebAppLoader.js" REQUIREJS([path], onRequired) function onRequired(pModule) { - let APP_LOADER_MODULE = newAppLoader() + let APP_LOADER_MODULE = newWebAppLoader() APP_LOADER_MODULE.loadModules() } } diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html index 30b874280..e5ddba267 100644 --- a/Desktop/WebServer/index.html +++ b/Desktop/WebServer/index.html @@ -6,8 +6,8 @@ - - + + - -
+ +
POST 1 From db348b3f51dcb27d2e3e81169883481de1916e45 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 10 Sep 2021 14:03:52 +0200 Subject: [PATCH 36/65] follow profile working from Web App to Network Node --- Desktop/UI/WebApp.js | 88 ++++++++++++++++--- .../DK/modules/WebSocketsInterface.js | 20 ++++- .../NT/Modules/ClientInterface.js | 10 +++ 3 files changed, 101 insertions(+), 17 deletions(-) diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index a80a54df5..303afa9ab 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -131,39 +131,58 @@ function newWebApp() { */ function onError(errorMessage) { console.log('[ERROR] Query not executed. ' + errorMessage) + console.log('[ERROR] query = ' + JSON.stringify(query)) } } function setupEventHandlers() { /* - Add events to process button clicks. + Add events to process button clicks , and mouseWheel. */ document.addEventListener("click", onClick) - document.addEventListener('mousewheel', onMouseWheel, false) - function onClick(event) { + async function onClick(event) { if (event.target && event.target.nodeName === "BUTTON") { switch (event.target.action) { case 'Follow Profile': { - let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId) - let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId) - span.setAttribute("class", "profile-to-unfollow-span") - button.setAttribute("class", "profile-to-unfollow-button") - button.action = 'Unfollow Profile' + await followUserProfile(event.target.userProfileId) + .then(updateButton) + .catch(onError) + + function updateButton() { + let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId) + let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId) + span.setAttribute("class", "profile-to-unfollow-span") + button.setAttribute("class", "profile-to-unfollow-button") + button.action = 'Unfollow Profile' + } break } case 'Unfollow Profile': { - let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId) - let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId) - span.setAttribute("class", "profile-to-follow-span") - button.setAttribute("class", "profile-to-follow-button") - button.action = 'Follow Profile' + await unfollowUserProfile(event.target.userProfileId).catch(onError) + .then(updateButton) + .catch(onError) + + function updateButton() { + let span = document.getElementById('profile-to-follow-span-' + event.target.userProfileId) + let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId) + span.setAttribute("class", "profile-to-follow-span") + button.setAttribute("class", "profile-to-follow-button") + button.action = 'Follow Profile' + } break } } } + + /* + Error Handling + */ + function onError(errorMessage) { + console.log('[ERROR] Click event failed. ' + errorMessage) + } } function onMouseWheel(event) { @@ -234,9 +253,50 @@ function newWebApp() { tblBody.appendChild(row) - table.appendChild(tblBody) htmlElement.appendChild(table) table.setAttribute("class", "profile-to-follow-table") } + + + async function followUserProfile(userProfileId) { + + return new Promise((resolve, reject) => { asyncCall(resolve, reject) }) + + async function asyncCall(resolve, reject) { + let eventMessage + let event + /* + Test Query User Profiles. + */ + eventMessage = { + eventType: SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE, + eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), + targetUserProfileId: userProfileId + } + + event = { + requestType: 'Event', + eventMessage: JSON.stringify(eventMessage) + } + + await UI.projects.socialTrading.modules.webSocketsClient.sendMessage( + JSON.stringify(event) + ) + .then(onResponse) + .catch(onError) + + async function onResponse(reponse) { + resolve() + } + /* + Error Handling + */ + function onError(errorMessage) { + console.log('[ERROR] Event not executed. ' + errorMessage) + console.log('[ERROR] event = ' + JSON.stringify(event)) + reject(errorMessage) + } + } + } } diff --git a/Projects/Social-Trading/DK/modules/WebSocketsInterface.js b/Projects/Social-Trading/DK/modules/WebSocketsInterface.js index 89b577960..22de639d2 100644 --- a/Projects/Social-Trading/DK/modules/WebSocketsInterface.js +++ b/Projects/Social-Trading/DK/modules/WebSocketsInterface.js @@ -64,11 +64,25 @@ exports.newDesktopModulesWebSocketsInterface = function newDesktopModulesWebSock return } - let response = await webAppInterface.messageReceived(messageHeader.payload) - webApp.socket.send(JSON.stringify(response)) + await webAppInterface.messageReceived(messageHeader.payload) + .then(sendResponseToWebApp) + .catch(onError) + + function sendResponseToWebApp(response) { + webApp.socket.send(JSON.stringify(response)) + } + + function onError(errorMessage) { + console.log('[ERROR] Web Sockets Interface -> onMenssage -> errorMessage = ' + errorMessage) + let response = { + result: 'Error', + message: errorMessage + } + webApp.socket.send(JSON.stringify(response)) + } } catch (err) { - console.log('[ERROR] Web Sockets Interface -> setUpWebSocketServer -> err.stack = ' + err.stack) + console.log('[ERROR] Web Sockets Interface -> onMenssage -> err.stack = ' + err.stack) } } } diff --git a/Projects/Social-Trading/NT/Modules/ClientInterface.js b/Projects/Social-Trading/NT/Modules/ClientInterface.js index 16a1f1978..742b7541f 100644 --- a/Projects/Social-Trading/NT/Modules/ClientInterface.js +++ b/Projects/Social-Trading/NT/Modules/ClientInterface.js @@ -103,6 +103,16 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule return response } /* + We will not accept events that don't have an eventId. + */ + if (eventReceived.eventId === undefined) { + let response = { + result: 'Error', + message: 'eventId Not Provided.' + } + return response + } + /* We will not accept events that have already been processed. */ From e4f11d5341330e7174a1bd9376d82fad8374f12c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 10 Sep 2021 14:15:55 +0200 Subject: [PATCH 37/65] Following and Unfollowing working from WebApp --- Desktop/UI/WebApp.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index 303afa9ab..8a1d4d47e 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -147,7 +147,10 @@ function newWebApp() { if (event.target && event.target.nodeName === "BUTTON") { switch (event.target.action) { case 'Follow Profile': { - await followUserProfile(event.target.userProfileId) + await sendUserProfileEvent( + event.target.userProfileId, + SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE + ) .then(updateButton) .catch(onError) @@ -161,7 +164,10 @@ function newWebApp() { break } case 'Unfollow Profile': { - await unfollowUserProfile(event.target.userProfileId).catch(onError) + await sendUserProfileEvent( + event.target.userProfileId, + SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE + ) .then(updateButton) .catch(onError) @@ -258,8 +264,10 @@ function newWebApp() { table.setAttribute("class", "profile-to-follow-table") } - - async function followUserProfile(userProfileId) { + async function sendUserProfileEvent( + userProfileId, + eventType + ) { return new Promise((resolve, reject) => { asyncCall(resolve, reject) }) @@ -270,7 +278,7 @@ function newWebApp() { Test Query User Profiles. */ eventMessage = { - eventType: SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE, + eventType: eventType, eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), targetUserProfileId: userProfileId } @@ -283,15 +291,9 @@ function newWebApp() { await UI.projects.socialTrading.modules.webSocketsClient.sendMessage( JSON.stringify(event) ) - .then(onResponse) + .then(resolve) .catch(onError) - async function onResponse(reponse) { - resolve() - } - /* - Error Handling - */ function onError(errorMessage) { console.log('[ERROR] Event not executed. ' + errorMessage) console.log('[ERROR] event = ' + JSON.stringify(event)) From 986172f616a7ab731b1d26183538f0560cacedb4 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 10 Sep 2021 16:14:14 +0200 Subject: [PATCH 38/65] who to follow working well --- Desktop/UI/WebApp.js | 12 +- Projects/ProjectsSchema.json | 6 + .../NT/Modules/Queries/ProfileFollowers.js | 4 +- .../NT/Modules/Queries/ProfileFollowing.js | 4 +- .../Modules/Queries/UnfollowedUserProfiles.js | 104 ++++++++++++++++++ .../NT/Modules/Queries/UserProfiles.js | 26 ++--- Projects/Social-Trading/NT/Modules/Query.js | 6 + .../NT/Utilities/QueriesValidations.js | 7 +- .../SA/Globals/QueryConstants.js | 4 +- .../Social-Trading/SA/Globals/QueryTypes.js | 15 +-- 10 files changed, 156 insertions(+), 32 deletions(-) create mode 100644 Projects/Social-Trading/NT/Modules/Queries/UnfollowedUserProfiles.js diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index 8a1d4d47e..187186993 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -101,11 +101,11 @@ function newWebApp() { Test Query User Profiles. */ queryMessage = { - queryType: SA.projects.socialTrading.globals.queryTypes.USER_PROFILES, + queryType: SA.projects.socialTrading.globals.queryTypes.UNFOLLOWED_USER_PROFILES, emitterUserProfileId: undefined, - initialIndex: 'Last', + initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_FIRST, amountRequested: 3, - direction: 'Past' + direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP } query = { @@ -147,7 +147,7 @@ function newWebApp() { if (event.target && event.target.nodeName === "BUTTON") { switch (event.target.action) { case 'Follow Profile': { - await sendUserProfileEvent( + await sendUserTargetProfileEvent( event.target.userProfileId, SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE ) @@ -164,7 +164,7 @@ function newWebApp() { break } case 'Unfollow Profile': { - await sendUserProfileEvent( + await sendUserTargetProfileEvent( event.target.userProfileId, SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE ) @@ -264,7 +264,7 @@ function newWebApp() { table.setAttribute("class", "profile-to-follow-table") } - async function sendUserProfileEvent( + async function sendUserTargetProfileEvent( userProfileId, eventType ) { diff --git a/Projects/ProjectsSchema.json b/Projects/ProjectsSchema.json index c6d84b71b..b49b681e4 100644 --- a/Projects/ProjectsSchema.json +++ b/Projects/ProjectsSchema.json @@ -1339,6 +1339,12 @@ "functionName": "newSocialTradingModulesQueriesUserProfiles", "fileName": "Queries/UserProfiles.js" }, + { + "name": "Unfollowed User Profiles", + "propertyName": "queriesUnfollowedUserProfiles", + "functionName": "newSocialTradingModulesQueriesUnfollowedUserProfiles", + "fileName": "Queries/UnfollowedUserProfiles.js" + }, { "name": "Bot Profile Stats", "propertyName": "queriesBotProfileStats", diff --git a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js index ce9ba104d..6fd01ef6f 100644 --- a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js +++ b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowers.js @@ -35,7 +35,7 @@ exports.newSocialTradingModulesQueriesProfileFollowers = function newSocialTradi let response = [] switch (thisObject.direction) { - case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: { + case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: { for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) { let arrayItem = thisObject.array[i] if (arrayItem === undefined) { break } @@ -43,7 +43,7 @@ exports.newSocialTradingModulesQueriesProfileFollowers = function newSocialTradi } break } - case NT.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: { + case NT.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: { for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) { let arrayItem = thisObject.array[i] if (arrayItem === undefined) { break } diff --git a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js index a04791cac..d0c088350 100644 --- a/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js +++ b/Projects/Social-Trading/NT/Modules/Queries/ProfileFollowing.js @@ -35,7 +35,7 @@ exports.newSocialTradingModulesQueriesProfileFollowing = function newSocialTradi let response = [] switch (thisObject.direction) { - case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: { + case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: { for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) { let arrayItem = thisObject.array[i] if (arrayItem === undefined) { break } @@ -43,7 +43,7 @@ exports.newSocialTradingModulesQueriesProfileFollowing = function newSocialTradi } break } - case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: { + case SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: { for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) { let arrayItem = thisObject.array[i] if (arrayItem === undefined) { break } diff --git a/Projects/Social-Trading/NT/Modules/Queries/UnfollowedUserProfiles.js b/Projects/Social-Trading/NT/Modules/Queries/UnfollowedUserProfiles.js new file mode 100644 index 000000000..51a9b0d23 --- /dev/null +++ b/Projects/Social-Trading/NT/Modules/Queries/UnfollowedUserProfiles.js @@ -0,0 +1,104 @@ +exports.newSocialTradingModulesQueriesUnfollowedUserProfiles = function newSocialTradingModulesQueriesUnfollowedUserProfiles() { + /* + This query returns a list of user profiles ordered + by Ranking. It filters out all the profiles that + are already followed by the Emitter User Profile. + */ + let thisObject = { + emitterUserProfile: undefined, + profiles: undefined, + initialIndex: undefined, + amountRequested: undefined, + direction: undefined, + execute: execute, + initialize: initialize, + finalize: finalize + } + + return thisObject + + function finalize() { + thisObject.profiles = undefined + thisObject.emitterUserProfile = undefined + } + + function initialize(queryReceived) { + + thisObject.emitterUserProfile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.emitterUserProfileId) + if (thisObject.emitterUserProfile === undefined) { + throw ('Emitter User Profile Not Found.') + } + + thisObject.profiles = Array.from( + NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID, + x => x[1] + ) + thisObject.profiles.sort((a, b) => (a["ranking"] > b["ranking"]) ? 1 : -1) + + NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.profiles) + + } + + function execute() { + + let response = [] + + switch (thisObject.direction) { + case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: { + let i = thisObject.initialIndex + let foundCount = 0 + while ( + foundCount < thisObject.amountRequested && + i < thisObject.profiles.length + ) { + let profile = thisObject.profiles[i] + if ( + thisObject.emitterUserProfile.following.get(profile.userProfileId) === undefined && + thisObject.emitterUserProfile.userProfileId !== profile.userProfileId + ) { + addToResponse(profile) + foundCount++ + } + i++ + } + break + } + case SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: { + let i = thisObject.initialIndex + let foundCount = 0 + while ( + foundCount < thisObject.amountRequested && + i >= 0 + ) { + let profile = thisObject.profiles[i] + if ( + thisObject.emitterUserProfile.following.get(profile.userProfileId) === undefined && + thisObject.emitterUserProfile.userProfileId !== profile.userProfileId + ) { + addToResponse(profile) + foundCount++ + } + i-- + } + break + } + } + return response + + function addToResponse(profile) { + let postResponse = { + "userProfileId": profile.userProfileId, + "userProfileHandle": profile.userProfileHandle, + "blockchainAccount": profile.blockchainAccount, + "ranking": profile.ranking, + "followingCount": profile.following.size, + "followersCount": profile.followers.size, + "postsCount": profile.posts.size, + "botsCount": profile.bots.size, + "emitterEventsCount": profile.emitterEventsCount, + "targetEventsCount": profile.targetEventsCount + } + response.push(postResponse) + } + } +} \ No newline at end of file diff --git a/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js b/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js index bf5223624..57b93bd74 100644 --- a/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js +++ b/Projects/Social-Trading/NT/Modules/Queries/UserProfiles.js @@ -5,7 +5,7 @@ exports.newSocialTradingModulesQueriesUserProfiles = function newSocialTradingMo and provide them with alternative of who to follow. */ let thisObject = { - array: undefined, + profiles: undefined, initialIndex: undefined, amountRequested: undefined, direction: undefined, @@ -17,18 +17,18 @@ exports.newSocialTradingModulesQueriesUserProfiles = function newSocialTradingMo return thisObject function finalize() { - thisObject.array = undefined + thisObject.profiles = undefined } function initialize(queryReceived) { - thisObject.array = Array.from( + thisObject.profiles = Array.from( NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID, x => x[1] ) - thisObject.array.sort((a, b) => (a["ranking"] > b["ranking"]) ? 1 : -1) + thisObject.profiles.sort((a, b) => (a["ranking"] > b["ranking"]) ? 1 : -1) - NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.array) + NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, thisObject.profiles) } @@ -37,19 +37,19 @@ exports.newSocialTradingModulesQueriesUserProfiles = function newSocialTradingMo let response = [] switch (thisObject.direction) { - case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: { + case SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP: { for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) { - let arrayItem = thisObject.array[i] - if (arrayItem === undefined) { break } - addToResponse(arrayItem) + let profile = thisObject.profiles[i] + if (profile === undefined) { break } + addToResponse(profile) } break } - case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: { + case SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN: { for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) { - let arrayItem = thisObject.array[i] - if (arrayItem === undefined) { break } - addToResponse(arrayItem) + let profile = thisObject.profiles[i] + if (profile === undefined) { break } + addToResponse(profile) } break } diff --git a/Projects/Social-Trading/NT/Modules/Query.js b/Projects/Social-Trading/NT/Modules/Query.js index d60f1e998..8f9ab4633 100644 --- a/Projects/Social-Trading/NT/Modules/Query.js +++ b/Projects/Social-Trading/NT/Modules/Query.js @@ -34,6 +34,12 @@ exports.newSocialTradingModulesQuery = function newSocialTradingModulesQuery() { break } + case SA.projects.socialTrading.globals.queryTypes.UNFOLLOWED_USER_PROFILES: { + thisObject.query = NT.projects.socialTrading.modules.queriesUnfollowedUserProfiles.newSocialTradingModulesQueriesUnfollowedUserProfiles() + thisObject.query.initialize(queryReceived) + break + } + case SA.projects.socialTrading.globals.queryTypes.USER_PROFILE_STATS: { thisObject.query = NT.projects.socialTrading.modules.queriesUserProfileStats.newSocialTradingModulesQueriesUserProfileStats() thisObject.query.initialize(queryReceived) diff --git a/Projects/Social-Trading/NT/Utilities/QueriesValidations.js b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js index dd63209ae..21d7932b7 100644 --- a/Projects/Social-Trading/NT/Utilities/QueriesValidations.js +++ b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js @@ -91,7 +91,12 @@ exports.newSocialTradingUtilitiesQueriesValidations = function newSocialTradingU throw ('Direction Undefined.') } - if (queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE && queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST) { + if ( + queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE && + queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST && + queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP && + queryReceived.direction !== SA.projects.socialTrading.globals.queryConstants.DIRECTION_DOWN + ) { throw ('Direction Not Supported.') } diff --git a/Projects/Social-Trading/SA/Globals/QueryConstants.js b/Projects/Social-Trading/SA/Globals/QueryConstants.js index 8f62db770..d5a3e0d1b 100644 --- a/Projects/Social-Trading/SA/Globals/QueryConstants.js +++ b/Projects/Social-Trading/SA/Globals/QueryConstants.js @@ -6,7 +6,9 @@ exports.newSocialTradingGlobalsQueryConstants = function () { MIN_AMOUNT_REQUESTED: 1, MAX_AMOUNT_REQUESTED: 100, DIRECTION_FUTURE: 'Future', - DIRECTION_PAST: 'Past' + DIRECTION_PAST: 'Past', + DIRECTION_UP: 'Up', + DIRECTION_Down: 'Down' } return thisObject diff --git a/Projects/Social-Trading/SA/Globals/QueryTypes.js b/Projects/Social-Trading/SA/Globals/QueryTypes.js index ec010b230..34fa39dc6 100644 --- a/Projects/Social-Trading/SA/Globals/QueryTypes.js +++ b/Projects/Social-Trading/SA/Globals/QueryTypes.js @@ -2,13 +2,14 @@ exports.newSocialTradingGlobalsQueryTypes = function () { let thisObject = { USER_PROFILES: 0, - USER_PROFILE_STATS: 1, - BOT_PROFILE_STATS: 2, - PROFILE_POSTS: 3, - PROFILE_FOLLOWERS: 4, - PROFILE_FOLLOWING: 5, - POST_REPLIES: 6, - EVENTS: 7 + UNFOLLOWED_USER_PROFILES: 1, + USER_PROFILE_STATS: 2, + BOT_PROFILE_STATS: 3, + PROFILE_POSTS: 4, + PROFILE_FOLLOWERS: 5, + PROFILE_FOLLOWING: 6, + POST_REPLIES: 7, + EVENTS: 8 } return thisObject From b04812762dc4afa060b53bab4432eefd5ca41a63 Mon Sep 17 00:00:00 2001 From: Brenden Harrell Date: Sat, 11 Sep 2021 08:57:36 -0500 Subject: [PATCH 39/65] Harden Tutorial Icon loading --- .../UI/Spaces/Tutorial-Space/TutorialSpace.js | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js b/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js index 11d44df78..c98cd96e4 100644 --- a/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js +++ b/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js @@ -287,18 +287,28 @@ function newEducationTutorialSpace() { function checkImage() { let tutorialImageDiv = document.getElementById('tutorialImageDiv') - if (tutorialImageDiv !== null && tutorialImageDiv !== undefined) { + if (tutorialImageDiv !== null && tutorialImageDiv !== undefined) { tutorialImageDiv.appendChild(htmlImage) } if (newImageName === undefined) { return } if (currentImageName === newImageName) { return } currentImageName = newImageName - let webParam = 'Icons/' + newImageProject + '/' + newImageName + '.png' - - htmlImage.src = webParam - htmlImage.width = "100" - htmlImage.height = "100" + + // If gathering Icon by Project and Name get it now + let icon = UI.projects.foundations.spaces.designSpace.getIconByProjectAndName(newImageProject, newImageName) + if (icon !== undefined) { + htmlImage.src = icon.src + htmlImage.width = "100" + htmlImage.height = "100" + } else if (icon === undefined) { + // Legacy Code to handle icons being fetched by literal path + // Note: This if statment should be removed once all tutoials have been refactored + let webParam = 'Icons/' + newImageProject + '/' + newImageName + '.png' + htmlImage.src = webParam + htmlImage.width = "100" + htmlImage.height = "100" + } } function checkDocumentation() { From aae822904815f367329193f46008294d9329ed46 Mon Sep 17 00:00:00 2001 From: Brenden Harrell Date: Thu, 1 Jul 2021 21:45:47 -0500 Subject: [PATCH 40/65] Various Doc Updates --- .../Trading-Logic/trading-logic-002-syntax-overview.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json b/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json index 45e9fe125..113a9beaf 100644 --- a/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json +++ b/Projects/Foundations/Schemas/Docs-Topics/T/Trading/Trading-Logic/trading-logic-002-syntax-overview.json @@ -160,8 +160,8 @@ }, { "style": "Javascript", - "text": "productPluralVariable[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-n].propertyName", - "updated": 1624868076284 + "text": "productName[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-n].propertyName", + "updated": 1625193412334 }, { "style": "Text", @@ -175,8 +175,8 @@ }, { "style": "Javascript", - "text": "chart.at01hs.candles[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-5].max", - "updated": 1624868093927 + "text": "chart.at01hs.candle[tradingEngine.tradingCurrent.tradingEpisode.candle.index.value-5].max", + "updated": 1625193408514 }, { "style": "Text", From ee92708d4044cddb586426dc2b28253b7e110158 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 11 Sep 2021 17:17:32 +0200 Subject: [PATCH 41/65] Post TextArea ready --- Desktop/UI/WebApp.js | 8 +- Desktop/WebServer/css/main.css | 39 ++++++- Desktop/WebServer/index.html | 191 +++++++++++++++++++-------------- 3 files changed, 147 insertions(+), 91 deletions(-) diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index 187186993..f2f771d94 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -145,7 +145,7 @@ function newWebApp() { async function onClick(event) { if (event.target && event.target.nodeName === "BUTTON") { - switch (event.target.action) { + switch (event.target.name) { case 'Follow Profile': { await sendUserTargetProfileEvent( event.target.userProfileId, @@ -159,7 +159,7 @@ function newWebApp() { let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId) span.setAttribute("class", "profile-to-unfollow-span") button.setAttribute("class", "profile-to-unfollow-button") - button.action = 'Unfollow Profile' + button.name = 'Unfollow Profile' } break } @@ -176,7 +176,7 @@ function newWebApp() { let button = document.getElementById('profile-to-follow-button-' + event.target.userProfileId) span.setAttribute("class", "profile-to-follow-span") button.setAttribute("class", "profile-to-follow-button") - button.action = 'Follow Profile' + button.name = 'Follow Profile' } break } @@ -245,7 +245,7 @@ function newWebApp() { span.setAttribute("id", "profile-to-follow-span-" + profile.userProfileId) button.setAttribute("id", "profile-to-follow-button-" + profile.userProfileId) - button.action = 'Follow Profile' + button.name = 'Follow Profile' button.userProfileId = profile.userProfileId span.setAttribute("class", "profile-to-follow-span") diff --git a/Desktop/WebServer/css/main.css b/Desktop/WebServer/css/main.css index a83a8fea2..3dadc5d11 100644 --- a/Desktop/WebServer/css/main.css +++ b/Desktop/WebServer/css/main.css @@ -38,10 +38,24 @@ width: 100%; color: #000; border-color: blue; - background-color: #ffffff; + background-color: transparent; border-width: 0px; } + .static-div { + position: fixed; + top:0px; + left:18%; + width: 100%; + height: 100%; + padding: 0; + margin: 0; + color: #000; + background:transparent; + border-width: 0px; + border-collapse: collapse; + } + .content-div { position:relative; vertical-align: top; @@ -50,6 +64,16 @@ left: 31.2%; color: #000; border-color: blue; + background-color:transparent; + border-width: 1px; + } + + .post-placeholder { + vertical-align: top; + height: 50px; + width: 100%; + color: #000; + border-color: blue; background-color: transparent; border-width: 0px; } @@ -64,10 +88,17 @@ border-width: 0px; } + .new-post-div { + vertical-align: top; + height: 300px; + width: 100%; + color: #000; + border-color: blue; + background-color: transparent; + border-width: 0px; + } + .page-table { - pointer-events: visible; - position:fixed; - position: absolute; top:0px; left:18%; width: 64%; diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html index d16863556..fb3d12d3d 100644 --- a/Desktop/WebServer/index.html +++ b/Desktop/WebServer/index.html @@ -34,10 +34,116 @@ +
+
+ + + + + + +
+ + + + + + + + + + +
LOGO
PROFILE
+
+ + + + + + + +
CONTENT TITLE
+
+
+ + + + + + + +
SEARCH
+ + + + + + + + + + +
Who to follow
+
Show more
+
+
+
>
-
- POST 1 +
+ Placeholder +
+
+ + + + + +
Profile Pic + + + + + + + + + + +
+ +
Permissions
Tool Bar
+
POST 2 @@ -53,87 +159,6 @@
- - - - - - -
- - - - - - - - - - -
LOGO
PROFILE
-
- - - - - - - -
CONTENT TITLE
-
-
- - - - - - - -
SEARCH
- - - - - - - - - - -
Who to follow
-
Show more
-
-
\ No newline at end of file From fd1fec92ac5f6a60e274c980724b7362d0a8df7d Mon Sep 17 00:00:00 2001 From: Tentacule23 Date: Sat, 11 Sep 2021 18:34:33 -0400 Subject: [PATCH 42/65] snap_to_position Tentacule23 --- .../Icons-SVG-Sources/menu/copy-position.svg | 8 ++++ .../Icons-SVG-Sources/menu/snap-position.svg | 10 ++++ Projects/Foundations/Icons/copy-position.png | Bin 0 -> 21493 bytes Projects/Foundations/Icons/snap-position.png | Bin 0 -> 24302 bytes .../UI/Function-Libraries/ActionSwitch.js | 44 ++++++++++++++++++ .../Floating-Space/UiObjectConstructor.js | 32 +++++++++++++ 6 files changed, 94 insertions(+) create mode 100644 Projects/Foundations/Icons-SVG-Sources/menu/copy-position.svg create mode 100644 Projects/Foundations/Icons-SVG-Sources/menu/snap-position.svg create mode 100644 Projects/Foundations/Icons/copy-position.png create mode 100644 Projects/Foundations/Icons/snap-position.png diff --git a/Projects/Foundations/Icons-SVG-Sources/menu/copy-position.svg b/Projects/Foundations/Icons-SVG-Sources/menu/copy-position.svg new file mode 100644 index 000000000..5c68bcd28 --- /dev/null +++ b/Projects/Foundations/Icons-SVG-Sources/menu/copy-position.svg @@ -0,0 +1,8 @@ + +Created with Fabric.js 1.7.22 + + + + + + \ No newline at end of file diff --git a/Projects/Foundations/Icons-SVG-Sources/menu/snap-position.svg b/Projects/Foundations/Icons-SVG-Sources/menu/snap-position.svg new file mode 100644 index 000000000..a272ad69d --- /dev/null +++ b/Projects/Foundations/Icons-SVG-Sources/menu/snap-position.svg @@ -0,0 +1,10 @@ + +Created with Fabric.js 1.7.22 + + + + + + + + \ No newline at end of file diff --git a/Projects/Foundations/Icons/copy-position.png b/Projects/Foundations/Icons/copy-position.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9d7f13da072b996faeb7bced37864b382a2bf7 GIT binary patch literal 21493 zcmYhj2RPO5|3CgZ$1#rWAc}OdBcmi_9Yx5@-lNROmKo>1wOeQJ8OI z*!KT+0Di!{^;EAzZ+kg^KoA;IS5`9cw_3?Trdt?hoJ_A9IVvG;5>7jCo`g}?R`B}j z_=ZtM;o&G#Szlpv47Hmez7~3h@H`x{i&#=z5O-Pr`V>;AR|$G_2{tpO8QWRf{2>& z1-oj6({GIA>gu=F2O=VjiZo42^Hq%%>spfsXX;7?&i<#Y!Aq2cQ9xxKI$J8|zi?hM zPY$ywF&GOySLpgWtmn&q(w(hdMZ<~=pA)H*1IJr&O}=o#jU2^de>DVy(l181+{k`` zAlEIGbJXv)6<4n`m0iAfZpkw=l?R4ex&))Za*^4~pwg*uEg_FogGv$+Vmb+KeDS3$ zBh;b$5)Zk3DQg}1u!o3Ro#(&Fsn%Rv4i2IGLv}_AY1SHkoFk(RMD#@CXpy`;^IGCp z-pR+Wp^H}Hqu0;`dgyAm?oBQ;`L~3#xUREjmd;{4DBIiDXjRSQ=9D-kdVYtv8l(q!ct)neJgPI_!}F!~PlfI)~@u^&2KcC6S>JBz#LY|C`xd-2T+ z$p~s?EDVond-3fEWpd@R-q?e#ruhfdN!ODAEYa9U_|)8Rdw*{N5mfg(&sC|#J44LA4Hu7}5{c-}2Gu`soB zf6$AjOTe6?5{I^7LK^i-Ha$A~*RB|ob>r@cVvXx(x&zo+!ihK4D@^QGZZ^vjj~bml z!T>Aysh*8b@Y=9FW_A9Yg}%lX->b8)Kk4%`wqy`18qpPN_BAgvTz!CJ@yadu@_7P8 z;Q20(o2O)Gxq5$D4n0X3-}^BrSVjZm4ht)JlxQKj_1(V3XNW&G0mBA%ugCt!x5i}B zY}5W(QpC4;X8k20cTMKi%N-_0;x$ZJD*oY4cerp!OY_cA5XvJKBEz~c=jZvNOddGd zSA9(yp&Z*!>V4Fi88ovsF9RDij3)|Fy>-)R9c*K}D*Ik;AqJ5xK!AuxPn@c zKXF)2Dq=qGb+{OY7>BhwgYf#%9ljfw$PG(FibJ(>mT^rY97V1oeDdPZwdrlgfTv+Y z0@^mt)E33}>wNr^{dlsaZ?1I<0~u}9j;QBXMi&|G>JO65i%suIrRy@eapN4B{jcLR zROY^xPc?>ls1aDf`@GfsdiPvT-frZrAJ2un&@AIYVBbS6j7LGC)wLmd(YXfraYWC- zF+TzN;{M^yv=m&uT894Mv`*3RGtwBk8;mF{yt(YR6H##mFOMAlX2@I zFW}_tH=6GOJyIb=!6(Ty+!>eEiS7skb9nY=G~q^qF}P_!&eM+iz1Zp5nFgmECBny| zYco+WLe!;t+py`q$#fpeH;fmKfEDL~$_?)%tFKQ9$}o zWe*$4c-QtfMoO!pH2^K9Uw0daUnC@a6~5J?$YrwC6YAaP30BG_5guW)_ZxOU_hlI?(-Kb1U6c9og|g~)L~Y5PwJ&RZ@DuhdM)b^bnwy3CCWVYY#mq-^_^#|5*` z12s6JkyBMVazLuvZ^XECsGy57nDK$!Xfdwgo1*+M6oe0r z==@v#~ru4aQqaA_Lq6mL|tk>S>_>r+5%uhT0c^Q&h< z*}v{OV;hBMhg?x$*3{v;3NbRter5pG_+AyMq57s7HIiHs*mAfGHb&j)U*>z&8B0qT8j zeA<%iDZT{H77dgC%l`NvcyX;2j#-$_#ak>DPI(I)hTq$omMb!xq8k*0k4XQyR}_y> zBVK^VU7zEzZQ8$&I*;>Z0xn|IL;z+^rzpUEj)xnC#@#{b4)$f;-28Q?xZvl%$DV-? zwcNMc{hWI-_Ms`3j9M@+Q5}oORl?vtzkU~~@NQr!QIU}r$P+{c^|e(|jR)NHcKT$6fkz4Y{X|sm>4M(aL_a!3mRg zW`kV{LSq51mKJik@%KTPKvcRd^J2ouN{jsjaAw1OLG49X5bQW2a>zLYp=MKxn0shD zal}8fr-FqM$^st!-umrIe5V1oL=n9a^@#Z|mnopgh&lyfb-P|lkCB6+U+aKTjeH(T z?Bi`szUvvD6p#*u8;^Gr)DUzh?JD@luZF>KXu9qb%aEJGU$0VNxwTxv%#u1MC~P{A zZi`m|Rez`^xY{2G{Bb>;PlpkH1&nu2h!GTJ-I8{J00nAdaDT)rCM!GaO+{4!rOzP8;Nq3?sDS#Kv1HO`S6pmhh5h+%Ob7gxeJw z4c^;axIyOBlS(phUsP)!2{yek8?E6D{EZH*5&-YmfEW`Rr<2P3UAz26(UBIS?+G?7 zz1;9Bu;fOnQ#e8mt%?}qmSq^u((vMq(&GoJXoK3=eCHcrfYdMSN#ehE9)|LW!$6lL zW*xrgO8nux1WAi;+4H27YVaNBkQq7QfT}`>vHJlZH=MSn;A;8*u>o1p-I%S|CeFl0 zj{V>vf3LI;)Rde@+=%*WhVQRRRT};*uRN006FbgFJv}u6pHG62EXf#l^ALs$ODoqZ zWg6iOVo{ol0)Jv@Tyb9k$D_4~{o*xQEaPD(F)WlyASAwlAs`*zpX8^XzxwLgKA=~24qOBIszX5M2cGE8gxcyxC@HK(rlXtDReC%od=xaA_-um~AO$zixSlgz-w zS!qs>AF#Ioq3mf>XDhb#E#$eY1jJ%vag};vZ*zrJtd ze1C!dhFQJ*;^hl*q>wjP#YS^XwzpWU<&nvz28g0ss#@>!R9WxZIj^V!4eGdjA@=V& zRSeEr)0v^kx1gUd6rCFk9BAjFg~xK|3f=3}+(vl(`#A${dthAS34v5gamMcpR^D$d zB?>$d3I*b|DU~D{otRli75&ItD6WzeYvX0%VKHs>@~;{`TBPs+3wF`jZ?uFpTtIj( zSv1Z2G%_AS&ShdTIu|-V71f>k@m!h$n@!hbC`nmDe3AX>1t;lx=`66@oO*5}F#?8< zvx0#6!WT#j7+;L)YKtbGfnCk9;9CRE1C0x2(k0p|)%&r(Po3AuXt@Uj{_>&q)9$J5 zD80iom`HE#sLOwe>Ok0yQmlTRD&w%+^oXOWnm_=JRt^78Fp-{bsD0O zel*U2d>`bc=>~07!n$l+NVi}|;1o4af1UJe6s!wk>=^~VlAU;=JfY42OGY7xD+S`G zW@Ce3sqOx6mw-cVG+rVjVCgX>M*Hc-A#Rw}(NxkCc`0F(6|CM$Ddy2!%8deB5D0mJ zjq5wmEi$LRR6q!Cya4=u_*!cRrK2K>0{b+>k84w+^vZ)KxUAzu<|^s_=rjbP*4Hq| zi9z9t;P@|b$nG;o&Anb!YsKmJ_Oc{eJ0)R;+4s-v)>_2)XmXNaBFL%-#Zd`?5hA0} zBr2$HU<_SeC;S)AWa06g7CKGmu^)C?%>8|&8%yiZ>1sO;(k6l|FvAIRq1c|BI**U* zG<=QtJEx(`XDm<|-Z0LL+p;x4>Cw0sC~2{$tG88Ht$8QGPMR(OB68w}b-a&^TtR$+ zfrkq)KH<7jm1|+<&m$uR%+Dfha;I0yb$evC#QjvO_CvRio1|+K5#Y3%{s?`)hdX|u zC+W-)UiZRa_`XN#+*_v5xpi-jQ~_`vY?vxo^y#XAg+z*gA}#bV`(}wzKvMC8wVggT zk}$>-q>)cL*X9Ga3T7wT=PiK-ETO(Br}8EI2;K@EP~P=o_`3`WIn(~Y&ufVR$n=Sa z3d&G{-f3|)^nW=fza~b3sa;D!%KpRAP*Va7&!B63QCv2*y1#D2{iQ;(qdJK}8xdF` zE)F5v;nOs$_ovc(I|a!w=P>WNw;qzy|G43t%1femor=oiwoJ|XMz4P!odmSaz7c(| z*4=zAnkx+?fTUeAG3vf8r(@@Cm7U)nkt4&z;cD(J@Efj-%~oCn!3G9y#mv~+GhaX1 z<3c5WwGaAo1OM42h2eFv^_s1EDlqb36aQ!odh>b4&Vn)3D=DDLfo)8m&d-M?R}hWJ zYkuBVPbIw-SVjSZtqnZ)S=@Lr6w1^+M+$;+XELcvJA;*Qvq1*W>`C&4MGRfXU?o0R z91G59=0aqIxzpTH4s`4vP$mp8*r}Ae=6r>pfY(juROGGh3ejx}PPDJhAswU!qDkdlhGnggxj?z@ z+^STPW4UI2fAB~d5u{m3`yQBl@TyNAVTImG(H$;$y3XiPV5f3$Mm?M_qSt@FvHvTQC2D2`SfH21pnmI?q9HtaHQ+}Db$h_&H(Kv{543~(@)4>`HD#t z#+ag5*wEha%u-ix=zxK-?|*9O0fVnUl!OLUe9VL{pDog~-kN5~DzuSRDlfhMo^0K> ze|^8=1VQzRpekG;?+rI^n)(2V_x=()m+|ZCyDQ)7U>}EOC%Wc&zqr6-SZh@c)*^^& z6_~Y*YLC&fpvk$6om5fwDF?y9`_D(TRo*k(m_yzNqe<23cpCU`iq(pljF-YEBOlE~ z1ERqjOUGRorq(g)yg*VL-Y+!p81i~)a<_vmGO=d+weKJAHVIxEJtNhdA+h~k&2EEEzi6;_P6~$0)q9qt-_g`ROGgXMvWHyOn?mH&p!#nXAHOSZt1|f7dn0s@8~2Mz_kL6- zTUW&@Lan)79nYFkTpYr}-B{?7y;94`Nav8o@i{f|WBuRX^cm?4HpDV)FeVVBseBY7 zgBSSYj(*U*wdz--Kb2%Qwm(PU$!eT?2|c4M|MV)_v&tC3vX>dP+HaM?RbWbiWrKE? zA4N)qyvjMDCMd=x38x)u5aEXM16LA5x7d`{bH?xO1v343jBN|F&S5>vw~?2X95(Fg z4dTMHJ5tW(w2&BfL(EuUHYn+JH@ufwmpIfrer($m5WeL==_C$H7RyIw7;Fxu;GuB<4#De>K!dT>4V~z}Aa{t4}SG|)I5iHiU95q`57pzY+sTD71QYjtH0-c`{S*CBNbE|QGMV;_JzA^oGnIl@SWt`0;eH^#S>LG(qcb{A}c`gC652?JkQ`h9Ax^ zWl*myyi&^iN&Yv29JXTdDy1MJ)RPgsAPEZ&>0`}Y%;L}QEkScS=Vn+>k{m~4sB?6v zkJkCcel#)@be6Z_g+Y==k1OUSEWrKNv>%i>>>7Nmo-ADuilcfOwbT!COOZG^w)T4^ zrw!VKpgDY1AzZ2$EQMr)6rU>1?0ykG&To^pDYJmv^@37IbQGO6ot ztnVu|2|*!9=~U4Yd84Qeig9ux(29Nh<;1(Ip2oCLpRFGVFSQC%+t(<{_y4Q#D!7YS z)56^ls%RR#WUW2seA8hOs-+?fX`gvj6vgQ8;Tz=CkfWL=CzsIkcFh*@@3oU<;AKh) ze@ma;+^$93?HG$&zwEc27RvQo+l`$a$DwL<_&xR(#}wSA0~cj8Yr&-3Pae!TT&4N} z+Q{a~RDQkn#AxdNMPuvwM@%onva}{Qe{QxC*VT>9C8VP64Ck`kO?bgvi+;K~qaxL> zaSTYt?|;*wYoRDt5j$UH#DrXuYLgDIW=hfDszUPK-lM}zX^2iS`x7g6XU8`t8(VV7 zD6o#fS|euu_(F^C$7x7d_UZPTE$B=$=lOW$1sWZB-A*RecbAypLV@u`0%_WIWidhQ zQ0^r|tK;?WOy>#&25H)Eez1ncGMh7{3Jh+*pKzKXO23Ur!H=#GB)(jRpBr94<7;28r`}KXa=Ax~GXjeDl*$N|+A~xar|0ss)*E|_-&z_<&$CQO;;chG%ADhlezo>?$OJgn zzAdV&)O8w_SdQ~tYqWQv&P-7+Z} z*S$t<@seQBqQ19e6~f%!b3fSU#G;QDg3PMBvJ6tDA-SVy-KBnh?dFB&zUw06f=5`J zo+`4v&8OHWD3!INH$HPc zI*%uyn8$ODJsTesOi^OzdD_afG=7K$D^fM@>yW#bZQQb%Zf`bf>B-Ds+hE2_<%HwU zHo7e=Rayr+9-WS8Vt{JSaEWkR|JrBtU$or#QSPR*+bcy^mW0uhD7gOX0{3Plwm9U= z6;xRn?3V(>n@~qfI62`AYRM7uD2-a33em?ORx^PV;wCgj)s;8v8NfbHc2sc~Twq0s zHCJ_TzgB%^R~E|J3#MxPCF=i%cf_~-dQg^BuJbz=xbUg;oU!Pv=Ocy7S{5dD@VGZ_ z3{7_y`}r8yM*p*W7jzbKW#QtD@BakNO~ILTvl*|hIMTdI*OTCnH|P;SOY_XuxJsen z)MqbweqSXcHqt}tcFpwIxZty2*sN3Ulh+n;j?0+t+LhfwIjJ~Qz#CZgJy{I=?{c}I(17@;M+VsZ*8 zz$`v76!N+8p3F`|-RE)N4`-)3=~Q?&=EZ9| zShRe^wgWjJvjo!@gf~_gyVziqZi8(@Iw7pJt^Yk>$demz38fn8^x-=7E-19P>K+#r z0yZV*{k%zm!L0Hd(H;V>N}n-1lh0|lD-|0pD!%h7_rCE1?*wdVxa4iqr593xfzjCS zbLF;*s~iksWEkPg!$Rc+?rpmrWmBm3PaMa;GzyOS@zlpm4@mz;bCM&R4uOa@Dkd-767~RILsxJ??=ofoFH$d^olRZHGQlGG%0H zI_AzBC3qk2m#5vSunl2|Bk}1Ygj^%zmj=kDWC6v*xkUVx&u3%HKK=+9hB#0`gX&Of z1n&#mcrhzQtf$m%#RMc2bu&s4GhbN8hAsAEyMne zH0(g{I`VEq&H#Ph-QE(&V|~W^wc@+YUjo5r%2ln_$LA6hn*y_3LaVxX`rc(;!db8H z6g$VcZYDNBt|^`_HJ`BrhXJVxo8>LGvTnSgsF^=2v=Ua%U3Bp?c|i1%2&`4cc9Ls+ z{KcD_@IHa~Z{4H1{`(v3!+nn^uDPD#*BXAPu-aDw#Ty8(M=S+2(+&&gIUl_CxV?O{ zOm1KWL&dxG*_#QWcvj8(>Z%wlg{ST2*7))L#Jry&@tua*3nk@wJ-eWd5JAjcthRciUq|9y%)evSEUiYmXo$A{xgv)9?} zdQA8(UgItCBl!`3GdVUW;FmVNwq+S#VK)OuPrp@~y*$c<4fo3IG)_>_^ZOK29Vi0~ zt&N&B@Jz$82bWFqf8c7gjCygc3ujlC<&W9R6;*3m6~R2x>V1b zSv|<|PIevIm}i8+Qj_mCRDr5vJ{n<`P-lo6B~Q@EutfQz@=F~%G}f2B0-mP@Faz7x z%S2U%65IB)jPd`-))pZ@C278$6be@#%tp4VZk8oecig}{_twh3$kmto;_VJUwBebn zBL70{jX5GH1@u{@Ci@L@k?-y~=ongLImUjw8Uk04*Ph6NzC?dWV)g3UizD-!%OKok zaFza>{{#%F-FHLPdiG{NkFD`PQkRWDI7j8r41qL-fiR;$JIE7f_0X>4 zW!k(ck9Rsg6*+D z{tQq@^BetED^@FLX~ZDLzQ9x>h@z3P+~mgc^-{6l@C|P0qU<|R6s}en`8ZMc3WEqf zXmrE1e@`)(vi`5f^L;_r0_Y{4^BS0(wg_N?+(6IiEOXQNj&0zAyFL3jo!pjYgA6YS zbdb=1w_t1{zkpWb`TxTLsM)C5H{_h@3F5D95+84*fXF2amqu3?P4X!q3?u|QOV-% zxEU~gLP#GSppU+W%9HEFu103Ylz{o0TR$6@v)?F)!J&1y^yuBhmScs!#j#Mt)OEYSwg1c;|h6C z?6HLNstT}``>Bws{qt(2?@#&ex|K;tBQOu3HLJ&DuBD7y*hU>lHNfj-rS;^YyE8(>O5{yCA8c@jQB+-T;yHI~gk|Dk8O_BrlTLcE<_< zDU|a>3b=nwoFj_6iDvtpK841qqd@xtjuFeXJMGrT1{2GrB&tA8DhrF$E7@gRDw0X( z(a~g|>4HY>?s?M-vdaTIeVtcd~E$eNTfV{RWLj)UFT92ce+uvy86m2jUMm*`T2Ar>k@% z-3~^XaAi#D6Awtf63L`Har){CJ@c43UMmEF&8(w|UZuXmcFU3hruECAs&n&?Pk0XCibNZNc2mhnmFou|C+bx^;3D&Uf zOefKwlN{~4taZ9yRhgO*SVd^BK*7uI$5UkClG5wkjSnSH>#8QVkpE)!>sPgz_WHzY z#Js!u&ARtc&p5i>0*q3yqwvV;3R{X2)SDH!ZXy{|pZQK6KI;G(?GqBpKK^I%Rh47;aeC_zY$^%lp}riZyDyAZ3KTVe|!X&#j7^Y#XJzdU-eJ$JfW0S2>;wR za_tW!qc{b7@*xja`FU@lZ!kbW{1jrm*Q|DBIAB=);Tr1y!p9EF$mVMU<{zX3UM{a4 zQ$dp6XIb2RAEuw|&u&3SSpm(QTQZ=_uG;sFDuiWdHCMhQZQweP#ZC(fn?KpT*h>Ce z*x&GUL7BB>CK#}@s^~4_1yJsxoYOIKX9Y&kEMdPH9=Uz$YzbW^7QUD{((L%<+Q_su z{OaXt6j3k~S^L8R8`D+sFfwcHWT7htB8cfZ#{D8W%p70UyLAGY zpwZvDk-8hrzvy!v{*~pXRGamMY>j5tM4yv=uKh7Va@)>Yqk1Ae|jAwDvq80jF*!E zJOB_EF-SUBZh}`=Z_+)2QqjPl333$)t|~kl>3Mm}7$U_x>S2gV?s#Q~)7V=^$0Gvf zaG`@!`Z^(r_lH*+NDo_`AzPU0*2g6#>u?jTHO(S=?-!402JH9y+m~D9*pxQ(!P~A| zylT2z*L*}joC7p8F<_p}wvFfs9-vzBZ`8IdNtW3MJc)$k4Npz}o)J571ecB!ZP~r! zX`4*P;lUVa@OC7El|P?nn~rC;QN2^w8L0>PbDAm(|xS0?lBS??4nZM-}R`mzLnvp zKgf`Ib91npqw4tVp2SK`aQ{`(Z2-T9-0)*Vi;Tn}!$8G6z(7`L0kAF~*Sq2|0DwYp!& zc!Nos(dp*G2DF#U?BMjB9ND<1qAwNlw=u+!-iU;9Z21%R-J#I+Hk;$!!uO9oH*dC_ z{_;?aRKJnHJosU+HPpq2`-8lD$WUi6M0wka9OB5xqbc`3CtYdROI5f8*Vp+elcXX; z&THdht7VWKDy|7r9q|4{J#p{OVMH!lud`Aa9HU1khV6VVlS6L56OV;UrH`!jwPQSTzKb%FUzYc9vl5#G3X^O;zhXTa$ zGWsTJ2;f0*_|f0`|54PP|C`8;$9VBPxlVlpZz>Uqh+b#ADITt!i775LI5VVOud752 zl8rT!@?#C7f`N0Qovwma0*Gy6#!1OH@3~ggWlsGH!{`aS)2C#?0%F-BoW1C9MXg<0 zekT5ldBLqShR_nNB*>gNS{<5c(-mOhx%S`Z+U%6zlmAN(hF1gMdWR8i*t$yjeNa#1 zm!pMJ^0D-OpCUh7oX5ACx3yQEYq%4saG;7VqHiHjJShx4Ya)|}urpj0l zgNkR;&TqD!5bXvVQH;dbUapIChUa|eBSE?v!@BX^vwZ(~E*W33HIm~~q!*r70ts?W zg+AG;s+5+S(aawrj$Kb4-@a`{1tKjZRc~hu*U!#pSdzl*{KR=qkz?~I8UAeP%FfT; zsXDCh(h+FA%h&o=;?&sqCQtOO&FeNF;Z^$Po)Rn^^D4}~cB(dSSX^b6zuW&wu0HG#2=r3A|!_|ATsXrD_13*KN3TFF5`C6X{Hm`lbo)ogF zk@v0+j@ssYXHo+tr*Er(Z9s=ozQE5Q2IE z+68B=8qa^>)sB@l?_;}1D|Hq*u$1;*+RHBk(P_aet1Uh{qG z>@WdJHSeO5%3_0fq*!u6sfK}St|VOQI$07g+Bm|~yG8xfg}DcD)3Cx|PTdgx#`un! zf)@i<=kT@)S8EG&x2#-E4MtlKO$bc9U+K4Dclc(MxLe5EY0FKM>2auB?s7u`VJCo- zTGCzvgA>39;+=Vi9mX>zDU?9Q(}eaaf;ebjC23 z!+Ia#A}W=7L}dgv1nw`pN@Pytc;_TbA>j{rC$w)>A_yA%wAox zPshfSeY~zY?3X+g48S_g^m)z0w}{Q+HRegNL4bu5G&aJ&v-|sbsX%>r_hr(E^-?J) z?bd4Vgx??6-XGo?#apKpaO^6Spm?zg@yy5}(l zyL+>tI(<)I5aBG%gMd#zeFohjSF^`$8nKTA@B}dfkLw?|rq9y{qCh!VAX)<9KZ&m{ z54EL|laox}Ek1i{YO~;j;98O{sHGEX?!A5+U8s|7I%EhB(~0yAsw~;vToEqH(0{&X zkSnQYenRyGEjoN(B($s2_&;dlJ>>CNs5$GHYNTQbKu8`45~4_^DtaxS>fkT(AYa-N z+Z2sYJF}$%8r>I%SATEj-xCKAncVLoS}4*L(r=f$JV#P--H0A&119qM z!#Rs!knv)$%+E&z7xgZPRO?HY7$Z@CCeq&Wz@eEe#7P3U)l0{(fz#)C;sl$gvw_)cg0`nW{45 zNafroxm-i$3J|wyNMb}Bu_et)0zYv4l>ix(k!~?I%=DHDl86ePK!5y`c^EiOH=#NWT{=^n&`Mz@p z@JOO*ez5CVk)UF);hcU>&}yIt$p83i78kAVQNXhjWaO~TH1U>~ojOkCqNofWWR5yb ztrZmKpy=MO$52TD+9C8Tc>FzE! zSxK(;w*-A^E?x?zE!lExd%NVpgw#y@A1o{B;_So&u+!6T&mNDftFJ-ggLP2@x>Lvr z%GMO80^^7nGpPkjSE+-<{rNgU^26@{=>7hu1H*7Uh5`9zsAkRPW>Q0t$v~7IEws#j z7nRYw?#SSMr|ZgX1GrZBiNzHY)GHm)TvDM=MZ7ZDu3clmri(Mhrv`J)y}>9NpLHhZ zA4)RER|;(_WPm$v0aQ7gHj0Se}e4`#Dv zZgBjWoegq|mRByXf>#NcM31ZC7ZG}`Rw?yOZx_SQ3U)#p@Efj!-CD&XgE*Oiuq?zW zVUM`N3A)zFySNF7l0GRJ)4weTgZJTgWLYP*vG-x!p3GvFtT|XJH_>4c_j66plrBS! z1f(^W;Z)Z3mfPE6@Sne zd0q5s;E}=Wn5B0HcGvVWnipCwT)o};Ak4-*+>H{w5zXIoDiZ?*On2Ar_gv3fdg%|^ z-q@ho5ZU9&n*#+tq7)OAaS}Gp|Ijp3%(Z_iQgqhDe@Bm>y#Jj)S=b4c=gQO+r}Pyq zbxg2JS(4CA*mDTw`7KZcn+>VWN!Osj?s%A25LUivSKPVdUl;QaQp1S21#{>&aSAXV zX2Sx!(8o`j_Z*m5cq}i@qy8PH#LW0K!dEu*%jM0fJQzL(>6@$l`pf5f67m25WdIzG zA9OMHwtIFMa4?(Wr$cYb6Dr`3EkzeE|Jwk@NCHdFZ}HXJfCI>1^(MYD+ZR`E8JYJI z{fDJtN5E3z9>*@EQS{e4$)ASmvrW9z_Rn29HG#CL5`FLS7djY^sX=gk(5-*ye|x#5 z^1gYu8vu`_n+q2Qt2|eYBVjiFf_v<*`L)RG#XD~GI z?Ay=>shF;~j=I>-B=jB@aiE4#nZEP$lg`1&hq|w{5Hq{89+*hzdd@u3CGw9mP5kIU zTN54nWna_bDC-w7V;><~yCcGa4p*9|Eni5gnRPs}mj{=MAm5J(> zffTN^u1?(ihauvCThreS(saMIZx{}<3EOgu?G8>!z4aM#z1E8Q-y(4tID(5O3x?+iVfo$fk&7NG8vl`eh z4YYH@c0^{UTf_m>jw^@pZ|c;fI&Tv3k1!EngGqg_4;gY`!6yj|{Z^y4hbjOdmvZ;? zzZ+JQLxabfJavg4{5k-7yh;1V?0l5aODxwnkd3MQ<>!Vm+)JHZO7;KXZ=PDfiL9Iw zJoUSrSK}W4dOD2Xb@`=r`z;EJXU$qR~Yi5|P@Bx;A|9$)1av zncD1KMMw%PEydlJ8_KxsR3+gW5_%8!fmwG+onKp9tT7>*!v^Yf!l>H;MC|LQV-*1W z53txN1f8~#&DMLTHRE7tvd)}S|6tAk?|b53VDpT~phP+s8HOT0&&~F4E$bDnc_r)L z9U`#BxejMO3DEG=60ZYvDJM}fsOjF=wEJeFc4bbAt$7Uz--zR8G&xX=J96%w0+=mB zrvK{k2{82Rg|UBtDG9gF4@iuScY&W-8t?uvm-!F&N`NTtz1+}%%eX6Hk0q@18qxnsagOWk?I1|aAIutqBLKcd2jIr<}bpPU- zb|vuM`itw$Wn%1~?b?}J$z`>Bu1*4PvNTV**ZggG?2szSBo+{<1U=qHtp-sPU~}?F zz;s8)Fezl$C`K?6m_as#e^s89?usWJY20yDMP`b(5KQoZi4ZhE$yMcL(}t}>b3TlH zDIc>CtaiG|KzlaANMDY)7@NuBr$@11vtJ&90NifVMEds~?lVhp3M}rsb?BDSpv4RL zl=$7_!rCyfqbk7IJJ;DVkS-8F4=hRcxu{o0Q=DgjS{U`_>v56fO-{?^0&fl*h)_}L zApplV=XW*Ku%^*$^b+gpW2^`bIt>L3+!4P=DE_iLm=tQ5X5U=Tg`xjQn7tH_>T);V z(#B#Xggd(hlMszO_%D)*`yHj{0vDUG5&J!_FgIL`+FrsF+*v`d4)Dic8EyDbCqE&3 zIbr^~xjiH}vX@va!y2Z;3IGq_d#yI+*N<{rod=VzHBQ(eYUv)(1*Ge2pcc#_4dG<- z;-`_bbCcR;-Xknz7+7Qpu*9!?rU&6GrkMR?O<+kFVdQUV#?4oGUcS5^=^9`g4#VT` zT9IZA_0QH*N3YV{!&QQvqO~y|j_A8v4x$#n4qur6x(!MdxPoTx%d+ory&YsyBIR_q zfR7a9$3})B@v2}Rcu*&V!9ry0f>Xbp{`xe4+)I0$ zF{|D%F_ifX6MhH8T^E9L2U^tSW?O>V$Q~R(f;nZl{xxJdD{gQAjR@ew@7)@BCl4;^PV>w>$x5XW z*4xKg8%hd5E(l0p2x6Xpw^nn2u;)bWwppZb(Pe;xgH5YKdhrDR+ zyolF#aOKXNIa1R=l;0jVT=AVrv+2MA~|Ws(oTya z!nl0-tr)O{Jm}9cbX82gr_49u?f?tC2hh_4Sn z#F+h=e{%% zpTIvH_KU+hFkwRQgmWK8?kuoAYk1XEKpLTYz+!fL4;CIgC@~IZpm@u<;BfhRP62Bk z!BFsdPhz>{nijYBH7v8-JMGVaXcqyGo9yGv$PO`ZKuFJ_`+58+D=6iLe6`Lv_^iXs z*d+c&Ad=|`Y0l&*YyV6~3wyxox0HOkvfDO(I!s@#BK>tRSdQ24&rKitzHG5rm8WHZ z0Yap=3q;=EbZEY%k>4vpX0>{W!b|{Wjhx_H-EG`l+MM2_Cinp#oSO%6gnJ`uspHv# zo`vnI6L{bUj^qm&(xxj3&SnpRJ%G57S4tL$7!Rh~fO&gLXhTjt=aHCW4~?{CZURK8 zs)zvinRCo3eN2>pU9iFS?Cad%srzX@!*sx$xCsVS^8XFu=Ataecwy&|!7@)*FDaZU zSX>07AjBg7Q#g`I3L}dG15*SM_>0c8`1xBq0YG zr?^x#f-zhpkIHE6xINtO2HY&pQf0z!Ru1bF6I;#GFR@e*v7jdeXs=X*(fitoP=E z8Ep4ramY`8m^E+`IZ>-t&3pNMQGiwH(z0a_MCJYW@*>;6x}Zm{iVql4DSS$j9>ln))=e` zRQZ~8O}+Xuyk8}EBwq_9NDoWdw|yyN#@T9c%?Z%|C>H}ee1C7IqS(s_mal&qDXorC zjuReEs>->ds{fD&jHO7ub7Rxy-Xe!O8dek6)bNamUfR2d{nrKaJ1v0s>l~Dh=HrhN zqJfpNYDf+yVl@!2xY~QjMP**3tpJs<>lmxk{>`P}cyL4b+@DKWscVkUBGk}-5Fs_A z+jP^FJNq%l3)Vuc3kiTjTm^b)t@nn)o4x6_v1q>qlQIm?&{oS@0ll zP78X@q6Q}yKogii!Pwe^BRP)@++T)0Oc>=_?Unc>q@7i9TL~V(gBQxX61(6WFrXs; z5rh=F-F5RuzNm~cGJk6~ay@pE*(4$TT530o?UsKI4Q+X#S}11qvl725M*G>o z&6_m?u?k6@+4RK609ojQ5W*XZL@>g%b3pve9$XK-DrcD1# zmHpteheyDz5Z6~E{Qiw~I!>k2spHZA@|C!-&iw8$AkKn&Pza5)_0qioqq8}jPw4pmHcc0;FR&(Jj1Yf;AKk?qhw+$5(j0CphU(qD8CApiEi&ic z*SzsOaPET&FZuoJ&vpb!5v0M32+1IHW0$Vv&ebm5yh8G5p^42@F1?oI8^QNSy|V;xuk)&l;SS<>m%8S zO1^TRu4KcYmAzwGuD%+Ph6DmB64Cwk0W)4_wrH&RTYAH134C*81J?kk{S) zvV-a9vm_K682-KHrG&4>ZyIS;Z*3FMY+-@`sCNUMg4q=nbA138v*s1o1@A)kv2Ow3 z{Qem&Azq>o4E9W@V^_}jxZk(}9LVBg)mw63B}JbluyX6B^A}k-T&9{+O6OOvG~Hq< z5HUB^*|PFi4!w`QPoALg-iuUJ&1Z*J6MFYwJiktQwe7tLR(BrnQYff?IledeJf7go zUlX+dJxw77m}|Ur)#j}qeZQw?)(f<99>^ocgY2^%CP_AG@TXx=Ki&v~4uVi4W6wxN$4a zjfwFiZa$)^Tg2FB76o=md;Oy@?Ozb?^^NPkjN1P!6sdVn4~&6_Q@W_RI`=?;+1M}9 zpjT3k|GEslwa=LxfhtJLn*Dytce|D`J~OCysq-w{jA7OeCmXW#pFLowsLt>u_dx2f zdA}?U!-|r-LrxtqICpKp!h;8Iv%|i@WZw~CfCh$$mBf$#Ukz6t4(0lW$JdA%Gz_If z7>uDP6_H3omKkX{A+jr_Bx@&I#VE3`M^1=AC}k`AI;Er{OC?$u9b5K&IY;$-KF-fy zuFH45-tYaM_kN!DdGGuFPqvE#&y2w+d%Ov!a=NyW8iK_Fsd%A`>kBlAnm{t zoA|Lf(*8CH%gZOMkb;L@)IRG6pVRQ;%xCogDV(96D34DD1DaTGC-mB)6Q{6XDlFfx zTtgUJMoYUO72oF4!Z7)W7MJvWda|LitOCHK!Lnz#d`BV%a`G9|^9V{x=3EO^)0x$m zn~B+5F|AzS2T5f!CIil=aD8UP-DmG7t7^I(LDpD1K3_vAbacnvXrw8@+>3l0oN|sF zX&5sAHwTZf&2uKy^2Kig`EBbeL#v-JPDtY(rNO2$xg`v@+E?qtFKbIyg$jqAmnp_d znto6Rxx9z}R+=5TV>em_(7o)Ya6PL7eZ&@m53oD9j?fR(VPtL{x)7W9SdJCo)I;0yrebGp0`(V+u#mY=lRrE-rgagS&}J>U zjbpgD-9ahdv|fj|Lq2049Z+Hphxf`T3>aXFuXK}R0AuYgi2Eq!EHSUEIb9-d7lHTD zNpR^m=KWGZdK6tg6u_(Y`kr)Jl@4{b$CSR@bHS@9trcV%5W6})c756PrXKA-aDzmUoess`4X$Qg)rX6r$wQTO9GP2_^p&}fzr~9 z$uWOC6GtsLSlv~Uxzw&9k;HaDp^@wd3wLLp)kJc$PGm2TIt) zknef6#1^#N$gApobRX!%4|WNPS~Qx}aEHGxy|gk2pTJQDePP|0z&dhAL70?9LVMta z22!5>;+Y|Xxll;)#=y;lcVd2Xna>siGJmnc!f5vQC7ohwgLQ10)WTE6!--U7Sk{FQ znTvkYGabo}OmG;h|LgJ8VlCN}v|O1B0$RM9i>=I$9$dn5?aC3;#2U_0d13 zpzx)d-|QZrc89ty|6)}dau~3)m853eiaI?;?e^YV{9ceOiC_FjS`fPBiB zLL}B3;)C?EDXZ+NaLIg|B#|S(dh&b4p>>X>{dC2#8d>H~Fp?Q1Se{(G30L;M_(9E# zp0?!Up$)+I_VtmAJWXR!;r;QdN=9w+T;diCq0v{X<|BE#LepKp4exZX$x$S>Kxs!+ zOYeQ*g%qZ)7VV1l{Bmy3LrsOFl>p68}moXAFYGyJ|P)-~#&x5qTWQ-V zfa8ZD*p5|C9^SxS-?u;ToxIVRBRn&%Jd;CDyX?fvZuQO7fNEt#hyOr4wG-k?1daGc{ zMeJ4bdacO8LyEAZ(50$nKye^-b1cP2uHgP@J#CThG>4r9SH~#KI?#r$9XVu$n_wXB@PMaJ(dA@e$U=wOb2BrAHT0886{0VdpU-}ff{g^E zVJReKzkLQWkKvQt=R~{Nn45eh_jY`~%Y)WYV9&vi>5EP^;L&IOc4zk{&Nj?14^uIG z_j13PV~Ua6wDMo>KvU9%?5^;>N}=LD_GBxezhjH13Q6bp!_GN2?@mP8xhNSOS_X+B z^hV;)-NBoZOXu9dCf4>5ag>I1NXa;bw`vFc+9YM_#R3u1lL*#RV22$>I_Ol#l z`k8JJht5rR?7)&mnzY}6XGUAbf7^OH;>aC16+5FiuGu}IhqUu@4SWc$i=iFDF5GfT zpE$Y=hVMle?6x|Td}7F}y1A&5EF~^yp2mbx2|rtxTbAWN+dZ~iHbGElgq92q%|y0? zF12vY^?V1MW6x#C`12-C5xZ@C{l_vZ=s;VA(_Lg{+co)k^IQE0J!nvlN1#tk?e>qJ zW7Dd~5e>+s@i(MRL;A6a>!ibWMZAn**y3zOXl`d3WP@7{1T{Ho}G2z2-|P-!Th4FYq_9Y{rMM6UJacHit>{8<+T0^`TIuIj{iR{8i}%3KhS>;!!=aOyh!C(jqzhKA zOUgxYB!+7072-bKj{qy6RakewT{M;>*7|q9Y+c5iBsXS;d2G_V`Fj!8&=0o;!fP~Rt7RgfYEO%;B0J-TNbY*^E^uN~U=jvr z91U>uyvj=y2O93(9zjh8@6@g8MM6Gq(To0;qL}&Dp^GU}Yip&<1s5}z@Wq7U+cIl|Zv6C`PCaA$Ym4&J)Z-xtMDp96V zZ&E$XJpel3tV*p@G1$#0EG>t(s6RPhR4{!YX3*x;!f65wf_e{)O4*#GFpY6#*{?6) z50_>h=k^ZJaL;((F8K&dYU0smliR^3d^l%akYGsYe38ns!}M-ZVH=zq6<@ zlaf0yIsWEnt@@%B>g+>6_sL#vR}xcFxJ1@T-^g1rxQl$Ovb<0;t@ED7t3zKHFsc9V zws>kW1fmv=l#}!zze7k^KE*h1^D^|Z2f-kUsy(7>LGA#wET3}i8sd>>nl1D_8CI1qV=od!;me7D5dk%;S-+ILcOO9Ro=qh| zDYeSKeoc1oV<0*r&9my%2)V40&0(jGR@*WSN)p1((6U~ZJT&$&gj^^qy*3l>X{XJlf`xD1?Yi)r%yzT;7wXK-9t zbDSy0{BG1)p(=*shsy7a)-`h@i>u3OigV+X8F4Ob8Lug(%r^3{kOG~x{mbFVQPRN}gqI}92u1|o-gd?cQZZcE?5!+}UZB{vqwu>R bm6XmVgc)n>CNLG;G4MmzXXq8_I)?lY<%$;P literal 0 HcmV?d00001 diff --git a/Projects/Foundations/Icons/snap-position.png b/Projects/Foundations/Icons/snap-position.png new file mode 100644 index 0000000000000000000000000000000000000000..267719511cd5df1f7f7c8c70b6c86f6fb99042c3 GIT binary patch literal 24302 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�`i9 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 literal 0 HcmV?d00001 diff --git a/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js b/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js index b37988487..52103191d 100644 --- a/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js +++ b/Projects/Foundations/UI/Function-Libraries/ActionSwitch.js @@ -779,6 +779,50 @@ function newFoundationsActionSwitch() { UI.projects.foundations.functionLibraries.socialBotsFunctions.sendSlackTestMessage(action.node, action.callBackFunction) } break + case 'Copy Position': + { + UI.projects.foundations.utilities.clipboard.copyTextToClipboard( action.node.payload.position.x + ';' + action.node.payload.position.y) + action.node.payload.uiObject.setInfoMessage('Position copied') + } + break + case 'Snap to Position': + { + navigator.clipboard.readText() + .then(text => { + //console.log('Pasted content: ', text); + let newPosition = { + x: 0, + y: 0 + } + let newVector = { + x: 0, + y: 0 + } + let positionArray = text.split(";",2) + + newPosition.x = positionArray[0] + newPosition.y = positionArray[1] + + if (newPosition.x >= 0 && newPosition.x <= UI.projects.foundations.spaces.floatingSpace.container.frame.width) { + newVector.x = newPosition.x - action.node.payload.position.x + + if (newPosition.y >= 0 && newPosition.y <= UI.projects.foundations.spaces.floatingSpace.container.frame.height) { + + newVector.y = newPosition.y - action.node.payload.position.y + action.node.payload.floatingObject.container.displace(newVector) + action.node.payload.uiObject.setInfoMessage('Snapped to new position') + } + } + else { + action.node.payload.uiObject.setErrorMessage('[Error]:Failed to read clipboard contents') + } + }) + .catch(err => { + console.error('[Error]:Failed to read clipboard contents: ', err); + action.node.payload.uiObject.setErrorMessage('[Error]:Failed to read clipboard contents') + }); + } + break } } } diff --git a/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js b/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js index 1a5c0c8bd..32cbf727d 100644 --- a/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js +++ b/Projects/Foundations/UI/Spaces/Floating-Space/UiObjectConstructor.js @@ -365,6 +365,38 @@ function newUiObjectConstructor() { } ) } + menuItemsInitialValues.push( + { + action: 'Copy Position', + actionFunction: floatingObject.payload.executeAction, + actionProject: 'Foundations', + label: undefined, + visible: true, + //placeholder icon : https://www.iconpacks.net/free-icon/pin-48.html + iconPathOn: 'copy-position', + iconPathOff: 'copy-position', + rawRadius: 12, + targetRadius: 0, + currentRadius: 0, + ring: 2 + } + ) + menuItemsInitialValues.push( + { + action: 'Snap to Position', + actionFunction: floatingObject.payload.executeAction, + actionProject: 'Foundations', + label: undefined, + visible: true, + //placeholder icon: https://www.iconpacks.net/free-icon/pins-53.html + iconPathOn: 'snap-position', + iconPathOff: 'snap-position', + rawRadius: 12, + targetRadius: 0, + currentRadius: 0, + ring: 2 + } + ) menuItemsInitialValues.push( { action: 'Parent Detach', From 9b1a54999acb4a0e425c2b8b0c340dec78899876 Mon Sep 17 00:00:00 2001 From: Smidy13 <77650800+Smidy13@users.noreply.github.com> Date: Sun, 12 Sep 2021 20:51:13 +1200 Subject: [PATCH 43/65] Bug Fix: Fast Forward in the Future --- .../Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js index a1f6f0253..08525fa48 100644 --- a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js +++ b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js @@ -494,6 +494,11 @@ while (foundDate !== true) { + /* If we are in the future then return the current (blank) array */ + if (new Date(since) <= new Date) { + return OHLCVs + } + await new Promise(resolve => setTimeout(resolve, rateLimit)) // rate limit const nextValidOHLCVs = useFetchTradesForFetchOHLCVs ? await fetchTradesForOHLCV(symbol, '1m', since, limit, params) : From 2a6515b2afec92f03f2b48979a002619973561f5 Mon Sep 17 00:00:00 2001 From: Smidy13 <77650800+Smidy13@users.noreply.github.com> Date: Sun, 12 Sep 2021 21:00:27 +1200 Subject: [PATCH 44/65] Bug Fix: Fast Forward into the Future --- .../Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js index 08525fa48..0e8fb55fc 100644 --- a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js +++ b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js @@ -494,8 +494,7 @@ while (foundDate !== true) { - /* If we are in the future then return the current (blank) array */ - if (new Date(since) <= new Date) { + if (new Date(since).valueOf() >= (new Date).setSeconds(0,0)) { return OHLCVs } From 2b92426d9cf3e1a93a364a37cf90ea2962d9e6eb Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 12 Sep 2021 11:01:21 +0200 Subject: [PATCH 45/65] Posts being sent to Users Social Trading Repo --- .gitignore | 1 + .vscode/settings.json | 6 +- Desktop/UI/WebApp.js | 58 +++++- Desktop/WebServer/index.html | 2 +- .../SA/Utilities/FilesAndDirectories.js | 49 ++++- .../SA/Utilities/MiscellaneousFunctions.js | 8 +- .../TS/Utilities/MiscellaneousFunctions.js | 43 +--- .../DK/modules/WebAppInterface.js | 65 +++++++ Projects/Social-Trading/NT/Modules/Event.js | 2 - TaskServer/.vscode/settings.json | 6 +- desktop.js | 4 +- package-lock.json | 184 ++++++++++++++++++ package.json | 2 + 13 files changed, 372 insertions(+), 58 deletions(-) diff --git a/.gitignore b/.gitignore index 0ec8e557c..c7aaa09d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ Data-Storage Log-Files My-Workspaces +My-Social-Trading-Data debug.log .DS_Store *.db diff --git a/.vscode/settings.json b/.vscode/settings.json index e94f27f6f..43e1dd87f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,14 +4,16 @@ "**/Documentation": true, "**/Log-Files": true, "**/node_modules": true, - "**/Deprecated-Code": true + "**/Deprecated-Code": true, + "**/My-Social-Trading-Data": true, }, "search.exclude": { "**/Data-Storage": true, "**/Documentation": true, "**/Log-Files": true, "**/node_modules": true, - "**/Deprecated-Code": true + "**/Deprecated-Code": true, + "**/My-Social-Trading-Data": true }, "search.maintainFileSearchCache": true } \ No newline at end of file diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index f2f771d94..5e7aaa244 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -146,8 +146,21 @@ function newWebApp() { if (event.target && event.target.nodeName === "BUTTON") { switch (event.target.name) { + case 'New Post': { + let textArea = document.getElementById("new-post-text-area") + await sendNewPostEvent( + textArea.value + ) + .then(updateTextArea) + .catch(onError) + + function updateTextArea() { + textArea.value = "" + } + break + } case 'Follow Profile': { - await sendUserTargetProfileEvent( + await sendTargetUserProfileEvent( event.target.userProfileId, SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE ) @@ -164,7 +177,7 @@ function newWebApp() { break } case 'Unfollow Profile': { - await sendUserTargetProfileEvent( + await sendTargetUserProfileEvent( event.target.userProfileId, SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE ) @@ -264,7 +277,7 @@ function newWebApp() { table.setAttribute("class", "profile-to-follow-table") } - async function sendUserTargetProfileEvent( + async function sendTargetUserProfileEvent( userProfileId, eventType ) { @@ -274,9 +287,7 @@ function newWebApp() { async function asyncCall(resolve, reject) { let eventMessage let event - /* - Test Query User Profiles. - */ + eventMessage = { eventType: eventType, eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), @@ -301,4 +312,39 @@ function newWebApp() { } } } + + async function sendNewPostEvent( + postText + ) { + + return new Promise((resolve, reject) => { asyncCall(resolve, reject) }) + + async function asyncCall(resolve, reject) { + let eventMessage + let event + + eventMessage = { + eventType: SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST, + eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), + text: postText + } + + event = { + requestType: 'Event', + eventMessage: JSON.stringify(eventMessage) + } + + await UI.projects.socialTrading.modules.webSocketsClient.sendMessage( + JSON.stringify(event) + ) + .then(resolve) + .catch(onError) + + function onError(errorMessage) { + console.log('[ERROR] Event not executed. ' + errorMessage) + console.log('[ERROR] event = ' + JSON.stringify(event)) + reject(errorMessage) + } + } + } } diff --git a/Desktop/WebServer/index.html b/Desktop/WebServer/index.html index fb3d12d3d..0f0c0a561 100644 --- a/Desktop/WebServer/index.html +++ b/Desktop/WebServer/index.html @@ -138,7 +138,7 @@ Permissions - Tool Bar + Tool Bar diff --git a/Projects/Foundations/SA/Utilities/FilesAndDirectories.js b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js index 2f7bc485b..43917b759 100644 --- a/Projects/Foundations/SA/Utilities/FilesAndDirectories.js +++ b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js @@ -2,7 +2,9 @@ exports.newFoundationsUtilitiesFilesAndDirectories = function () { let thisObject = { getDirectories: getDirectories, - getAllFilesInDirectoryAndSubdirectories: getAllFilesInDirectoryAndSubdirectories + getAllFilesInDirectoryAndSubdirectories: getAllFilesInDirectoryAndSubdirectories, + pathFromDate: pathFromDate, + mkDirByPathSync: mkDirByPathSync } return thisObject @@ -51,4 +53,49 @@ exports.newFoundationsUtilitiesFilesAndDirectories = function () { return files.reduce((a, f) => a.concat(f), []); } } + + function pathFromDate(timestamp) { + let file = { date: new Date(timestamp) } + file.year = file.date.getUTCFullYear() + file.month = file.date.getUTCMonth() + 1 + file.day = file.date.getUTCDate() + return file.year + '/' + + TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' + + TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2) + } + + /* Function to create folders of missing folders at any path. */ + function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) { + const path = require('path') + + targetDir = targetDir.substring(0, targetDir.lastIndexOf('/') + 1); + + const sep = '/'; + const initDir = path.isAbsolute(targetDir) ? sep : ''; + const baseDir = isRelativeToScript ? __dirname : '.'; + + return targetDir.split(sep).reduce((parentDir, childDir) => { + const curDir = path.resolve(baseDir, parentDir, childDir); + try { + const fs = require('fs') + fs.mkdirSync(curDir); + } catch (err) { + if (err.code === 'EEXIST') { // curDir already exists! + return curDir; + } + + // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows. + if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure. + throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`); + } + + const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1; + if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) { + throw err; // Throw if it's just the last created dir. + } + } + + return curDir; + }, initDir); + } } \ No newline at end of file diff --git a/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js b/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js index 27c00cff2..992619b39 100644 --- a/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js +++ b/Projects/Foundations/SA/Utilities/MiscellaneousFunctions.js @@ -1,7 +1,8 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () { let thisObject = { - genereteUniqueId: genereteUniqueId + genereteUniqueId: genereteUniqueId, + pad: pad } return thisObject @@ -12,4 +13,9 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () { return v.toString(16) }) } + + function pad(str, max) { + str = str.toString(); + return str.length < max ? pad("0" + str, max) : str; + } } \ No newline at end of file diff --git a/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js b/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js index 502378e7d..98d21a40d 100644 --- a/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js +++ b/Projects/Foundations/TS/Utilities/MiscellaneousFunctions.js @@ -2,9 +2,7 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () { let thisObject = { truncateToThisPrecision: truncateToThisPrecision, - pad: pad, - asyncGetDatasetFile: asyncGetDatasetFile, - mkDirByPathSync: mkDirByPathSync + asyncGetDatasetFile: asyncGetDatasetFile } return thisObject @@ -13,11 +11,6 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () { return parseFloat(floatNumber.toFixed(precision)) } - function pad(str, max) { - str = str.toString(); - return str.length < max ? pad("0" + str, max) : str; - } - async function asyncGetDatasetFile(datasetModule, filePath, fileName) { /* This function helps a caller to use await syntax while the called @@ -39,38 +32,4 @@ exports.newFoundationsUtilitiesMiscellaneousFunctions = function () { return promise } - /* Function to create folders of missing folders at any path. */ - function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) { - const path = require('path') - - targetDir = targetDir.substring(0, targetDir.lastIndexOf('/') + 1); - - const sep = '/'; - const initDir = path.isAbsolute(targetDir) ? sep : ''; - const baseDir = isRelativeToScript ? __dirname : '.'; - - return targetDir.split(sep).reduce((parentDir, childDir) => { - const curDir = path.resolve(baseDir, parentDir, childDir); - try { - const fs = require('fs') - fs.mkdirSync(curDir); - } catch (err) { - if (err.code === 'EEXIST') { // curDir already exists! - return curDir; - } - - // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows. - if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure. - throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`); - } - - const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1; - if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) { - throw err; // Throw if it's just the last created dir. - } - } - - return curDir; - }, initDir); - } } \ No newline at end of file diff --git a/Projects/Social-Trading/DK/modules/WebAppInterface.js b/Projects/Social-Trading/DK/modules/WebAppInterface.js index ef3a6bd6f..47524bda3 100644 --- a/Projects/Social-Trading/DK/modules/WebAppInterface.js +++ b/Projects/Social-Trading/DK/modules/WebAppInterface.js @@ -65,6 +65,40 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule } return JSON.stringify(response) } + + if ( + eventMessage.eventType === SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST || + eventMessage.eventType === SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST || + eventMessage.eventType === SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST + ) { + /* + We need to save the post at the User's storage and remove the text from the message + going to the Network Node. + */ + let commitMessage + switch (eventMessage.eventType) { + case SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST: { + commitMessage = "New Post" + break + } + case SA.projects.socialTrading.globals.eventTypes.REPLY_TO_USER_POST: { + commitMessage = "Reply to User Post" + break + } + case SA.projects.socialTrading.globals.eventTypes.REPOST_USER_POST: { + commitMessage = "Repost User Post" + break + } + } + /* + The post text is eliminated, since it is now at the user's storage, + and a hash of the content was generated, and that is what is going to + the Network Node. + */ + eventMessage.emitterPostHash = await savePostAtStorage(eventMessage.text, commitMessage, eventMessage.timestamp) + eventMessage.text = undefined + } + eventMessage.emitterUserProfileId = DK.TEST_NETWORK_CLIENT_USER_PROFILE_ID messageHeader.eventMessage = JSON.stringify(eventMessage) @@ -84,4 +118,35 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule } } } + + async function savePostAtStorage(text, commitMessage, timestamp) { + const { createHash } = await import('crypto') + const hash = createHash('sha256') + let post = { + timestamp: timestamp, + text: text + } + + const fileContent = JSON.stringify(post, undefined, 4) + const fileHash = hash.update(fileContent).digest('hex') + const fileName = fileHash + ".json" + + let filePath = './My-Social-Trading-Data/User-Posts/' + SA.projects.foundations.utilities.filesAndDirectories.pathFromDate(timestamp) + + TS.projects.foundations.utilities.miscellaneousFunctions.mkDirByPathSync(filePath) + SA.nodeModules.fs.writeFileSync(filePath + '/' + fileName, fileContent) + + const options = { + baseDir: process.cwd() + '/My-Social-Trading-Data', + binary: 'git', + maxConcurrentProcesses: 6, + } + const git = SA.nodeModules.simpleGit(options) + + await git.add('./*') + await git.commit(commitMessage) + await git.push('origin') + + return fileHash + } } \ No newline at end of file diff --git a/Projects/Social-Trading/NT/Modules/Event.js b/Projects/Social-Trading/NT/Modules/Event.js index 7db74847a..f0bf34040 100644 --- a/Projects/Social-Trading/NT/Modules/Event.js +++ b/Projects/Social-Trading/NT/Modules/Event.js @@ -139,8 +139,6 @@ exports.newSocialTradingModulesEvent = function newSocialTradingModulesEvent() { emitterUserProfile.addPost( thisObject.emitterUserProfileId, thisObject.targetUserProfileId, - thisObject.emitterBotProfileId, - thisObject.targetBotProfileId, thisObject.emitterPostHash, thisObject.targetPostHash, thisObject.eventType - 10, diff --git a/TaskServer/.vscode/settings.json b/TaskServer/.vscode/settings.json index e94f27f6f..43e1dd87f 100644 --- a/TaskServer/.vscode/settings.json +++ b/TaskServer/.vscode/settings.json @@ -4,14 +4,16 @@ "**/Documentation": true, "**/Log-Files": true, "**/node_modules": true, - "**/Deprecated-Code": true + "**/Deprecated-Code": true, + "**/My-Social-Trading-Data": true, }, "search.exclude": { "**/Data-Storage": true, "**/Documentation": true, "**/Log-Files": true, "**/node_modules": true, - "**/Deprecated-Code": true + "**/Deprecated-Code": true, + "**/My-Social-Trading-Data": true }, "search.maintainFileSearchCache": true } \ No newline at end of file diff --git a/desktop.js b/desktop.js index 67f933c20..a4ee44975 100644 --- a/desktop.js +++ b/desktop.js @@ -44,7 +44,9 @@ SA.nodeModules = { web3: require('web3'), ws: require('ws'), open: require('open'), - http: require('http') + http: require('http'), + octokit: require("@octokit/rest"), + simpleGit: require('simple-git') } /* diff --git a/package-lock.json b/package-lock.json index 469e05fe0..d801cc66a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -220,6 +220,145 @@ "@ethersproject/strings": "^5.4.0" } }, + "@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "requires": { + "debug": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, + "@octokit/auth-token": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", + "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", + "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "requires": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.0", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "requires": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.1.1.tgz", + "integrity": "sha512-ygp/6r25Ezb1CJuVMnFfOsScEtPF0zosdTJDZ7mZ+I8IULl7DP1BS5ZvPRwglcarGPXOvS5sHdR0bjnVDDfQdQ==" + }, + "@octokit/plugin-paginate-rest": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.0.tgz", + "integrity": "sha512-8YYzALPMvEZ35kgy5pdYvQ22Roz+BIuEaedO575GwE2vb/ACDqQn0xQrTJR4tnZCJn7pi8+AWPVjrFDaERIyXQ==", + "requires": { + "@octokit/types": "^6.26.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==" + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.10.1.tgz", + "integrity": "sha512-Rf1iMl40I0dIxjh1g32qZ6Ym/uT8QWZMm2vYGG5Vi8SX1MwZvbuxEGXYgmzTUWSD3PYWSLilE2+4L8kmdLGTMg==", + "requires": { + "@octokit/types": "^6.27.0", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz", + "integrity": "sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ==", + "requires": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", + "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", + "requires": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.9.0" + } + }, + "@octokit/types": { + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.27.0.tgz", + "integrity": "sha512-ha27f8DToxXBPEJdzHCCuqpw7AgKfjhWGdNf3yIlBAhAsaexBXTfWw36zNSsncALXGvJq4EjLy1p3Wz45Aqb4A==", + "requires": { + "@octokit/openapi-types": "^10.1.0" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -357,6 +496,11 @@ "tweetnacl": "^0.14.3" } }, + "before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==" + }, "bignumber.js": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", @@ -807,6 +951,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -1561,6 +1710,11 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -2335,6 +2489,31 @@ "simple-concat": "^1.0.0" } }, + "simple-git": { + "version": "2.45.1", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.45.1.tgz", + "integrity": "sha512-NmEoThiLTJxl26WNtZxtJTue18ReTcSrf3so5vJG/O8KY9uMxH+yAhXV/DElBJyOYZrrBbVsH8JOFxgENdc9Xg==", + "requires": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -2570,6 +2749,11 @@ "which-boxed-primitive": "^1.0.2" } }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", diff --git a/package.json b/package.json index d083084f8..e59e25f2d 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,10 @@ { "dependencies": { + "@octokit/rest": "^18.10.0", "http": "0.0.1-security", "node-fetch": "^2.6.1", "open": "^8.2.1", + "simple-git": "^2.45.1", "web3": "^1.5.2", "ws": "^8.2.1" } From f77aa3d1c5ecc2f8250111845fa20c5832ec874a Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sun, 12 Sep 2021 11:19:57 +0200 Subject: [PATCH 46/65] Posts being recorded at User's own Github repo. --- Desktop/UI/WebApp.js | 6 ++++-- .../SA/Utilities/FilesAndDirectories.js | 4 ++-- .../API-Data-Fetcher-Bot/FetchingProcess.js | 4 ++-- .../BollingerBandsMultiTimeFrameDaily.js | 20 +++++++++---------- .../BollingerBandsMultiTimeFrameMarket.js | 2 +- .../CandlesVolumesMultiTimeFrameDaily.js | 18 ++++++++--------- .../CandlesVolumesMultiTimeFrameMarket.js | 10 +++++----- .../FromOneMinToMultiTimeFrameDaily.js | 4 ++-- .../Indicator-Bot/MultiTimeFrameDaily.js | 12 +++++------ .../Indicator-Bot/MultiTimeFrameMarket.js | 2 +- .../LearningSimulation.js | 4 ++-- .../Exchange-Raw-Data/HistoricOHLCVs.js | 18 ++++++++--------- .../TradingSimulation.js | 4 ++-- .../DataDependenciesFunctions.js | 4 ++-- .../FromOneMinToMultiTimeFrameFunctions.js | 8 ++++---- .../OutputManagementFunctions.js | 4 ++-- .../SingleMarketFunctions.js | 2 +- .../TS/Task-Modules/FileStorage.js | 2 +- .../DK/modules/WebAppInterface.js | 4 ++-- .../TensorFlowLibrary.js | 2 +- 20 files changed, 68 insertions(+), 66 deletions(-) diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index 5e7aaa244..037b5d7f8 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -291,7 +291,8 @@ function newWebApp() { eventMessage = { eventType: eventType, eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), - targetUserProfileId: userProfileId + targetUserProfileId: userProfileId, + timestamp: new Date() } event = { @@ -326,7 +327,8 @@ function newWebApp() { eventMessage = { eventType: SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST, eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), - text: postText + text: postText, + timestamp: new Date() } event = { diff --git a/Projects/Foundations/SA/Utilities/FilesAndDirectories.js b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js index 43917b759..4ebe10379 100644 --- a/Projects/Foundations/SA/Utilities/FilesAndDirectories.js +++ b/Projects/Foundations/SA/Utilities/FilesAndDirectories.js @@ -60,8 +60,8 @@ exports.newFoundationsUtilitiesFilesAndDirectories = function () { file.month = file.date.getUTCMonth() + 1 file.day = file.date.getUTCDate() return file.year + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2) } /* Function to create folders of missing folders at any path. */ diff --git a/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js b/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js index a928504a8..d45ca4cc6 100644 --- a/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js +++ b/Projects/Foundations/TS/Bot-Modules/API-Data-Fetcher-Bot/FetchingProcess.js @@ -922,8 +922,8 @@ exports.newFoundationsBotModulesFetchingProcess = function (processIndex) { file.month = file.date.getUTCMonth() + 1 file.day = file.date.getUTCDate() let dateForPath = file.year + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2) /* We will need to save this at the Status Report */ contextVariables.lastFile = file.date diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js index 8bd814581..7fdba9a41 100644 --- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js +++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameDaily.js @@ -270,8 +270,8 @@ /* Telling the world we are alive and doing well */ let currentDateString = processDate.getUTCFullYear() + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); let currentDate = new Date(processDate) let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage) @@ -322,8 +322,8 @@ try { let dateForPath = previousDay.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2); let fileName = "Data.json" let filePathRoot = 'Project/' + @@ -368,8 +368,8 @@ try { let dateForPath = processDate.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); let fileName = "Data.json" let filePathRoot = 'Project/' + @@ -584,8 +584,8 @@ let dateForPath = processDate.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); let fileName = 'Data.json'; let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + @@ -654,8 +654,8 @@ let dateForPath = processDate.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2); let fileName = 'Data.json'; let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js index a5f2add12..77415d46e 100644 --- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js +++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Bollinger-Bands/BollingerBandsMultiTimeFrameMarket.js @@ -406,7 +406,7 @@ } /* Telling the world we are alive and doing well */ - let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2); + let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2); let currentDate = new Date(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat( processIndex, diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js index cb7d5f138..83cf08131 100644 --- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js +++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameDaily.js @@ -232,8 +232,8 @@ /* Telling the world we are alive and doing well */ let currentDateString = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) let currentDate = new Date(contextVariables.datetimeLastProducedFile) let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage) @@ -272,8 +272,8 @@ function nextCandleFile() { let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) let fileName = "Data.json" let filePathRoot = @@ -396,7 +396,7 @@ function nextVolumeFile() { try { - let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); + let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); let fileName = "Data.json" let filePathRoot = 'Project/' + @@ -540,8 +540,8 @@ let fileName = 'Data.json'; let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + @@ -588,8 +588,8 @@ let fileName = 'Data.json'; let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js index 1449400ed..0ca8fa025 100644 --- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js +++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/Candles-Volumes/CandlesVolumesMultiTimeFrameMarket.js @@ -412,8 +412,8 @@ /* Telling the world we are alive and doing well */ let currentDateString = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); let currentDate = new Date(contextVariables.datetimeLastProducedFile) let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage) @@ -509,7 +509,7 @@ nextCandleFile(); function nextCandleFile() { - let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); + let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); let fileName = "Data.json" let filePathRoot = @@ -635,8 +635,8 @@ let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2); let fileName = "Data.json" let filePathRoot = diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js index c0bd82e22..93c384207 100644 --- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js +++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/FromOneMinToMultiTimeFrameDaily.js @@ -160,8 +160,8 @@ exports.newFoundationsBotModulesFromOneMinToMultiTimeFrameDaily = function (proc file.month = file.date.getUTCMonth() + 1 file.day = file.date.getUTCDate() let dateForPath = file.year + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.month, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(file.day, 2) let fileName = 'Data.json' let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js index de57bc8ba..681896424 100644 --- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js +++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameDaily.js @@ -275,8 +275,8 @@ /* Telling the world we are alive and doing well */ let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCFullYear() + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2) let currentDate = new Date(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME) let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage) @@ -360,8 +360,8 @@ function getPreviousFile() { let dateForPath = previousDay.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(previousDay.getUTCDate(), 2) let filePath if (dependency.referenceParent.config.codeName === "Multi-Time-Frame-Daily") { filePath = dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel + "/" + dateForPath; @@ -412,8 +412,8 @@ function getCurrentFile() { let dateForPath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).DAILY_FILES_PROCESS_DATETIME.getUTCDate(), 2) let filePath if (dependency.referenceParent.config.codeName === "Multi-Time-Frame-Daily") { filePath = dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel + "/" + dateForPath; diff --git a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js index efe597995..739a7dc5d 100644 --- a/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js +++ b/Projects/Foundations/TS/Bot-Modules/Indicator-Bot/MultiTimeFrameMarket.js @@ -224,7 +224,7 @@ } /* Telling the world we are alive and doing well */ - let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2) + let currentDateString = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME.getUTCDate(), 2) let currentDate = new Date(TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).PROCESS_DATETIME) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat( processIndex, diff --git a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js index ab8b96dcf..7e2548f3f 100644 --- a/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js +++ b/Projects/Foundations/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/LearningSimulation.js @@ -317,7 +317,7 @@ exports.newFoundationsBotModulesLearningSimulation = function (processIndex) { let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime) let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime) - let currentDateString = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) + let currentDateString = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) let currentDate = new Date(heartBeatDate) let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate) /* @@ -327,7 +327,7 @@ exports.newFoundationsBotModulesLearningSimulation = function (processIndex) { if (heartBeatDate.valueOf() !== previousHeartBeatDate) { previousHeartBeatDate = heartBeatDate.valueOf() - let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) + let processingDate = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] runSimulation -> loop -> Simulation ' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + learningEngine.learningCurrent.learningEpisode.candle.index.value + ' @ ' + processingDate) diff --git a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js index a1f6f0253..64d03654e 100644 --- a/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js +++ b/Projects/Foundations/TS/Bot-Modules/Sensor-Bot/Exchange-Raw-Data/HistoricOHLCVs.js @@ -258,8 +258,8 @@ let fileName = "Data.json" let datetime = new Date(lastFile.valueOf()) let dateForPath = datetime.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2) let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + OHLCVS_FOLDER_NAME + '/' + dateForPath; let fullFileName = filePath + '/' + fileName fileStorage.getTextFile(fullFileName, onFileReceived) @@ -368,7 +368,7 @@ /* Reporting we are doing well */ function heartBeat(noNewInternalLoop) { let processingDate = new Date(since) - processingDate = processingDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); + processingDate = processingDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[INFO] start -> getOHLCVs -> Fetching OHLCVs @ " + processingDate + "-> exchange = " + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name + " -> symbol = " + symbol + " -> since = " + since + " -> limit = " + limit) let heartBeatText = "Fetching " + rawDataArray.length.toFixed(0) + " OHLCVs from " + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.name + " " + symbol + " @ " + processingDate @@ -476,7 +476,7 @@ } let processingDate = new Date(earliestMarketSince) - processingDate = processingDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); + processingDate = processingDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, "Invalid or No Start Date. Finding Market Start @ " + processingDate, 0) } } @@ -509,7 +509,7 @@ } let processingDate = new Date(since) - processingDate = processingDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); + processingDate = processingDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, "No Data Found. Fast-Forwarding to Next Data @ " + processingDate, 0) } } @@ -945,8 +945,8 @@ let processingDate = new Date(candle.begin) processingDate = processingDate.getUTCFullYear() + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCMonth() + 1, 2) + '-' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processingDate.getUTCDate(), 2); TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[INFO] start -> saveOHLCVs -> Before Fetch -> Saving OHLCVs @ " + processingDate + " -> ohlcvArrayIndex = " + ohlcvArrayIndex + " -> total = " + rawDataArray.length) @@ -1048,8 +1048,8 @@ function getFilePath(timestamp, folderName) { let datetime = new Date(timestamp) let dateForPath = datetime.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(datetime.getUTCDate(), 2) let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + folderName + '/' + dateForPath; return filePath } diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js index 3e8d114ae..bcc9a2a6a 100644 --- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js +++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/TradingSimulation.js @@ -308,7 +308,7 @@ exports.newFoundationsBotModulesTradingSimulation = function (processIndex) { let fromDate = new Date(sessionParameters.timeRange.config.initialDatetime) let lastDate = new Date(sessionParameters.timeRange.config.finalDatetime) - let currentDateString = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) + let currentDateString = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) let currentDate = new Date(heartBeatDate) let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate) /* @@ -318,7 +318,7 @@ exports.newFoundationsBotModulesTradingSimulation = function (processIndex) { if (heartBeatDate.valueOf() !== previousHeartBeatDate) { previousHeartBeatDate = heartBeatDate.valueOf() - let processingDate = heartBeatDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) + let processingDate = heartBeatDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(heartBeatDate.getUTCDate(), 2) TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[INFO] runSimulation -> loop -> Simulation ' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_KEY + ' Loop # ' + tradingEngine.tradingCurrent.tradingEpisode.candle.index.value + ' @ ' + processingDate) diff --git a/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js b/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js index df57c8548..d80fb517a 100644 --- a/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/DataDependenciesFunctions.js @@ -241,7 +241,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () { processDate ) { /* Telling the world we are alive and doing well and which date we are processing right now. */ - let processingDateString = processDate.getUTCFullYear() + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2) + let processingDateString = processDate.getUTCFullYear() + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCMonth() + 1, 2) + '-' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(processDate.getUTCDate(), 2) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, processingDateString, undefined, "Running...") /* @@ -327,7 +327,7 @@ exports.newFoundationsFunctionLibrariesDataDependenciesFunctions = function () { async function getDataFileFromDate(dataFileDate) { - let dateForPath = dataFileDate.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCDate(), 2) + let dateForPath = dataFileDate.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(dataFileDate.getUTCDate(), 2) let filePath = dependency.referenceParent.parentNode.config.codeName + '/' + dependency.referenceParent.config.codeName + "/" + timeFrameLabel + "/" + dateForPath let fileName = "Data.json" diff --git a/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js b/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js index 17358b319..7300d33b0 100644 --- a/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/FromOneMinToMultiTimeFrameFunctions.js @@ -329,8 +329,8 @@ exports.newFoundationsFunctionLibrariesFromOneMinToMultiTimeFrameFunctions = fun /* Telling the world we are alive and doing well */ let currentDateString = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '-' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) let currentDate = new Date(contextVariables.datetimeLastProducedFile) let percentage = TS.projects.foundations.utilities.dateTimeFunctions.getPercentage(fromDate, currentDate, lastDate) TS.projects.foundations.functionLibraries.processFunctions.processHeartBeat(processIndex, currentDateString, percentage) @@ -360,8 +360,8 @@ exports.newFoundationsFunctionLibrariesFromOneMinToMultiTimeFrameFunctions = fun const ONE_MIN_DATASET_TYPE = "One-Min" let dateForPath = contextVariables.datetimeLastProducedFile.getUTCFullYear() + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + - TS.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCMonth() + 1, 2) + '/' + + SA.projects.foundations.utilities.miscellaneousFunctions.pad(contextVariables.datetimeLastProducedFile.getUTCDate(), 2) let fileName = "Data.json" diff --git a/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js b/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js index 6efcdbe5e..35daf7769 100644 --- a/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/OutputManagementFunctions.js @@ -117,7 +117,7 @@ exports.newFoundationsFunctionLibrariesOutputManagementFunctions = function () { if (dataset.config.type === 'Daily Files') { - let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2); + let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2); let fileName = 'Data.json' let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + '/Output/' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + '/' + dataset.parentNode.config.codeName + '/' + dataset.config.codeName + '/' + timeFrameLabel + "/" + dateForPath @@ -181,7 +181,7 @@ exports.newFoundationsFunctionLibrariesOutputManagementFunctions = function () { if (dataset.config.type === 'Daily Files') { - let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2); + let dateForPath = tradingProcessDate.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(tradingProcessDate.getUTCDate(), 2); let fileName = 'Data.json' let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + '/Output/' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + '/' + dataset.parentNode.config.codeName + '/' + dataset.config.codeName + '/' + timeFrameLabel + "/" + dateForPath diff --git a/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js b/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js index fe7426af1..b0904da95 100644 --- a/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js +++ b/Projects/Foundations/TS/Function-Libraries/SingleMarketFunctions.js @@ -563,7 +563,7 @@ let dateForPath = '' if (processingDailyFiles === true) { - dateForPath = "/" + currentDay.getUTCFullYear() + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCMonth() + 1, 2) + '/' + TS.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCDate(), 2); + dateForPath = "/" + currentDay.getUTCFullYear() + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCMonth() + 1, 2) + '/' + SA.projects.foundations.utilities.miscellaneousFunctions.pad(currentDay.getUTCDate(), 2); } let filePathRoot = 'Project/' + contextSummary.project + "/" + contextSummary.mineType + "/" + contextSummary.dataMine + "/" + contextSummary.bot + '/' + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.parentNode.parentNode.config.codeName + "/" + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "-" + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName diff --git a/Projects/Foundations/TS/Task-Modules/FileStorage.js b/Projects/Foundations/TS/Task-Modules/FileStorage.js index 0d3cb7c62..97cd5a7f6 100644 --- a/Projects/Foundations/TS/Task-Modules/FileStorage.js +++ b/Projects/Foundations/TS/Task-Modules/FileStorage.js @@ -244,7 +244,7 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { logger.write(MODULE_NAME, '[INFO] FileStorage -> createTextFile -> fileLocation: ' + fileLocation) /* If necesary a folder or folders are created before writing the file to disk. */ - TS.projects.foundations.utilities.miscellaneousFunctions.mkDirByPathSync(fileLocation) + SA.projects.foundations.utilities.filesAndDirectories.mkDirByPathSync(fileLocation) /* Here we write the file with a temporary name so as to avoid dirty read from other processes. diff --git a/Projects/Social-Trading/DK/modules/WebAppInterface.js b/Projects/Social-Trading/DK/modules/WebAppInterface.js index 47524bda3..5c43a13e4 100644 --- a/Projects/Social-Trading/DK/modules/WebAppInterface.js +++ b/Projects/Social-Trading/DK/modules/WebAppInterface.js @@ -131,9 +131,9 @@ exports.newSocialTradingModulesWebAppInterface = function newSocialTradingModule const fileHash = hash.update(fileContent).digest('hex') const fileName = fileHash + ".json" - let filePath = './My-Social-Trading-Data/User-Posts/' + SA.projects.foundations.utilities.filesAndDirectories.pathFromDate(timestamp) + let filePath = './My-Social-Trading-Data/User-Posts/' + SA.projects.foundations.utilities.filesAndDirectories.pathFromDate(timestamp) - TS.projects.foundations.utilities.miscellaneousFunctions.mkDirByPathSync(filePath) + SA.projects.foundations.utilities.filesAndDirectories.mkDirByPathSync(filePath + '/') SA.nodeModules.fs.writeFileSync(filePath + '/' + fileName, fileContent) const options = { diff --git a/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js b/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js index 319a88b0b..1b17f2013 100644 --- a/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js +++ b/Projects/TensorFlow/TS/Bot-Modules/Learning-Bot/Low-Frequency-Learning/TensorFlowLibrary.js @@ -120,7 +120,7 @@ exports.newTensorFlowBotModulesTensorFlowLibrary = function (processIndex) { async function saveModel() { let fileLocation = getModelPath(); /* If necesary a folder or folders are created before writing the file to disk: */ - TS.projects.foundations.utilities.miscellaneousFunctions.mkDirByPathSync(fileLocation); + SA.projects.foundations.utilities.filesAndDirectories.mkDirByPathSync(fileLocation); const savedModel = await tensorFlowModelsManager.model.save('file://' + fileLocation); } From dbb03c4aee0617999a8025b5330f98dfcce04308 Mon Sep 17 00:00:00 2001 From: hellarnasstrom Date: Sun, 12 Sep 2021 12:25:20 +0200 Subject: [PATCH 47/65] User Profile hellarnasstrom --- .../Plugins/User-Profiles/hellarnasstrom.json | 362 ++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 Projects/Governance/Plugins/User-Profiles/hellarnasstrom.json diff --git a/Projects/Governance/Plugins/User-Profiles/hellarnasstrom.json b/Projects/Governance/Plugins/User-Profiles/hellarnasstrom.json new file mode 100644 index 000000000..87d80c125 --- /dev/null +++ b/Projects/Governance/Plugins/User-Profiles/hellarnasstrom.json @@ -0,0 +1,362 @@ +{ + "type": "User Profile", + "name": "hellarnasstrom", + "config": "{\n \"signature\": {\n \"message\": \"hellarnasstrom\",\n \"messageHash\": \"0xdaf65d25729a9dea1d942565fe97a77a3d0ad39748ba97d4e75edbd6cfb3ba69\",\n \"v\": \"0x1b\",\n \"r\": \"0x2ae23edd6239dfbafe72632cb550225a3daa4a6b5fe9b2256a987d66e21d1836\",\n \"s\": \"0x5d9645529959dd53eb8043d07900fb71997d47328963221ece85a64ae374a080\",\n \"signature\": \"0x2ae23edd6239dfbafe72632cb550225a3daa4a6b5fe9b2256a987d66e21d18365d9645529959dd53eb8043d07900fb71997d47328963221ece85a64ae374a0801b\"\n }\n}", + "project": "Governance", + "tokenPowerSwitch": { + "type": "Token Power Switch", + "name": "New Token Power Switch", + "config": "{}", + "project": "Governance", + "tokenPowerSwitch": [], + "onboardingPrograms": { + "type": "Onboarding Programs", + "name": "New Onboarding Programs", + "config": "{}", + "project": "Governance", + "airdropProgram": { + "type": "Airdrop Program", + "name": "New Airdrop Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "ce3d6b8b-140c-486c-b81d-2867d8f91bf3", + "savedPayload": { + "position": { + "x": 14594, + "y": 9958.077136594007 + }, + "targetPosition": { + "x": 14744, + "y": 10217.884757729338 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "53473ffb-9cd1-47a6-bf2d-91589f9ac1b0", + "savedPayload": { + "position": { + "x": 14744, + "y": 10217.884757729338 + }, + "targetPosition": { + "x": 14894, + "y": 10477.692378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "githubProgram": { + "type": "Github Program", + "name": "New Github Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "86265f29-a7e5-4e8e-b5c7-a7dc408c6d75", + "savedPayload": { + "position": { + "x": 15494, + "y": 10477.692378864669 + }, + "targetPosition": { + "x": 15194, + "y": 10477.692378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "c7b309cd-aca8-4fde-b89d-46de14ff8da9", + "savedPayload": { + "position": { + "x": 15194, + "y": 10477.692378864669 + }, + "targetPosition": { + "x": 14894, + "y": 10477.692378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "c02ba517-8246-43da-942c-f0299549370f", + "savedPayload": { + "position": { + "x": 14894, + "y": 10477.692378864669 + }, + "targetPosition": { + "x": 14744, + "y": 10737.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "communityBuildingPrograms": { + "type": "Community Building Programs", + "name": "New Community Building Programs", + "config": "{}", + "project": "Governance", + "referralProgram": { + "type": "Referral Program", + "name": "New Referral Program", + "config": "{}", + "project": "Governance", + "userReferrers": [ + { + "type": "User Referrer", + "name": "", + "config": "{Julian-Molina}", + "project": "Governance", + "id": "c5d2130b-dab9-43f2-adcb-c3faef332073", + "savedPayload": { + "position": { + "x": 15303.807621135331, + "y": 11107.115242270662 + }, + "targetPosition": { + "x": 15044, + "y": 11257.115242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "6c3c64e5-b2ac-425b-a5f0-8fc871a107cf", + "savedPayload": { + "position": { + "x": 15194, + "y": 11516.922863405993 + }, + "targetPosition": { + "x": 15044, + "y": 11257.115242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "c5df6b99-450d-4dd6-a1b4-f4333d12536b", + "savedPayload": { + "position": { + "x": 14784.192378864669, + "y": 11407.115242270662 + }, + "targetPosition": { + "x": 15044, + "y": 11257.115242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "a66cfd08-f566-4bee-a4f7-e2fdc3ec4dde", + "savedPayload": { + "position": { + "x": 15044, + "y": 11257.115242270662 + }, + "targetPosition": { + "x": 14894, + "y": 10997.307621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "77faf241-5d51-4e7f-9b2b-e996eb942c44", + "savedPayload": { + "position": { + "x": 14894, + "y": 10997.307621135331 + }, + "targetPosition": { + "x": 14744, + "y": 10737.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "cc676344-5fc3-44f9-bd61-9d9a0045c510", + "savedPayload": { + "position": { + "x": 14744, + "y": 10737.5 + }, + "targetPosition": { + "x": 14444, + "y": 10737.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "9d88be19-af2f-4305-8fa8-2722f8fbe0cb", + "savedPayload": { + "position": { + "x": 14144, + "y": 10737.5 + }, + "targetPosition": { + "x": 14444, + "y": 10737.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "f93bb5da-dd98-4dcf-92b2-95d86e0e0ed2", + "savedPayload": { + "position": { + "x": 14444, + "y": 10737.5 + }, + "targetPosition": { + "x": 14444, + "y": 10737.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From 12730be0d4dac250da46c4dedff44b293ffab40f Mon Sep 17 00:00:00 2001 From: 9808us <9808us@pm.me> Date: Sun, 12 Sep 2021 14:58:54 +0200 Subject: [PATCH 48/65] User Profile update 9808us --- .../Plugins/User-Profiles/9808us.json | 550 ++++++++++-------- 1 file changed, 292 insertions(+), 258 deletions(-) diff --git a/Projects/Governance/Plugins/User-Profiles/9808us.json b/Projects/Governance/Plugins/User-Profiles/9808us.json index fd65057e3..e7334cd0f 100644 --- a/Projects/Governance/Plugins/User-Profiles/9808us.json +++ b/Projects/Governance/Plugins/User-Profiles/9808us.json @@ -6,13 +6,13 @@ "tokenPowerSwitch": { "type": "Token Power Switch", "name": "New Token Power Switch", - "config": "{\n \"percentage\": 90\n}", + "config": "{}", "project": "Governance", "tokenPowerSwitch": [], "onboardingPrograms": { "type": "Onboarding Programs", "name": "New Onboarding Programs", - "config": "{\n \"percentage\": 10\n}", + "config": "{\n \"percentage\": 0\n }", "project": "Governance", "airdropProgram": { "type": "Airdrop Program", @@ -26,12 +26,12 @@ "id": "85d3b184-0122-4cb3-a83c-b3c00d626767", "savedPayload": { "position": { - "x": 24761.40800640108, - "y": 24813.204681296138 + "x": 13397.771642764716, + "y": 17563.204681296138 }, "targetPosition": { - "x": 24984.3514540443, - "y": 25013.943863203796 + "x": 13620.715090407934, + "y": 17763.943863203796 }, "floatingObject": { "isPinned": false, @@ -49,12 +49,12 @@ "id": "9163e52d-f77c-40b7-b139-960681b28171", "savedPayload": { "position": { - "x": 24984.3514540443, - "y": 25013.943863203796 + "x": 13620.715090407934, + "y": 17763.943863203796 }, "targetPosition": { - "x": 25207.294901687517, - "y": 25214.683045111455 + "x": 13843.658538051151, + "y": 17964.683045111455 }, "floatingObject": { "isPinned": false, @@ -81,12 +81,12 @@ "id": "5ebe2e87-295e-42cc-98f1-c70ee2efa4a3", "savedPayload": { "position": { - "x": 25332.041916178172, - "y": 24627.794484671173 + "x": 13968.405552541806, + "y": 17377.794484671173 }, "targetPosition": { - "x": 25269.668408932845, - "y": 24921.238764891314 + "x": 13906.032045296479, + "y": 17671.238764891314 }, "floatingObject": { "isPinned": false, @@ -104,12 +104,12 @@ "id": "d38054ef-3c0b-43fd-986d-27dd39f72f2c", "savedPayload": { "position": { - "x": 25269.668408932845, - "y": 24921.238764891314 + "x": 13906.032045296479, + "y": 17671.238764891314 }, "targetPosition": { - "x": 25207.294901687517, - "y": 25214.683045111455 + "x": 13843.658538051151, + "y": 17964.683045111455 }, "floatingObject": { "isPinned": false, @@ -127,12 +127,12 @@ "id": "975175a5-fbf2-4775-80c3-175af1bf27ae", "savedPayload": { "position": { - "x": 25207.294901687517, - "y": 25214.683045111455 + "x": 13843.658538051151, + "y": 17964.683045111455 }, "targetPosition": { - "x": 25300, - "y": 25500 + "x": 13936.363636363636, + "y": 18250 }, "floatingObject": { "isPinned": false, @@ -155,23 +155,23 @@ "referralProgram": { "type": "Referral Program", "name": "New Referral Program", - "config": "{\n \"percentage\": 30\n}", + "config": "{}", "project": "Governance", "userReferrers": [ { "type": "User Referrer", - "name": "", + "name": "Luis-Fernando-Molina", "config": "{}", "project": "Governance", - "id": "46674b25-ed29-4c00-90be-3dc849e2af9f", + "id": "10938918-7341-47fd-84ea-ddc86904ec58", "savedPayload": { "position": { - "x": 25672.579175727584, - "y": 24749.70358952681 + "x": 14285.388940725978, + "y": 17500.011926593106 }, "targetPosition": { - "x": 25664.72609123522, - "y": 25049.600787019477 + "x": 14301.089727598861, + "y": 17799.600787019477 }, "floatingObject": { "isPinned": false, @@ -183,7 +183,61 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "User Profile", + "name": "Luis-Fernando-Molina", + "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile", + "Governance", + "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + ] + ] + } + }, + { + "type": "User Referrer", + "name": "Julian-Molina", + "config": "{}", + "project": "Governance", + "id": "d004c04d-aa54-4805-9e92-c7783e0cab0a", + "savedPayload": { + "position": { + "x": 14378.735441129616, + "y": 17509.823039132756 + }, + "targetPosition": { + "x": 14301.089727598861, + "y": 17799.600787019477 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Julian-Molina", + "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11" + }, + "referenceParentCombinedNodePath": [ + [ + "Julian-Molina", + "User Profile", + "Governance", + "1fd95e41-4b22-48d5-be3a-904c37afcb11" + ] + ] } } ], @@ -194,18 +248,18 @@ "id": "1d484ca6-1fc2-4a6f-b6c1-f30ef07dc820", "savedPayload": { "position": { - "x": 25786.74708415796, - "y": 24775.537149726697 + "x": 14501.828909506517, + "y": 17576.65733937626 }, "targetPosition": { - "x": 25664.72609123522, - "y": 25049.600787019477 + "x": 14301.089727598861, + "y": 17799.600787019477 }, "floatingObject": { "isPinned": false, "isFrozen": false, "isCollapsed": false, - "angleToParent": 3, + "angleToParent": 2, "distanceToParent": 3, "arrangementStyle": 0 }, @@ -221,12 +275,12 @@ "id": "4849966e-c897-4222-9c46-b2e425f53810", "savedPayload": { "position": { - "x": 25882.338402538906, - "y": 24843.094414311352 + "x": 14534.233516035953, + "y": 17610.804669704525 }, "targetPosition": { - "x": 25664.72609123522, - "y": 25049.600787019477 + "x": 14301.089727598861, + "y": 17799.600787019477 }, "floatingObject": { "isPinned": false, @@ -244,12 +298,12 @@ "id": "e6e043a7-e486-4c7f-a686-8a031db4c7c5", "savedPayload": { "position": { - "x": 25664.72609123522, - "y": 25049.600787019477 + "x": 14301.089727598861, + "y": 17799.600787019477 }, "targetPosition": { - "x": 25542.705098312483, - "y": 25323.664424312257 + "x": 14179.06873467612, + "y": 18073.664424312257 }, "floatingObject": { "isPinned": false, @@ -272,18 +326,18 @@ "userSupporters": [ { "type": "User Supporter", - "name": "", + "name": "cozed-gh", "config": "{}", "project": "Governance", "id": "554c93e4-0de9-4ce2-a6ff-e8ce272e71cc", "savedPayload": { "position": { - "x": 25991.061666922964, - "y": 25032.498264196627 + "x": 14578.62429950145, + "y": 17759.88994533369 }, "targetPosition": { - "x": 25841.061666922964, - "y": 25292.30588533196 + "x": 14477.425303286602, + "y": 18042.30588533196 }, "floatingObject": { "isPinned": false, @@ -295,23 +349,36 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "User Profile", + "name": "cozed-gh", + "id": "07f0b13a-a50f-4488-8a2c-a3f8f08e889d" + }, + "referenceParentCombinedNodePath": [ + [ + "cozed-gh", + "User Profile", + "Governance", + "07f0b13a-a50f-4488-8a2c-a3f8f08e889d" + ] + ] } }, { "type": "User Supporter", - "name": "", + "name": "Smidy13", "config": "{}", "project": "Governance", - "id": "0d18e74f-dae9-4672-b00a-c997909494ee", + "id": "dab5a34d-1b55-4916-9ef6-a86133e3c4ad", "savedPayload": { "position": { - "x": 26115.125304215744, - "y": 25170.28489240922 + "x": 14691.138132372005, + "y": 17831.766514466763 }, "targetPosition": { - "x": 25841.061666922964, - "y": 25292.30588533196 + "x": 14477.425303286602, + "y": 18042.30588533196 }, "floatingObject": { "isPinned": false, @@ -323,7 +390,98 @@ }, "uiObject": { "isRunning": false - } + }, + "referenceParent": { + "type": "User Profile", + "name": "Smidy13", + "id": "4b5eca40-4d97-454d-91f3-8627a98ef682" + }, + "referenceParentCombinedNodePath": [ + [ + "Smidy13", + "User Profile", + "Governance", + "4b5eca40-4d97-454d-91f3-8627a98ef682" + ] + ] + } + }, + { + "type": "User Supporter", + "name": "PLuv", + "config": "{}", + "project": "Governance", + "id": "af6e4663-d24b-4684-913c-4821312d359a", + "savedPayload": { + "position": { + "x": 14761.32351842635, + "y": 17945.34298809562 + }, + "targetPosition": { + "x": 14477.425303286602, + "y": 18042.30588533196 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "PLuv", + "id": "142f5de2-3762-4f55-a839-22eac5c03c8f" + }, + "referenceParentCombinedNodePath": [ + [ + "PLuv", + "User Profile" + ] + ] + } + }, + { + "type": "User Supporter", + "name": "harrellbm", + "config": "{}", + "project": "Governance", + "id": "b5af4689-9931-49da-bc07-690c0deb4351", + "savedPayload": { + "position": { + "x": 14775.279381189153, + "y": 18078.124152694032 + }, + "targetPosition": { + "x": 14477.425303286602, + "y": 18042.30588533196 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "harrellbm", + "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740" + }, + "referenceParentCombinedNodePath": [ + [ + "harrellbm", + "User Profile" + ] + ] } } ], @@ -334,12 +492,12 @@ "id": "37f0b912-de8f-4b79-98ad-b5aaf08f838b", "savedPayload": { "position": { - "x": 26134.505947143105, - "y": 25354.679392577287 + "x": 14730.241590882813, + "y": 18203.811070159165 }, "targetPosition": { - "x": 25841.061666922964, - "y": 25292.30588533196 + "x": 14477.425303286602, + "y": 18042.30588533196 }, "floatingObject": { "isPinned": false, @@ -361,12 +519,12 @@ "id": "f3fb13a2-b1f4-4b02-b925-c68f504fd2ac", "savedPayload": { "position": { - "x": 26041.800848830622, - "y": 25515.249332975178 + "x": 14635.130434229754, + "y": 18297.50990503816 }, "targetPosition": { - "x": 25841.061666922964, - "y": 25292.30588533196 + "x": 14477.425303286602, + "y": 18042.30588533196 }, "floatingObject": { "isPinned": false, @@ -384,12 +542,12 @@ "id": "65a48301-5bc1-4a5c-a50a-f429f44db4b8", "savedPayload": { "position": { - "x": 25841.061666922964, - "y": 25292.30588533196 + "x": 14477.425303286602, + "y": 18042.30588533196 }, "targetPosition": { - "x": 25542.705098312483, - "y": 25323.664424312257 + "x": 14179.06873467612, + "y": 18073.664424312257 }, "floatingObject": { "isPinned": false, @@ -407,12 +565,12 @@ "id": "410de3ee-3b6a-4e67-a6f0-130e29cd0a79", "savedPayload": { "position": { - "x": 25542.705098312483, - "y": 25323.664424312257 + "x": 14179.06873467612, + "y": 18073.664424312257 }, "targetPosition": { - "x": 25300, - "y": 25500 + "x": 13936.363636363636, + "y": 18250 }, "floatingObject": { "isPinned": false, @@ -430,7 +588,7 @@ "votesAndClaimsPrograms": { "type": "Votes And Claims Programs", "name": "New Votes And Claims Programs", - "config": "{\n \"percentage\": 20\n}", + "config": "{}", "project": "Governance", "votingProgram": { "type": "Voting Program", @@ -445,12 +603,12 @@ "id": "8b8039e0-c042-4dde-87ca-61ac8019a49e", "savedPayload": { "position": { - "x": 26139.418235533445, - "y": 25739.052653648338 + "x": 14775.781871897083, + "y": 18489.052653648338 }, "targetPosition": { - "x": 25841.061666922964, - "y": 25707.69411466804 + "x": 14477.425303286602, + "y": 18457.69411466804 }, "floatingObject": { "isPinned": false, @@ -468,12 +626,12 @@ "id": "1ca2a7f8-4dad-40a5-9a0b-70e4e6b0e037", "savedPayload": { "position": { - "x": 25841.061666922964, - "y": 25707.69411466804 + "x": 14477.425303286602, + "y": 18457.69411466804 }, "targetPosition": { - "x": 25542.705098312483, - "y": 25676.335575687743 + "x": 14179.06873467612, + "y": 18426.335575687743 }, "floatingObject": { "isPinned": false, @@ -493,102 +651,9 @@ "name": "New Claims Program", "config": "{}", "project": "Governance", - "assetClaimsFolders": [ - { - "type": "Asset Claims Folder", - "name": "New Asset Claims Folder", - "config": "{}", - "project": "Governance", - "assetClaimsFolders": [], - "assetContributionClaims": [], - "id": "c0bb67cf-ed97-445f-b3b6-8ef181c386c0", - "savedPayload": { - "position": { - "x": 31844.903008026802, - "y": 18200.741292494906 - }, - "targetPosition": { - "x": 31404.73658769659, - "y": 18107.181031626915 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - } - ], - "featureClaimsFolders": [ - { - "type": "Feature Claims Folder", - "name": "New Feature Claims Folder", - "config": "{}", - "project": "Governance", - "featureClaimsFolders": [], - "featureContributionClaims": [], - "id": "81dc6357-893d-4361-9692-ef5d5e32a31e", - "savedPayload": { - "position": { - "x": 31705.845360558076, - "y": 18441.596203091744 - }, - "targetPosition": { - "x": 31404.73658769659, - "y": 18107.181031626915 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - } - ], - "positionClaimsFolders": [ - { - "type": "Position Claims Folder", - "name": "New Position Claims Folder", - "config": "{}", - "project": "Governance", - "positionClaimsFolders": [], - "positionContributionClaims": [], - "id": "32dec8a2-71c0-45f0-b1c3-8ea6f3b99b6d", - "savedPayload": { - "position": { - "x": 31451.77439616703, - "y": 18554.71588454264 - }, - "targetPosition": { - "x": 31404.73658769659, - "y": 18107.181031626915 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - } - ], + "assetClaimsFolders": [], + "featureClaimsFolders": [], + "positionClaimsFolders": [], "tokensAwarded": { "type": "Tokens Awarded", "name": "New Tokens Awarded", @@ -596,18 +661,18 @@ "id": "b3a93cc0-0801-4f6e-9488-435a1d272bff", "savedPayload": { "position": { - "x": 31179.73658769659, - "y": 18496.892463329914 + "x": 14423.110720521601, + "y": 18974.462850273303 }, "targetPosition": { - "x": 31404.73658769659, - "y": 18107.181031626915 + "x": 14301.089727598861, + "y": 18700.399212980523 }, "floatingObject": { "isPinned": false, "isFrozen": false, "isCollapsed": false, - "angleToParent": 2, + "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 }, @@ -619,19 +684,19 @@ "id": "98125357-80c3-4d3b-9b91-059298515c11", "savedPayload": { "position": { - "x": 31404.73658769659, - "y": 18107.181031626915 + "x": 14301.089727598861, + "y": 18700.399212980523 }, "targetPosition": { - "x": 25542.705098312483, - "y": 25676.335575687743 + "x": 14179.06873467612, + "y": 18426.335575687743 }, "floatingObject": { - "isPinned": true, + "isPinned": false, "isFrozen": false, "isCollapsed": false, "angleToParent": 2, - "distanceToParent": 4, + "distanceToParent": 3, "arrangementStyle": 0 }, "uiObject": { @@ -642,12 +707,12 @@ "id": "a79ace48-ae15-4359-95c1-371df5e41291", "savedPayload": { "position": { - "x": 25542.705098312483, - "y": 25676.335575687743 + "x": 14179.06873467612, + "y": 18426.335575687743 }, "targetPosition": { - "x": 25300, - "y": 25500 + "x": 13936.363636363636, + "y": 18250 }, "floatingObject": { "isPinned": false, @@ -665,7 +730,7 @@ "financialPrograms": { "type": "Financial Programs", "name": "New Financial Programs", - "config": "{\n \"percentage\": 20\n}", + "config": "{}", "project": "Governance", "stakingProgram": { "type": "Staking Program", @@ -679,12 +744,12 @@ "id": "77071bb6-dbda-4a2a-a8da-83ea6aa4155d", "savedPayload": { "position": { - "x": 25332.041916178172, - "y": 26372.205515328827 + "x": 13968.405552541806, + "y": 19122.205515328827 }, "targetPosition": { - "x": 25269.668408932845, - "y": 26078.761235108686 + "x": 13906.032045296479, + "y": 18828.761235108686 }, "floatingObject": { "isPinned": false, @@ -702,12 +767,12 @@ "id": "4087d58e-e684-4651-8849-4e194d5cc934", "savedPayload": { "position": { - "x": 25269.668408932845, - "y": 26078.761235108686 + "x": 13906.032045296479, + "y": 18828.761235108686 }, "targetPosition": { - "x": 25207.294901687517, - "y": 25785.316954888545 + "x": 13843.658538051151, + "y": 18535.316954888545 }, "floatingObject": { "isPinned": false, @@ -727,38 +792,7 @@ "name": "New Delegation Program", "config": "{}", "project": "Governance", - "delegatePowerSwitch": [ - { - "type": "Delegate Power Switch", - "name": "New Delegate Power Switch", - "config": "{}", - "project": "Governance", - "delegatePowerSwitch": [], - "userDelegates": [], - "id": "41e5e919-43b5-43d1-b0c1-7b388b4cd1bf", - "savedPayload": { - "position": { - "x": 24891.646355731817, - "y": 26271.37309168475 - }, - "targetPosition": { - "x": 24984.3514540443, - "y": 25986.056136796204 - }, - "floatingObject": { - "isPinned": false, - "isFrozen": false, - "isCollapsed": false, - "angleToParent": 2, - "distanceToParent": 3, - "arrangementStyle": 0 - }, - "uiObject": { - "isRunning": false - } - } - } - ], + "delegatePowerSwitch": [], "tokensBonus": { "type": "Tokens Bonus", "name": "New Tokens Bonus", @@ -766,18 +800,18 @@ "id": "ef6f8b6c-6e85-4d6c-ad64-b1e6ddd1248f", "savedPayload": { "position": { - "x": 24690.90717382416, - "y": 26048.42964404153 + "x": 13397.771642764716, + "y": 18936.795318703862 }, "targetPosition": { - "x": 24984.3514540443, - "y": 25986.056136796204 + "x": 13620.715090407934, + "y": 18736.056136796204 }, "floatingObject": { "isPinned": false, "isFrozen": false, "isCollapsed": false, - "angleToParent": 2, + "angleToParent": 1, "distanceToParent": 3, "arrangementStyle": 0 }, @@ -789,12 +823,12 @@ "id": "ee380273-eced-4761-b91e-94b542beb5de", "savedPayload": { "position": { - "x": 24984.3514540443, - "y": 25986.056136796204 + "x": 13620.715090407934, + "y": 18736.056136796204 }, "targetPosition": { - "x": 25207.294901687517, - "y": 25785.316954888545 + "x": 13843.658538051151, + "y": 18535.316954888545 }, "floatingObject": { "isPinned": false, @@ -812,12 +846,12 @@ "id": "c09288a3-64fb-489d-8e7d-c8d72a56c535", "savedPayload": { "position": { - "x": 25207.294901687517, - "y": 25785.316954888545 + "x": 13843.658538051151, + "y": 18535.316954888545 }, "targetPosition": { - "x": 25300, - "y": 25500 + "x": 13936.363636363636, + "y": 18250 }, "floatingObject": { "isPinned": false, @@ -835,12 +869,12 @@ "id": "d7571db7-acfc-4d8c-aa91-582ff7f5dbb3", "savedPayload": { "position": { - "x": 25300, - "y": 25500 + "x": 13936.363636363636, + "y": 18250 }, "targetPosition": { - "x": 25000, - "y": 25500 + "x": 13636.363636363636, + "y": 18250 }, "floatingObject": { "isPinned": false, @@ -862,12 +896,12 @@ "id": "a72ec234-c5dc-425e-9ace-95ffed7c0542", "savedPayload": { "position": { - "x": 24700, - "y": 25500 + "x": 13336.363636363636, + "y": 18250 }, "targetPosition": { - "x": 25000, - "y": 25500 + "x": 13636.363636363636, + "y": 18250 }, "floatingObject": { "isPinned": false, @@ -885,12 +919,12 @@ "id": "280f0baf-bc13-497c-b255-618c1a146442", "savedPayload": { "position": { - "x": 25000, - "y": 25500 + "x": 13636.363636363636, + "y": 18250 }, "targetPosition": { - "x": 25000, - "y": 25500 + "x": 13636.363636363636, + "y": 18250 }, "floatingObject": { "isPinned": false, From a687e50d5b921782c775c0c2e0718ceae974a1a3 Mon Sep 17 00:00:00 2001 From: Alpesh Date: Sun, 12 Sep 2021 16:09:15 +0100 Subject: [PATCH 49/65] User Profile [a-r-1] --- .../Plugins/User-Profiles/a-r-1.json | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 Projects/Governance/Plugins/User-Profiles/a-r-1.json diff --git a/Projects/Governance/Plugins/User-Profiles/a-r-1.json b/Projects/Governance/Plugins/User-Profiles/a-r-1.json new file mode 100644 index 000000000..8e64d0446 --- /dev/null +++ b/Projects/Governance/Plugins/User-Profiles/a-r-1.json @@ -0,0 +1,222 @@ +{ + "type": "User Profile", + "name": "a-r-1", + "config": "{\n \"signature\": {\n \"message\": \"a-r-1\",\n \"messageHash\": \"0x9745bbf104bba5e739d256eb99244e777e1c7e071ccef5721ce4d2d1b23530e7\",\n \"v\": \"0x1b\",\n \"r\": \"0xf3cb4ffd98a4b690b15ae6185ae3b90e371ebfa94a801782a4225b40ae05bd7e\",\n \"s\": \"0x08368b4695b28f74e6379f66e7bd98295f68a5616a1977386bf41c80ff832722\",\n \"signature\": \"0xf3cb4ffd98a4b690b15ae6185ae3b90e371ebfa94a801782a4225b40ae05bd7e08368b4695b28f74e6379f66e7bd98295f68a5616a1977386bf41c80ff8327221b\"\n }\n}", + "project": "Governance", + "tokenPowerSwitch": { + "type": "Token Power Switch", + "name": "New Token Power Switch", + "config": "{}", + "project": "Governance", + "tokenPowerSwitch": [], + "onboardingPrograms": { + "type": "Onboarding Programs", + "name": "New Onboarding Programs", + "config": "{}", + "project": "Governance", + "airdropProgram": { + "type": "Airdrop Program", + "name": "New Airdrop Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "97dac6d9-abe3-407d-a695-bf0e78fb9338", + "savedPayload": { + "position": { + "x": 14202, + "y": 9998.884757729338 + }, + "targetPosition": { + "x": 14052, + "y": 10258.692378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "06f2a2d5-4e0a-4229-a452-5cb77a90ca25", + "savedPayload": { + "position": { + "x": 14052, + "y": 10258.692378864669 + }, + "targetPosition": { + "x": 13902, + "y": 10518.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "githubProgram": { + "type": "Github Program", + "name": "New Github Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "769bca90-9994-42ff-8253-8b49394ff583", + "savedPayload": { + "position": { + "x": 14202, + "y": 11038.115242270662 + }, + "targetPosition": { + "x": 14052, + "y": 10778.307621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "ac196cef-a8b5-432b-8bbf-8122bc27fb04", + "savedPayload": { + "position": { + "x": 14052, + "y": 10778.307621135331 + }, + "targetPosition": { + "x": 13902, + "y": 10518.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "224f5e96-0309-4d0e-885d-d900e40ed060", + "savedPayload": { + "position": { + "x": 13902, + "y": 10518.5 + }, + "targetPosition": { + "x": 13602, + "y": 10518.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "99859f48-0e69-4fba-a93a-97156bf20b04", + "savedPayload": { + "position": { + "x": 13602, + "y": 10518.5 + }, + "targetPosition": { + "x": 13302, + "y": 10518.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "3d0935b7-80b5-4b41-a0b8-77bf805f3d82", + "savedPayload": { + "position": { + "x": 13002, + "y": 10518.5 + }, + "targetPosition": { + "x": 13302, + "y": 10518.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "41c45cfb-3877-4b74-8526-0958300596b3", + "savedPayload": { + "position": { + "x": 13302, + "y": 10518.5 + }, + "targetPosition": { + "x": 13302, + "y": 10518.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From 782cdb6046fe8bba50720a0bfdb3c56b5b1cb9e3 Mon Sep 17 00:00:00 2001 From: Tentacule23 Date: Sun, 12 Sep 2021 11:45:59 -0400 Subject: [PATCH 50/65] Menu-Tooltip Tentacule23 --- .../Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js b/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js index 29032cbc9..581dba410 100644 --- a/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js +++ b/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js @@ -301,6 +301,7 @@ function newCircularMenuItem() { function onMouseOver(point) { if (thisObject.container.frame.isThisPointHere(point, true, false) === true) { + thisObject.payload.uiObject.setInfoMessage(thisObject.action) isMouseOver = true } else { isMouseOver = false From 0a8fcc2a03038b54530714f3d7824a0d21b7382d Mon Sep 17 00:00:00 2001 From: narkxx Date: Sun, 12 Sep 2021 22:13:31 +0200 Subject: [PATCH 51/65] User Profile Narkxx --- .../Plugins/User-Profiles/narkxx.json | 697 ++++++++++++++++++ 1 file changed, 697 insertions(+) create mode 100644 Projects/Governance/Plugins/User-Profiles/narkxx.json diff --git a/Projects/Governance/Plugins/User-Profiles/narkxx.json b/Projects/Governance/Plugins/User-Profiles/narkxx.json new file mode 100644 index 000000000..8a69f4f87 --- /dev/null +++ b/Projects/Governance/Plugins/User-Profiles/narkxx.json @@ -0,0 +1,697 @@ +{ + "type": "User Profile", + "name": "narkxx", + "config": "{\n \"signature\": {\n \"message\": \"narkxx\",\n \"messageHash\": \"0x9b2dbaa8f93d181e9ecead93dd3310217c50774828a0deb2b83a71d81f49ff4c\",\n \"v\": \"0x1b\",\n \"r\": \"0x0e65fdd697bf412f412669823bea7f76231c5fff1319d2c41c0568daa33d7f1c\",\n \"s\": \"0x2dfdf2361a34ca33f587dff4f2d89519f20f77ee1f49500a05ccc3ffb477187e\",\n \"signature\": \"0x0e65fdd697bf412f412669823bea7f76231c5fff1319d2c41c0568daa33d7f1c2dfdf2361a34ca33f587dff4f2d89519f20f77ee1f49500a05ccc3ffb477187e1b\"\n }\n}", + "project": "Governance", + "tokenPowerSwitch": { + "type": "Token Power Switch", + "name": "New Token Power Switch", + "config": "{}", + "project": "Governance", + "tokenPowerSwitch": [], + "onboardingPrograms": { + "type": "Onboarding Programs", + "name": "New Onboarding Programs", + "config": "{\n \"percentage\": 0\n }", + "project": "Governance", + "airdropProgram": { + "type": "Airdrop Program", + "name": "New Airdrop Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "e32a0924-c240-4e8e-a68b-0f1c313137d3", + "savedPayload": { + "position": { + "x": 25196, + "y": 14402.577136594007 + }, + "targetPosition": { + "x": 25346, + "y": 14662.384757729338 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "11f2e881-196c-466c-9de9-ec5ed0eb31d1", + "savedPayload": { + "position": { + "x": 25346, + "y": 14662.384757729338 + }, + "targetPosition": { + "x": 25496, + "y": 14922.192378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "githubProgram": { + "type": "Github Program", + "name": "New Github Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "ff131c9a-a1f5-477c-b753-d24f2d22d10d", + "savedPayload": { + "position": { + "x": 26096, + "y": 14922.192378864669 + }, + "targetPosition": { + "x": 25796, + "y": 14922.192378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "06cc86de-ad48-401e-98e6-b0a7e0f57257", + "savedPayload": { + "position": { + "x": 25796, + "y": 14922.192378864669 + }, + "targetPosition": { + "x": 25496, + "y": 14922.192378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "93ba13e0-c631-4280-a011-fbffc30efb22", + "savedPayload": { + "position": { + "x": 25496, + "y": 14922.192378864669 + }, + "targetPosition": { + "x": 25346, + "y": 15182 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "communityBuildingPrograms": { + "type": "Community Building Programs", + "name": "New Community Building Programs", + "config": "{}", + "project": "Governance", + "referralProgram": { + "type": "Referral Program", + "name": "New Referral Program", + "config": "{}", + "project": "Governance", + "userReferrers": [ + { + "type": "User Referrer", + "name": "Luis-Fernando-Molina", + "config": "{}", + "project": "Governance", + "id": "f2e7b4ac-314d-4e7f-a06e-a6bce2e6e1c1", + "savedPayload": { + "position": { + "x": 25905.807621135333, + "y": 15551.615242270662 + }, + "targetPosition": { + "x": 25646, + "y": 15701.615242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Luis-Fernando-Molina", + "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "c5021290-55dd-4a92-a73b-a41fbaedf849", + "savedPayload": { + "position": { + "x": 25796, + "y": 15961.422863405993 + }, + "targetPosition": { + "x": 25646, + "y": 15701.615242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "5952d507-52e6-461e-b875-309934d387d4", + "savedPayload": { + "position": { + "x": 25386.192378864667, + "y": 15851.615242270662 + }, + "targetPosition": { + "x": 25646, + "y": 15701.615242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "572e1b74-1cc8-4736-89a7-15c67bcb8849", + "savedPayload": { + "position": { + "x": 25755.807621135333, + "y": 15291.807621135331 + }, + "targetPosition": { + "x": 25496, + "y": 15441.807621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "supportProgram": { + "type": "Support Program", + "name": "New Support Program", + "config": "{}", + "project": "Governance", + "userSupporters": [ + { + "type": "User Supporter", + "name": "Luis-Fernando-Molina", + "config": "{}", + "project": "Governance", + "id": "df9a319d-ecc9-452f-9fa3-d1d89c5b405c", + "savedPayload": { + "position": { + "x": 25639.44428022014, + "y": 15763.98874951599 + }, + "targetPosition": { + "x": 25346, + "y": 15701.615242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Luis-Fernando-Molina", + "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ] + ] + } + }, + { + "type": "User Supporter", + "name": "Julian-Molina", + "config": "{}", + "project": "Governance", + "id": "f3df7582-d059-4cfe-b827-e7012d25b82e", + "savedPayload": { + "position": { + "x": 25377.358538980297, + "y": 15999.971810881143 + }, + "targetPosition": { + "x": 25346, + "y": 15701.615242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Julian-Molina", + "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11" + }, + "referenceParentCombinedNodePath": [ + [ + "Julian-Molina", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "fb4c58a8-c4e5-4a4b-bc52-5f525f838c26", + "savedPayload": { + "position": { + "x": 25071.93636270722, + "y": 15823.636235193402 + }, + "targetPosition": { + "x": 25346, + "y": 15701.615242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "2ae24fce-2b7a-4406-83d4-709d16539c8f", + "savedPayload": { + "position": { + "x": 25145.26081809234, + "y": 15478.671794627444 + }, + "targetPosition": { + "x": 25346, + "y": 15701.615242270662 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "f30a7db2-7f93-4fcc-8cc1-72fb9e5b6b4c", + "savedPayload": { + "position": { + "x": 25646, + "y": 15701.615242270662 + }, + "targetPosition": { + "x": 25496, + "y": 15441.807621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "mentorshipProgram": { + "type": "Mentorship Program", + "name": "New Mentorship Program", + "config": "{}", + "project": "Governance", + "userMentors": [ + { + "type": "User Mentor", + "name": "Luis-Fernando-Molina", + "config": "{}", + "project": "Governance", + "id": "ce7cd9bb-3e22-4951-ac92-93f1d74631c8", + "savedPayload": { + "position": { + "x": 25459.135826507885, + "y": 15792.54680304299 + }, + "targetPosition": { + "x": 25236.192378864667, + "y": 15591.807621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Luis-Fernando-Molina", + "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ] + ] + } + }, + { + "type": "User Mentor", + "name": "Julian-Molina", + "config": "{}", + "project": "Governance", + "id": "1c6ddf3d-2ef5-49f2-96ed-20f025a22a0e", + "savedPayload": { + "position": { + "x": 25114.17138594193, + "y": 15865.871258428111 + }, + "targetPosition": { + "x": 25236.192378864667, + "y": 15591.807621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Julian-Molina", + "id": "1fd95e41-4b22-48d5-be3a-904c37afcb11" + }, + "referenceParentCombinedNodePath": [ + [ + "Julian-Molina", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "8c7da4b0-f06d-49f4-90b4-4327b6ceb21f", + "savedPayload": { + "position": { + "x": 24937.835810254186, + "y": 15560.449082155035 + }, + "targetPosition": { + "x": 25236.192378864667, + "y": 15591.807621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "e79084f0-78cc-4869-8010-cd9b698c0a90", + "savedPayload": { + "position": { + "x": 25173.81887161934, + "y": 15298.36334091519 + }, + "targetPosition": { + "x": 25236.192378864667, + "y": 15591.807621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "6bbb7865-cf57-4053-8e74-a9af2f8affa4", + "savedPayload": { + "position": { + "x": 25236.192378864667, + "y": 15591.807621135331 + }, + "targetPosition": { + "x": 25496, + "y": 15441.807621135331 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "260426a5-fb81-49aa-a6e7-8bf166c7d639", + "savedPayload": { + "position": { + "x": 25496, + "y": 15441.807621135331 + }, + "targetPosition": { + "x": 25346, + "y": 15182 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "adf950d7-547a-4028-a23b-dbc10991daa7", + "savedPayload": { + "position": { + "x": 25346, + "y": 15182 + }, + "targetPosition": { + "x": 25046, + "y": 15182 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "1d9e6e80-030a-4dbe-97ed-819876bccf33", + "savedPayload": { + "position": { + "x": 24746, + "y": 15182 + }, + "targetPosition": { + "x": 25046, + "y": 15182 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "7bde7f01-4c03-48a4-9944-710b213ef414", + "savedPayload": { + "position": { + "x": 25046, + "y": 15182 + }, + "targetPosition": { + "x": 25046, + "y": 15182 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From 05cd46bb01ab611c913c41bab4300e3a6fa4ea68 Mon Sep 17 00:00:00 2001 From: Tentacule23 Date: Sun, 12 Sep 2021 22:07:13 -0400 Subject: [PATCH 52/65] collapse_tutorial Tentacule23 --- .../UI/Spaces/Tutorial-Space/TutorialSpace.js | 57 +++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js b/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js index c98cd96e4..8bc9531a2 100644 --- a/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js +++ b/Projects/Education/UI/Spaces/Tutorial-Space/TutorialSpace.js @@ -12,6 +12,7 @@ function newEducationTutorialSpace() { playTutorialStep: playTutorialStep, resumeTutorialStep: resumeTutorialStep, resetTutorialProgress: resetTutorialProgress, + sidePanelTab: undefined, container: undefined, physics: physics, draw: draw, @@ -37,6 +38,8 @@ function newEducationTutorialSpace() { resize() let browserResizedEventSubscriptionId + let openingEventSubscriptionId + let closingEventSubscriptionId let tutorialRootNode let currentNode @@ -104,6 +107,8 @@ function newEducationTutorialSpace() { batchConfigChangesCounter = 0 workspacesCounter = 0 + setupSidePanelTab() + browserResizedEventSubscriptionId = canvas.eventHandler.listenToEvent('Browser Resized', resize) let workspace = UI.projects.foundations.spaces.designSpace.workspace workspace.executeAction({ name: 'Play Tutorials', project: 'Foundations' }) @@ -112,6 +117,8 @@ function newEducationTutorialSpace() { function finalize() { canvas.eventHandler.stopListening(browserResizedEventSubscriptionId) + thisObject.sidePanelTab.container.eventHandler.stopListening(openingEventSubscriptionId) + thisObject.sidePanelTab.container.eventHandler.stopListening(closingEventSubscriptionId) tutorialRootNode = undefined currentNode = undefined @@ -130,8 +137,14 @@ function newEducationTutorialSpace() { } function getContainer(point, purpose) { + + if (thisObject.sidePanelTab === undefined) { return } + let container + container = thisObject.sidePanelTab.getContainer(point, purpose) + if (container !== undefined) { return container } + if (thisObject.container.frame.isThisPointHere(point, true) === true) { return thisObject.container } else { @@ -145,11 +158,13 @@ function newEducationTutorialSpace() { switch (currentStatus) { case 'Stopped': { makeInvisible() + thisObject.sidePanelTab.close() currentNode = undefined break } case 'Playing Tutorial': { makeVsible() + thisObject.sidePanelTab.open() break } case 'Playing Topic': { @@ -978,8 +993,8 @@ function newEducationTutorialSpace() { function resumeTutorial(node) { if (UI.projects.foundations.spaces.designSpace.workspace.isInitialized !== true) { return } - - navigationStack = [] + //Testing if removing the navigationStack reset here fixes the tutorial resume issues + //navigationStack = [] node.payload.uiObject.isPlaying = true tutorialRootNode = node currentNode = node @@ -1000,7 +1015,8 @@ function newEducationTutorialSpace() { } function resumeTutorialTopic(node) { - navigationStack = [] + //Testing if removing the navigationStack reset here fixes the tutorial resume issues + //navigationStack = [] currentTopicNode = node currentNode = node currentStatus = 'Playing Topic' @@ -1020,7 +1036,8 @@ function newEducationTutorialSpace() { } function resumeTutorialStep(node) { - navigationStack = [] + //Testing if removing the navigationStack reset here fixes the tutorial resume issues + //navigationStack = [] currentStepNode = node currentNode = node currentStatus = 'Playing Step' @@ -1509,4 +1526,36 @@ function newEducationTutorialSpace() { function draw() { if (isInitialized === false) { return } } + + function setupSidePanelTab() { + thisObject.sidePanelTab = UI.projects.foundations.spaces.sideSpace.createSidePanelTab(thisObject.container, 'Education', 'tutorial', 'Tutorial', 'left') + + openingEventSubscriptionId = thisObject.sidePanelTab.container.eventHandler.listenToEvent('opening', onOpening) + closingEventSubscriptionId = thisObject.sidePanelTab.container.eventHandler.listenToEvent('closing', onClosing) + } + + function onOpening() { + //console.log('onOpening'); + let nodeResume = navigationStack.pop() + + switch (nodeResume.type) { + case 'Tutorial': { + resumeTutorial(nodeResume) + break + } + case 'Tutorial Topic': { + resumeTutorialTopic(nodeResume) + break + } + case 'Tutorial Step': { + resumeTutorialStep(nodeResume) + break + } + } + } + + function onClosing() { + //console.log('onClosing'); + stop() + } } From 243fa7a870d055560b05bd6468491c308015f456 Mon Sep 17 00:00:00 2001 From: jacob Date: Mon, 13 Sep 2021 12:45:07 +1000 Subject: [PATCH 53/65] data mine containing keltner channel and MVWAP indicators --- .../Plugins/Data-Mines/quantum.json | 6330 +++++++++++++++++ 1 file changed, 6330 insertions(+) create mode 100755 Projects/Foundations/Plugins/Data-Mines/quantum.json diff --git a/Projects/Foundations/Plugins/Data-Mines/quantum.json b/Projects/Foundations/Plugins/Data-Mines/quantum.json new file mode 100755 index 000000000..4b55a5aeb --- /dev/null +++ b/Projects/Foundations/Plugins/Data-Mines/quantum.json @@ -0,0 +1,6330 @@ +{ + "type": "Data Mine", + "name": "quantum", + "config": "{\"codeName\":\"quantum\"}", + "project": "Foundations", + "sensorBots": [], + "apiDataFetcherBots": [], + "indicatorBots": [ + { + "type": "Indicator Bot", + "name": "Keltner Channel", + "config": "{\n \"codeName\": \"Keltner-Channel\"\n}", + "project": "Foundations", + "processes": [ + { + "type": "Process Definition", + "name": "Multi-Time-Frame-Market", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Produces the Keltner Channel.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}", + "project": "Foundations", + "processOutput": { + "type": "Process Output", + "name": "New Process Output", + "project": "Foundations", + "outputDatasets": [ + { + "type": "Output Dataset", + "name": "Multi-Time-Frame-Market Keltner Channel", + "project": "Foundations", + "id": "5d2742b2-010f-4c8e-a3b9-353144fa718d", + "savedPayload": { + "position": { + "x": 35682.7308681976, + "y": 17706.066132856835 + }, + "targetPosition": { + "x": 35760.37658172835, + "y": 17995.843880743556 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Market", + "id": "d76a7b97-f8ec-4565-bb08-b9c96e527061" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Indicator Bot", + "Foundations", + "2d67d9ca-7a6e-42af-ae67-a573f77fde43" + ], + [ + "Keltner Channel", + "Product Definition", + "Foundations", + "f41eab39-d10c-4335-95a7-64978fb51631" + ], + [ + "Multi-Time-Frame-Market", + "Dataset Definition", + "Foundations", + "d76a7b97-f8ec-4565-bb08-b9c96e527061" + ] + ] + } + } + ], + "outputDatasetFolders": [], + "id": "c90fe480-880a-41bf-991d-ee9a7b1491ce", + "savedPayload": { + "position": { + "x": 35760.37658172835, + "y": 17995.843880743556 + }, + "targetPosition": { + "x": 35838.02229525911, + "y": 18285.621628630277 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "processDependencies": { + "type": "Process Dependencies", + "name": "New Process Dependencies", + "project": "Foundations", + "statusDependencies": [ + { + "type": "Status Dependency", + "name": "Candles Volumes Multi-Time-Frame-Market", + "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}", + "project": "Foundations", + "id": "54773d03-d7e6-446b-8650-96ced7179a74", + "savedPayload": { + "position": { + "x": 35765.668008789864, + "y": 17736.036259608227 + }, + "targetPosition": { + "x": 35915.668008789864, + "y": 17995.843880743556 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "Candles Volumes Multi-Time-Frame-Market Status Report", + "id": "a0a61ba9-91cb-4ec7-92fe-134ff079de2d" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Market", + "Process Definition", + "Foundations", + "9f683143-a33f-42c1-9fa8-c601f01ee4e1" + ], + [ + "Candles Volumes Multi-Time-Frame-Market Status Report", + "Status Report", + "Foundations", + "a0a61ba9-91cb-4ec7-92fe-134ff079de2d" + ] + ] + } + }, + { + "type": "Status Dependency", + "name": "", + "config": "{\n \"mainUtility\": \"Self Reference\"\n}", + "project": "Foundations", + "id": "3c180aa1-836b-41ca-a367-5d57065d04fe", + "savedPayload": { + "position": { + "x": 35954.49086555524, + "y": 17850.955006800195 + }, + "targetPosition": { + "x": 35915.668008789864, + "y": 17995.843880743556 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "New Status Report", + "id": "1f010d2c-20aa-42c1-a8aa-09cb10108a7b" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Indicator Bot", + "Foundations", + "2d67d9ca-7a6e-42af-ae67-a573f77fde43" + ], + [ + "Multi-Time-Frame-Market", + "Process Definition", + "Foundations", + "38d95fbc-1062-43c5-b619-6c62d0ddcc0b" + ], + [ + "New Status Report", + "Status Report", + "Foundations", + "1f010d2c-20aa-42c1-a8aa-09cb10108a7b" + ] + ] + } + } + ], + "dataDependencies": [ + { + "type": "Data Dependency", + "name": "Candles Multi-Time-Frame-Market", + "project": "Foundations", + "id": "2bbd3c13-d32c-4046-aa20-00e985771c2f", + "savedPayload": { + "position": { + "x": 36045.57181935753, + "y": 17920.843880743556 + }, + "targetPosition": { + "x": 35915.668008789864, + "y": 17995.843880743556 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Market", + "id": "2b03494a-67d6-47f1-89b6-53fc4c9116a8" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Candles", + "Product Definition", + "Foundations", + "fe6065ec-4d2d-47a0-bae0-8647f0e195d7" + ], + [ + "Multi-Time-Frame-Market", + "Dataset Definition", + "Foundations", + "2b03494a-67d6-47f1-89b6-53fc4c9116a8" + ] + ] + } + } + ], + "dataMineDataDependencies": [], + "id": "2c833913-2571-489d-8c0b-35c76775dfa1", + "savedPayload": { + "position": { + "x": 35915.668008789864, + "y": 17995.843880743556 + }, + "targetPosition": { + "x": 35838.02229525911, + "y": 18285.621628630277 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "statusReport": { + "type": "Status Report", + "name": "New Status Report", + "project": "Foundations", + "id": "1f010d2c-20aa-42c1-a8aa-09cb10108a7b", + "savedPayload": { + "position": { + "x": 36050.15432961507, + "y": 18073.489594274313 + }, + "targetPosition": { + "x": 35838.02229525911, + "y": 18285.621628630277 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "executionStartedEvent": { + "type": "Execution Started Event", + "name": "", + "project": "Foundations", + "id": "fb175b54-cd7e-4338-95ec-2ee630b15d4e", + "savedPayload": { + "position": { + "x": 35982.91116920247, + "y": 18246.7987718649 + }, + "targetPosition": { + "x": 35838.02229525911, + "y": 18285.621628630277 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "id": "1824fa00-dd30-4cdc-acc0-01c2f29056c5" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Market", + "Process Definition", + "Foundations", + "9f683143-a33f-42c1-9fa8-c601f01ee4e1" + ], + [ + "New Execution Finished Event", + "Execution Finished Event", + "Foundations", + "1824fa00-dd30-4cdc-acc0-01c2f29056c5" + ] + ] + } + }, + "executionFinishedEvent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "project": "Foundations", + "id": "8427c40d-1223-459c-84a5-f1d2e99e439f", + "savedPayload": { + "position": { + "x": 35982.91116920247, + "y": 18324.444485395656 + }, + "targetPosition": { + "x": 35838.02229525911, + "y": 18285.621628630277 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "38d95fbc-1062-43c5-b619-6c62d0ddcc0b", + "savedPayload": { + "position": { + "x": 35509.02229525911, + "y": 18236.621628630277 + }, + "targetPosition": { + "x": 35296.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Process Definition", + "name": "Multi-Time-Frame-Daily", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Produces the Keltner Channel.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}", + "project": "Foundations", + "processOutput": { + "type": "Process Output", + "name": "New Process Output", + "project": "Foundations", + "outputDatasets": [ + { + "type": "Output Dataset", + "name": "Multi-Time-Frame-Daily Keltner Channel", + "project": "Foundations", + "id": "2262ff71-db72-4278-9725-f68ab4e6b3fe", + "savedPayload": { + "position": { + "x": 36225.89026090314, + "y": 17978.13842071558 + }, + "targetPosition": { + "x": 36075.89026090314, + "y": 18237.94604185091 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Daily", + "id": "80454a5a-c87b-47f6-b71e-f0466c864634" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Indicator Bot", + "Foundations", + "2d67d9ca-7a6e-42af-ae67-a573f77fde43" + ], + [ + "Keltner Channel", + "Product Definition", + "Foundations", + "f41eab39-d10c-4335-95a7-64978fb51631" + ], + [ + "Multi-Time-Frame-Daily", + "Dataset Definition", + "Foundations", + "80454a5a-c87b-47f6-b71e-f0466c864634" + ] + ] + } + } + ], + "outputDatasetFolders": [], + "id": "5dc92f26-e6f7-43f4-86b0-9cd7bd7b443b", + "savedPayload": { + "position": { + "x": 36075.89026090314, + "y": 18237.94604185091 + }, + "targetPosition": { + "x": 35925.89026090314, + "y": 18497.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "processDependencies": { + "type": "Process Dependencies", + "name": "New Process Dependencies", + "project": "Foundations", + "statusDependencies": [ + { + "type": "Status Dependency", + "name": "", + "config": "{\n \"mainUtility\": \"Self Reference\"\n}", + "project": "Foundations", + "id": "1ccbc557-37d4-4b36-8260-88b7fd029762", + "savedPayload": { + "position": { + "x": 36335.697882038476, + "y": 18087.94604185091 + }, + "targetPosition": { + "x": 36185.697882038476, + "y": 18347.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "New Status Report", + "id": "0b3ee02f-edd5-4ff0-aa1f-c687e6583098" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Indicator Bot", + "Foundations", + "2d67d9ca-7a6e-42af-ae67-a573f77fde43" + ], + [ + "Multi-Time-Frame-Daily", + "Process Definition", + "Foundations", + "97681a8b-876b-4f01-9f02-16bb06408ed1" + ], + [ + "New Status Report", + "Status Report", + "Foundations", + "0b3ee02f-edd5-4ff0-aa1f-c687e6583098" + ] + ] + } + }, + { + "type": "Status Dependency", + "name": "", + "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}", + "project": "Foundations", + "id": "3e907f0c-40fb-430e-a013-39fe4f44284b", + "savedPayload": { + "position": { + "x": 36397.82991639444, + "y": 18135.621628630277 + }, + "targetPosition": { + "x": 36185.697882038476, + "y": 18347.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "New Status Report", + "id": "2a021da8-9feb-475e-90ab-1586968c17c7" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Daily", + "Process Definition", + "Foundations", + "980ceb1d-7be6-454f-90d9-01ba1fd4a65d" + ], + [ + "New Status Report", + "Status Report", + "Foundations", + "2a021da8-9feb-475e-90ab-1586968c17c7" + ] + ] + } + }, + { + "type": "Status Dependency", + "name": "Exchange Raw Data Historic-OHLCVs", + "config": "{\n \"mainUtility\": \"Market Starting Point\"\n}", + "project": "Foundations", + "id": "77d0f477-eb24-44c9-b29c-efe946b0c4a0", + "savedPayload": { + "position": { + "x": 36445.5055031738, + "y": 18197.75366298624 + }, + "targetPosition": { + "x": 36185.697882038476, + "y": 18347.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "Exchange-Raw-Data Historic-OHLCVs Status Report", + "id": "181c7c34-7243-497a-9ddb-1b0067c6d66e" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Exchange Raw Data", + "Sensor Bot", + "Foundations", + "af924204-66a2-47d4-9910-66ab78acb06f" + ], + [ + "Historic-OHLCVs", + "Process Definition", + "Foundations", + "5eb11d6a-022e-4f60-97c4-d6cf90b249dc" + ], + [ + "Exchange-Raw-Data Historic-OHLCVs Status Report", + "Status Report", + "Foundations", + "181c7c34-7243-497a-9ddb-1b0067c6d66e" + ] + ] + } + } + ], + "dataDependencies": [ + { + "type": "Data Dependency", + "name": "Candles Multi-Time-Frame-Daily", + "project": "Foundations", + "id": "7e4330fe-cff7-410f-949d-9bc74ab234b8", + "savedPayload": { + "position": { + "x": 36475.4756299252, + "y": 18270.107949455487 + }, + "targetPosition": { + "x": 36185.697882038476, + "y": 18347.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Daily", + "id": "678a567c-f08d-49b9-813b-4e54fd6afadb" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Candles", + "Product Definition", + "Foundations", + "fe6065ec-4d2d-47a0-bae0-8647f0e195d7" + ], + [ + "Multi-Time-Frame-Daily", + "Dataset Definition", + "Foundations", + "678a567c-f08d-49b9-813b-4e54fd6afadb" + ] + ] + } + } + ], + "dataMineDataDependencies": [ + { + "type": "Data Mine Data Dependencies", + "name": "Candles", + "project": "Foundations", + "botDataDependencies": [], + "id": "85d0a208-d797-4073-921f-171e59d4c290", + "savedPayload": { + "position": { + "x": 36504.697882038476, + "y": 18653.75366298624 + }, + "targetPosition": { + "x": 36185.697882038476, + "y": 18347.75366298624 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Data Mine", + "name": "Candles", + "id": "70c7eea3-a786-4dda-b526-0514e2cb14cc" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ] + ] + } + } + ], + "id": "470f0399-a571-4dae-960d-1e6ecaad88e7", + "savedPayload": { + "position": { + "x": 36185.697882038476, + "y": 18347.75366298624 + }, + "targetPosition": { + "x": 35925.89026090314, + "y": 18497.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "statusReport": { + "type": "Status Report", + "name": "New Status Report", + "project": "Foundations", + "id": "0b3ee02f-edd5-4ff0-aa1f-c687e6583098", + "savedPayload": { + "position": { + "x": 36075.89026090314, + "y": 18497.75366298624 + }, + "targetPosition": { + "x": 35925.89026090314, + "y": 18497.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "executionStartedEvent": { + "type": "Execution Started Event", + "name": "", + "project": "Foundations", + "id": "1326f776-09db-4750-bce6-8d8c1734f3a0", + "savedPayload": { + "position": { + "x": 36055.79407147081, + "y": 18572.75366298624 + }, + "targetPosition": { + "x": 35925.89026090314, + "y": 18497.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "id": "f29d08f9-e7c8-490c-8fca-14851a0d3dc3" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Daily", + "Process Definition", + "Foundations", + "980ceb1d-7be6-454f-90d9-01ba1fd4a65d" + ], + [ + "New Execution Finished Event", + "Execution Finished Event", + "Foundations", + "f29d08f9-e7c8-490c-8fca-14851a0d3dc3" + ] + ] + } + }, + "executionFinishedEvent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "project": "Foundations", + "id": "f3c494f1-ac4e-4cb2-a8d3-bebee8c1639a", + "savedPayload": { + "position": { + "x": 36000.89026090314, + "y": 18627.657473553907 + }, + "targetPosition": { + "x": 35925.89026090314, + "y": 18497.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "97681a8b-876b-4f01-9f02-16bb06408ed1", + "savedPayload": { + "position": { + "x": 35596.89026090314, + "y": 18448.75366298624 + }, + "targetPosition": { + "x": 35296.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "products": [ + { + "type": "Product Definition", + "name": "Keltner Channel", + "config": "{\n \"codeName\": \"Keltner-Channel\",\n \"singularVariableName\": \"keltner\",\n \"pluralVariableName\": \"keltners\"\n}", + "project": "Foundations", + "datasets": [ + { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Market", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\"\n}", + "project": "Foundations", + "id": "d76a7b97-f8ec-4565-bb08-b9c96e527061", + "savedPayload": { + "position": { + "x": 35837.318189071, + "y": 18731.753959886133 + }, + "targetPosition": { + "x": 35615.08831243709, + "y": 18766.951714520186 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Daily", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n }\n}", + "project": "Foundations", + "id": "80454a5a-c87b-47f6-b71e-f0466c864634", + "savedPayload": { + "position": { + "x": 35815.56478037947, + "y": 18869.099576961584 + }, + "targetPosition": { + "x": 35615.08831243709, + "y": 18766.951714520186 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "record": { + "type": "Record Definition", + "name": "New Record Definition", + "project": "Foundations", + "properties": [ + { + "type": "Record Property", + "name": "Begin", + "config": "{\n \"codeName\": \"begin\",\n \"isString\": false,\n \"isCalculated\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "record.current.begin", + "project": "Foundations", + "id": "acd5b5fc-b7f7-46e3-b278-9c984c130581", + "savedPayload": { + "position": { + "x": 37127.45110003115, + "y": 19412.421228731037 + }, + "targetPosition": { + "x": 36790.99149989621, + "y": 19438.901173539183 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "236f093d-9061-4363-a2ed-6150a13ebe4e", + "savedPayload": { + "position": { + "x": 36790.99149989621, + "y": 19438.901173539183 + }, + "targetPosition": { + "x": 36454.531899761285, + "y": 19465.381118347334 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "End", + "config": "{ \n\"codeName\": \"end\",\n\"isString\": false,\n\"isCalculated\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "record.current.end", + "project": "Foundations", + "id": "11bf2a1d-1c00-4876-af81-4c4effa5cda8", + "savedPayload": { + "position": { + "x": 37096.49504826051, + "y": 19673.967589550422 + }, + "targetPosition": { + "x": 36775.5134740109, + "y": 19569.674353948878 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "b5f38833-a07e-42ce-893a-9bc05c70ca86", + "savedPayload": { + "position": { + "x": 36775.5134740109, + "y": 19569.674353948878 + }, + "targetPosition": { + "x": 36454.531899761285, + "y": 19465.381118347334 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "Upper", + "config": "{\n \"codeName\": \"Upper\",\n \"isString\": false,\n \"isCalculated\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "variable.Upper", + "project": "Foundations", + "id": "4646a964-3da9-46b0-b650-e1096ecf3174", + "savedPayload": { + "position": { + "x": 36839.4874198463, + "y": 19794.16419281449 + }, + "targetPosition": { + "x": 36711.1689131513, + "y": 19684.56983465877 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "1f54fec9-389b-4173-9035-2f9e122e8530", + "savedPayload": { + "position": { + "x": 36711.1689131513, + "y": 19684.56983465877 + }, + "targetPosition": { + "x": 36454.531899761285, + "y": 19465.381118347334 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "Lower", + "config": "{\n \"codeName\": \"Lower\",\n \"isString\": false,\n \"isCalculated\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "variable.Lower", + "project": "Foundations", + "id": "01c7c929-8aee-4284-b305-717dabfc74f8", + "savedPayload": { + "position": { + "x": 36684.36459025443, + "y": 19916.453171217694 + }, + "targetPosition": { + "x": 36607.75369342338, + "y": 19766.095820260907 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "6779bd73-6b00-4af0-b1ff-5dbb14edb178", + "savedPayload": { + "position": { + "x": 36607.75369342338, + "y": 19766.095820260907 + }, + "targetPosition": { + "x": 36454.531899761285, + "y": 19465.381118347334 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "Mid Point", + "config": "{\n \"codeName\": \"midPoint\",\n \"isString\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "variable.midPoint", + "project": "Foundations", + "id": "f95f8041-8b26-4295-b95e-b32d06066ab5", + "savedPayload": { + "position": { + "x": 36494.251816973505, + "y": 19970.070518549728 + }, + "targetPosition": { + "x": 36481.01184456943, + "y": 19801.840718482264 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "b96c8034-d6ba-4459-af39-b0104ff2061f", + "savedPayload": { + "position": { + "x": 36481.01184456943, + "y": 19801.840718482264 + }, + "targetPosition": { + "x": 36454.531899761285, + "y": 19465.381118347334 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "AverageTrueRange", + "config": "{\n \"codeName\": \"AverageTrueRange\",\n \"isString\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Record Formula", + "code": "variable.AverageTrueRange", + "project": "Foundations", + "id": "e38a745b-46e9-4b67-ab92-e6bf636b8213", + "savedPayload": { + "position": { + "x": 36298.092046358965, + "y": 19946.853479721754 + }, + "targetPosition": { + "x": 36350.23866415974, + "y": 19786.362692596947 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "aa0fabd3-2b99-4c5b-8b28-719adbe6f4ba", + "savedPayload": { + "position": { + "x": 36350.23866415974, + "y": 19786.362692596947 + }, + "targetPosition": { + "x": 36454.531899761285, + "y": 19465.381118347334 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "Average ATR", + "config": "{\n \"codeName\": \"AverageATR\",\n \"isString\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Record Formula", + "code": "variable.AverageATR", + "project": "Foundations", + "id": "c893e0c2-6e4c-41d7-a277-32e1b2457596", + "savedPayload": { + "position": { + "x": 36125.748825294126, + "y": 19850.33663843235 + }, + "targetPosition": { + "x": 36235.34318344985, + "y": 19722.018131737343 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3e8458a5-1b5a-4093-af89-724d331dcb9c", + "savedPayload": { + "position": { + "x": 36235.34318344985, + "y": 19722.018131737343 + }, + "targetPosition": { + "x": 36454.531899761285, + "y": 19465.381118347334 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "cd647632-deaa-4e46-aed3-2f74e171f208", + "savedPayload": { + "position": { + "x": 35819.384037319884, + "y": 19167.90465040495 + }, + "targetPosition": { + "x": 35615.08831243709, + "y": 18766.951714520186 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "dataBuilding": { + "type": "Data Building Procedure", + "name": "New Data Building Procedure", + "project": "Foundations", + "loop": { + "type": "Procedure Loop", + "name": "New Procedure Loop", + "project": "Foundations", + "procedureJavascriptCode": { + "type": "Procedure Javascript Code", + "name": "New Procedure Javascript Code", + "code": "/* Loop Code */\n\nlet kcLen = 20 // Channel length\nlet candle = record.current\nlet multiplier = 1.5\nlet ATR_LEN = 14\n\n//Calculate EMA20 for midpoint\nvariable.midPoint = calculateEMA(20, candle.close, variable.previousMidPoint)\nvariable.previousMidPoint = variable.midPoint \n\n\n//////////////////////\nvariable.lastTR.push(calculateTR()) // Add the current true range value to last 20 array\n\nif (variable.lastTR.length > 20) {\n variable.lastTR.splice(0, 1) // Remove the first element of the array to keep it at a maximun of 14 elements\n}\n\nvariable.AverageTrueRange = calculateATR(20)\nvariable.prevClose = candle.close\n\nvariable.Upper = variable.midPoint + multiplier * variable.AverageTrueRange\nvariable.Lower = variable.midPoint - multiplier * variable.AverageTrueRange\n\n//Calculate EMA for ATR\nvariable.AverageATR = calculateEMA(ATR_LEN, variable.AverageTrueRange, variable.previousAverageATR)\nvariable.previousAverageATR = variable.AverageATR \n\n//////////////////\n/* Calculate True Range */\nfunction calculateTR() {\n let hl = candle.max - candle.min\n \n if (variable.prevClose === 0) { return hl } // Return High-Low when previous Close is 0\n \n let hcp = Math.abs(candle.max - variable.prevClose)\n let lcp = Math.abs(candle.min - variable.prevClose)\n \n return Math.max(hl, hcp, lcp)\n}\n\n/* Calculate Average True Range - Smoothing Function SMA */\nfunction calculateATR(length) {\n /* We check we have enough values to make the calculation */\n if (variable.lastTR.length < length) { return 0 } // If not, define the value as zero.\n\n let sum = 0 // Initialise sum variable. \n for (let i = variable.lastTR.length - length; i < variable.lastTR.length; i++) { // Iterate through the last periods\n sum = sum + variable.lastTR[i]\n }\n \n let atr = sum / length\n return atr\n}\n\nfunction calculateEMA(periods, price, previousEMA) {\n let k = 2 / (1 + periods)\n return price * k + previousEMA * (1-k)\n}", + "project": "Foundations", + "id": "fb0e9c1d-a054-41f5-bef5-41c267e77735", + "savedPayload": { + "position": { + "x": 35656.043747081414, + "y": 19187.567431784748 + }, + "targetPosition": { + "x": 35620.206952126886, + "y": 19094.209389135027 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "325b96d4-7ca6-4ee9-b42c-1a4b147ca71b", + "savedPayload": { + "position": { + "x": 35620.206952126886, + "y": 19094.209389135027 + }, + "targetPosition": { + "x": 35579.89055780304, + "y": 18989.18159115409 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "initialization": { + "type": "Procedure Initialization", + "name": "New Procedure Initialization", + "project": "Foundations", + "procedureJavascriptCode": { + "type": "Procedure Javascript Code", + "name": "New Procedure Javascript Code", + "code": "/* Initialization Code*/\n\nvariable.lastHighs = []\nvariable.lastLows = []\nvariable.previousMidPoint = 0\npreviousAverageATR = 0\n\nvariable.lastTR = []\nvariable.prevClose = 0", + "project": "Foundations", + "id": "6d4b35c8-4c76-41ef-af19-fc77ece6e188", + "savedPayload": { + "position": { + "x": 35446.15997470495, + "y": 19154.325107963698 + }, + "targetPosition": { + "x": 35509.09201380993, + "y": 19076.610511818002 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "f24dc0b0-b88b-428a-9d1a-38b233b38232", + "savedPayload": { + "position": { + "x": 35509.09201380993, + "y": 19076.610511818002 + }, + "targetPosition": { + "x": 35579.89055780304, + "y": 18989.18159115409 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "bf66fcaa-471d-439e-b4cc-de7191b4777c", + "savedPayload": { + "position": { + "x": 35579.89055780304, + "y": 18989.18159115409 + }, + "targetPosition": { + "x": 35615.08831243709, + "y": 18766.951714520186 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "f41eab39-d10c-4335-95a7-64978fb51631", + "savedPayload": { + "position": { + "x": 35615.08831243709, + "y": 18766.951714520186 + }, + "targetPosition": { + "x": 35296.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 4, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Plotter Module", + "name": "Keltner Channel", + "id": "32f94206-6147-48df-9860-c94793356f85" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Plotter", + "Foundations", + "964976a0-0546-434f-994b-36c5cd03437e" + ], + [ + "Keltner Channel", + "Plotter Module", + "Foundations", + "32f94206-6147-48df-9860-c94793356f85" + ] + ] + } + } + ], + "id": "2d67d9ca-7a6e-42af-ae67-a573f77fde43", + "savedPayload": { + "position": { + "x": 35296.89026090314, + "y": 18448.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Indicator Bot", + "name": "MVWAP", + "config": "{\n \"codeName\": \"Moving-VWAP\"\n}", + "project": "Foundations", + "processes": [ + { + "type": "Process Definition", + "name": "Multi-Time-Frame-Daily", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"description\": \"Produces the MVWAP.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Daily\"\n }\n}", + "project": "Foundations", + "processOutput": { + "type": "Process Output", + "name": "New Process Output", + "project": "Foundations", + "outputDatasets": [ + { + "type": "Output Dataset", + "name": "Multi-Time-Frame-Daily MVWAP", + "project": "Foundations", + "id": "5704bcf4-154b-4358-aabe-8783cd7ef1e0", + "savedPayload": { + "position": { + "x": 36061.57779103255, + "y": 18923.594270280693 + }, + "targetPosition": { + "x": 35771.80004314583, + "y": 19001.23998381145 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Daily", + "id": "d84addaf-b023-4ea8-8e15-b7576c911bb5" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Indicator Bot", + "Foundations", + "053d6fd9-217c-4469-9796-91021f2f0d53" + ], + [ + "MVWAP", + "Product Definition", + "Foundations", + "0d93e7b6-08f8-4b07-b959-ee2f70d79e70" + ], + [ + "Multi-Time-Frame-Daily", + "Dataset Definition", + "Foundations", + "d84addaf-b023-4ea8-8e15-b7576c911bb5" + ] + ] + } + } + ], + "outputDatasetFolders": [], + "id": "f0863ec3-6de8-43d3-a886-560391d4a212", + "savedPayload": { + "position": { + "x": 35771.80004314583, + "y": 19001.23998381145 + }, + "targetPosition": { + "x": 35482.02229525911, + "y": 19078.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "processDependencies": { + "type": "Process Dependencies", + "name": "New Process Dependencies", + "project": "Foundations", + "statusDependencies": [ + { + "type": "Status Dependency", + "name": "", + "config": "{\n \"mainUtility\": \"Self Reference\"\n}", + "project": "Foundations", + "id": "63cd0d4a-fb74-4276-9b97-16b8dd134973", + "savedPayload": { + "position": { + "x": 35187.37890022213, + "y": 19293.54672890347 + }, + "targetPosition": { + "x": 34920.07694296562, + "y": 19157.349578981608 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "New Status Report", + "id": "fa60009c-41d9-4873-a2c8-189bc92ab157" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Indicator Bot", + "Foundations", + "053d6fd9-217c-4469-9796-91021f2f0d53" + ], + [ + "Multi-Time-Frame-Daily", + "Process Definition", + "Foundations", + "2b16d149-2eea-4cab-8632-a4cffd5c6bf1" + ], + [ + "New Status Report", + "Status Report", + "Foundations", + "fa60009c-41d9-4873-a2c8-189bc92ab157" + ] + ] + } + }, + { + "type": "Status Dependency", + "name": "", + "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}", + "project": "Foundations", + "id": "dec327a6-495e-4788-97de-362c3c110366", + "savedPayload": { + "position": { + "x": 35202.7820412781, + "y": 19505.666533870153 + }, + "targetPosition": { + "x": 34920.07694296562, + "y": 19157.349578981608 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "New Status Report", + "id": "2a021da8-9feb-475e-90ab-1586968c17c7" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Daily", + "Process Definition", + "Foundations", + "980ceb1d-7be6-454f-90d9-01ba1fd4a65d" + ], + [ + "New Status Report", + "Status Report", + "Foundations", + "2a021da8-9feb-475e-90ab-1586968c17c7" + ] + ] + } + }, + { + "type": "Status Dependency", + "name": "Exchange Raw Data Historic-OHLCVs", + "config": "{\n \"mainUtility\": \"Market Starting Point\"\n}", + "project": "Foundations", + "id": "f1a1606f-0c3f-4fb1-9cf9-2de43920fc40", + "savedPayload": { + "position": { + "x": 35028.777729838504, + "y": 19595.938439407983 + }, + "targetPosition": { + "x": 34920.07694296562, + "y": 19157.349578981608 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "Exchange-Raw-Data Historic-OHLCVs Status Report", + "id": "181c7c34-7243-497a-9ddb-1b0067c6d66e" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Exchange Raw Data", + "Sensor Bot", + "Foundations", + "af924204-66a2-47d4-9910-66ab78acb06f" + ], + [ + "Historic-OHLCVs", + "Process Definition", + "Foundations", + "5eb11d6a-022e-4f60-97c4-d6cf90b249dc" + ], + [ + "Exchange-Raw-Data Historic-OHLCVs Status Report", + "Status Report", + "Foundations", + "181c7c34-7243-497a-9ddb-1b0067c6d66e" + ] + ] + } + } + ], + "dataDependencies": [ + { + "type": "Data Dependency", + "name": "Candles Multi-Time-Frame-Daily", + "project": "Foundations", + "id": "5f6c8325-9256-4578-86d8-ad9984ccb4b1", + "savedPayload": { + "position": { + "x": 34857.703435720294, + "y": 19450.79385920175 + }, + "targetPosition": { + "x": 34920.07694296562, + "y": 19157.349578981608 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Daily", + "id": "678a567c-f08d-49b9-813b-4e54fd6afadb" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Candles", + "Product Definition", + "Foundations", + "fe6065ec-4d2d-47a0-bae0-8647f0e195d7" + ], + [ + "Multi-Time-Frame-Daily", + "Dataset Definition", + "Foundations", + "678a567c-f08d-49b9-813b-4e54fd6afadb" + ] + ] + } + }, + { + "type": "Data Dependency", + "name": "Volumes Multi-Time-Frame-Daily", + "project": "Foundations", + "id": "3ecd2b4a-8339-4a90-bc57-771405c2fac6", + "savedPayload": { + "position": { + "x": 34649.17474508969, + "y": 19378.121956834537 + }, + "targetPosition": { + "x": 34920.07694296562, + "y": 19157.349578981608 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 4, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Daily", + "id": "2e683057-f911-4105-bc77-16f2706d1915" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Volumes", + "Product Definition", + "Foundations", + "1a366aef-efef-470e-88e0-2a6fbe4dd91f" + ], + [ + "Multi-Time-Frame-Daily", + "Dataset Definition", + "Foundations", + "2e683057-f911-4105-bc77-16f2706d1915" + ] + ] + } + } + ], + "dataMineDataDependencies": [], + "id": "9bd52f0c-2575-425c-97b4-91e00ccaa7b6", + "savedPayload": { + "position": { + "x": 35771.80004314583, + "y": 19156.531410872958 + }, + "targetPosition": { + "x": 35482.02229525911, + "y": 19078.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "statusReport": { + "type": "Status Report", + "name": "New Status Report", + "project": "Foundations", + "id": "fa60009c-41d9-4873-a2c8-189bc92ab157", + "savedPayload": { + "position": { + "x": 35694.15432961507, + "y": 19291.017731698168 + }, + "targetPosition": { + "x": 35482.02229525911, + "y": 19078.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "executionStartedEvent": { + "type": "Execution Started Event", + "name": "", + "project": "Foundations", + "id": "ffc31467-3fae-4842-ba76-dd22fd2b33c7", + "savedPayload": { + "position": { + "x": 35520.845152024485, + "y": 19223.774571285565 + }, + "targetPosition": { + "x": 35482.02229525911, + "y": 19078.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "id": "f29d08f9-e7c8-490c-8fca-14851a0d3dc3" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Daily", + "Process Definition", + "Foundations", + "980ceb1d-7be6-454f-90d9-01ba1fd4a65d" + ], + [ + "New Execution Finished Event", + "Execution Finished Event", + "Foundations", + "f29d08f9-e7c8-490c-8fca-14851a0d3dc3" + ] + ] + } + }, + "executionFinishedEvent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "project": "Foundations", + "id": "52fc064f-0ee1-41cb-9a78-5440e7e3e41b", + "savedPayload": { + "position": { + "x": 35404.37658172835, + "y": 19368.663445228925 + }, + "targetPosition": { + "x": 35482.02229525911, + "y": 19078.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "2b16d149-2eea-4cab-8632-a4cffd5c6bf1", + "savedPayload": { + "position": { + "x": 35209.02229525911, + "y": 18960.885697342204 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18748.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Process Definition", + "name": "Multi-Time-Frame-Market", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"description\": \"Produces the MVWAP.\",\n \"deadWaitTime\": 0,\n \"normalWaitTime\": 0,\n \"retryWaitTime\": 10000,\n \"sleepWaitTime\": 3600000,\n \"comaWaitTime\": 86400000,\n \"framework\": {\n \"name\": \"Multi-Time-Frame-Market\"\n }\n}", + "project": "Foundations", + "processOutput": { + "type": "Process Output", + "name": "New Process Output", + "project": "Foundations", + "outputDatasets": [ + { + "type": "Output Dataset", + "name": "Multi-Time-Frame-Market MVWAP", + "project": "Foundations", + "id": "c46a9d4a-ece8-457f-a57d-114a63fb71e4", + "savedPayload": { + "position": { + "x": 34630.5093366354, + "y": 19270.052420051492 + }, + "targetPosition": { + "x": 34692.882843880725, + "y": 18976.60813983135 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Market", + "id": "601d886e-2bc1-46c1-b385-7fcc0dc1a2f2" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Indicator Bot", + "Foundations", + "053d6fd9-217c-4469-9796-91021f2f0d53" + ], + [ + "MVWAP", + "Product Definition", + "Foundations", + "0d93e7b6-08f8-4b07-b959-ee2f70d79e70" + ], + [ + "Multi-Time-Frame-Market", + "Dataset Definition", + "Foundations", + "601d886e-2bc1-46c1-b385-7fcc0dc1a2f2" + ] + ] + } + } + ], + "outputDatasetFolders": [], + "id": "74f07f4a-b353-4001-aee7-53ee538123d2", + "savedPayload": { + "position": { + "x": 35420.697882038476, + "y": 19309.75366298624 + }, + "targetPosition": { + "x": 35160.89026090314, + "y": 19159.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "processDependencies": { + "type": "Process Dependencies", + "name": "New Process Dependencies", + "project": "Foundations", + "statusDependencies": [ + { + "type": "Status Dependency", + "name": "", + "config": "{\n \"mainUtility\": \"Self Reference\"\n}", + "project": "Foundations", + "id": "13bbfc30-1df3-43ec-bf3b-a7190ff5a2ca", + "savedPayload": { + "position": { + "x": 35562.49143128677, + "y": 19582.95299462608 + }, + "targetPosition": { + "x": 35310.89026090314, + "y": 19419.56128412157 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "New Status Report", + "id": "990cc769-d7dc-4cb3-af94-7e8815d69b8f" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Indicator Bot", + "Foundations", + "053d6fd9-217c-4469-9796-91021f2f0d53" + ], + [ + "Multi-Time-Frame-Market", + "Process Definition", + "Foundations", + "9789d117-c9bf-4525-a5a2-06faf5d974c4" + ], + [ + "New Status Report", + "Status Report", + "Foundations", + "990cc769-d7dc-4cb3-af94-7e8815d69b8f" + ] + ] + } + }, + { + "type": "Status Dependency", + "name": "Candles Volumes Multi-Time-Frame-Market", + "config": "{\n \"mainUtility\": \"Market Ending Point\"\n}", + "project": "Foundations", + "id": "036ef5a5-6dab-42ec-b6f6-1919418fe3ad", + "savedPayload": { + "position": { + "x": 35499.686378218095, + "y": 19652.705072558663 + }, + "targetPosition": { + "x": 35310.89026090314, + "y": 19419.56128412157 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Status Report", + "name": "Candles Volumes Multi-Time-Frame-Market Status Report", + "id": "a0a61ba9-91cb-4ec7-92fe-134ff079de2d" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Market", + "Process Definition", + "Foundations", + "9f683143-a33f-42c1-9fa8-c601f01ee4e1" + ], + [ + "Candles Volumes Multi-Time-Frame-Market Status Report", + "Status Report", + "Foundations", + "a0a61ba9-91cb-4ec7-92fe-134ff079de2d" + ] + ] + } + } + ], + "dataDependencies": [ + { + "type": "Data Dependency", + "name": "Candles Multi-Time-Frame-Market", + "project": "Foundations", + "id": "cea62d1a-fb40-45b2-88af-7b864038e9e6", + "savedPayload": { + "position": { + "x": 35373.26376814847, + "y": 19713.005564341714 + }, + "targetPosition": { + "x": 35310.89026090314, + "y": 19419.56128412157 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Market", + "id": "2b03494a-67d6-47f1-89b6-53fc4c9116a8" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Candles", + "Product Definition", + "Foundations", + "fe6065ec-4d2d-47a0-bae0-8647f0e195d7" + ], + [ + "Multi-Time-Frame-Market", + "Dataset Definition", + "Foundations", + "2b03494a-67d6-47f1-89b6-53fc4c9116a8" + ] + ] + } + }, + { + "type": "Data Dependency", + "name": "Volumes Multi-Time-Frame-Market", + "project": "Foundations", + "id": "674a69ff-e1ec-4294-8b80-fa69ef2bfdc2", + "savedPayload": { + "position": { + "x": 35188.8692679804, + "y": 19693.624921414354 + }, + "targetPosition": { + "x": 35310.89026090314, + "y": 19419.56128412157 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Market", + "id": "9bf0483c-4825-4a46-9cf4-1b5262579fc1" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Volumes", + "Product Definition", + "Foundations", + "1a366aef-efef-470e-88e0-2a6fbe4dd91f" + ], + [ + "Multi-Time-Frame-Market", + "Dataset Definition", + "Foundations", + "9bf0483c-4825-4a46-9cf4-1b5262579fc1" + ] + ] + } + } + ], + "dataMineDataDependencies": [], + "id": "91868fea-6d88-4aee-b326-41a1fdf17b0c", + "savedPayload": { + "position": { + "x": 35310.89026090314, + "y": 19419.56128412157 + }, + "targetPosition": { + "x": 35160.89026090314, + "y": 19159.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "statusReport": { + "type": "Status Report", + "name": "New Status Report", + "project": "Foundations", + "id": "990cc769-d7dc-4cb3-af94-7e8815d69b8f", + "savedPayload": { + "position": { + "x": 35160.89026090314, + "y": 19459.75366298624 + }, + "targetPosition": { + "x": 35160.89026090314, + "y": 19159.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "executionStartedEvent": { + "type": "Execution Started Event", + "name": "", + "project": "Foundations", + "id": "84c49f41-9da1-4566-b4c1-5c5b5151df2b", + "savedPayload": { + "position": { + "x": 35010.89026090314, + "y": 19419.56128412157 + }, + "targetPosition": { + "x": 35160.89026090314, + "y": 19159.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "id": "1824fa00-dd30-4cdc-acc0-01c2f29056c5" + }, + "referenceParentCombinedNodePath": [ + [ + "Candles", + "Data Mine", + "Foundations", + "70c7eea3-a786-4dda-b526-0514e2cb14cc" + ], + [ + "Candles Volumes", + "Indicator Bot", + "Foundations", + "285a4618-0423-4ac9-9df9-7a78be6fd915" + ], + [ + "Multi-Time-Frame-Market", + "Process Definition", + "Foundations", + "9f683143-a33f-42c1-9fa8-c601f01ee4e1" + ], + [ + "New Execution Finished Event", + "Execution Finished Event", + "Foundations", + "1824fa00-dd30-4cdc-acc0-01c2f29056c5" + ] + ] + } + }, + "executionFinishedEvent": { + "type": "Execution Finished Event", + "name": "New Execution Finished Event", + "project": "Foundations", + "id": "633725a5-7f2d-4912-8804-1a7d927584dc", + "savedPayload": { + "position": { + "x": 34901.08263976781, + "y": 19309.75366298624 + }, + "targetPosition": { + "x": 35160.89026090314, + "y": 19159.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "9789d117-c9bf-4525-a5a2-06faf5d974c4", + "savedPayload": { + "position": { + "x": 34996.89026090314, + "y": 19048.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18748.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "products": [ + { + "type": "Product Definition", + "name": "MVWAP", + "config": "{\n \"codeName\": \"Moving-VWAP\",\n \"singularVariableName\": \"MVWAP\",\n \"pluralVariableName\": \"MVWAPs\"\n}", + "project": "Foundations", + "datasets": [ + { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Daily", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Daily\",\n \"type\": \"Daily Files\",\n \"validTimeFrames\": [\n \"45-min\",\n \"40-min\",\n \"30-min\",\n \"20-min\",\n \"15-min\",\n \"10-min\",\n \"05-min\",\n \"04-min\",\n \"03-min\",\n \"02-min\",\n \"01-min\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame/@Year/@Month/@Day\",\n \"fileName\": \"Data.json\",\n \"dataRange\": {\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset\",\n \"fileName\": \"Data.Range.json\"\n }\n}", + "project": "Foundations", + "id": "d84addaf-b023-4ea8-8e15-b7576c911bb5", + "savedPayload": { + "position": { + "x": 34831.68856605925, + "y": 19257.192199520745 + }, + "targetPosition": { + "x": 34784.75822654718, + "y": 18960.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Dataset Definition", + "name": "Multi-Time-Frame-Market", + "config": "{\n \"codeName\": \"Multi-Time-Frame-Market\",\n \"type\": \"Market Files\",\n \"validTimeFrames\": [\n \"24-hs\",\n \"12-hs\",\n \"08-hs\",\n \"06-hs\",\n \"04-hs\",\n \"03-hs\",\n \"02-hs\",\n \"01-hs\"\n ],\n \"filePath\": \"Project/@Project/@MineType/@Mine/@Bot/@Exchange/@BaseAsset-@QuotedAsset/Output/@Product/@Dataset/@TimeFrame\",\n \"fileName\": \"Data.json\"\n}", + "project": "Foundations", + "id": "601d886e-2bc1-46c1-b385-7fcc0dc1a2f2", + "savedPayload": { + "position": { + "x": 34648.561076625316, + "y": 19228.187654598714 + }, + "targetPosition": { + "x": 34784.75822654718, + "y": 18960.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "record": { + "type": "Record Definition", + "name": "New Record Definition", + "project": "Foundations", + "properties": [ + { + "type": "Record Property", + "name": "MVWAP1", + "config": "{\n \"codeName\": \"mvwap1\",\n \"isString\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Record Formula", + "code": "variable.mvwap1", + "project": "Foundations", + "id": "ef6bfa96-40e6-4474-8aa7-7cf4d548953e", + "savedPayload": { + "position": { + "x": 34504.37228022993, + "y": 19346.74023095271 + }, + "targetPosition": { + "x": 34509.60587585423, + "y": 19246.87727747725 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 1, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "8e4bfd43-e63d-4bfd-aa53-47c3da245ea4", + "savedPayload": { + "position": { + "x": 34509.60587585423, + "y": 19246.87727747725 + }, + "targetPosition": { + "x": 34517.45626929067, + "y": 19097.082847264068 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "Begin", + "config": "{\n \"codeName\": \"begin\",\n \"isString\": false,\n \"isCalculated\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "record.current.begin", + "project": "Foundations", + "id": "3df0ae24-b1f6-4cea-9792-d7f1b447bfcc", + "savedPayload": { + "position": { + "x": 34354.064558786165, + "y": 19348.684017647694 + }, + "targetPosition": { + "x": 34435.760414038414, + "y": 19222.88343245588 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "479d4112-5211-4626-83b0-5232e294f516", + "savedPayload": { + "position": { + "x": 34435.760414038414, + "y": 19222.88343245588 + }, + "targetPosition": { + "x": 34517.45626929067, + "y": 19097.082847264068 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "End", + "config": "{ \n\"codeName\": \"end\",\n\"isString\": false,\n\"isCalculated\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "record.current.end", + "project": "Foundations", + "id": "7f3e837f-97d1-4cdc-9c58-9c746b3f8720", + "savedPayload": { + "position": { + "x": 34250.15431203416, + "y": 19233.27999718593 + }, + "targetPosition": { + "x": 34383.805290662414, + "y": 19165.181422225 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "08003b07-39ee-4abf-8b87-3ae817d9d166", + "savedPayload": { + "position": { + "x": 34383.805290662414, + "y": 19165.181422225 + }, + "targetPosition": { + "x": 34517.45626929067, + "y": 19097.082847264068 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "MVWAP2", + "config": "{\n \"codeName\": \"mvwap2\",\n \"isString\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Formula", + "code": "variable.mvwap2", + "project": "Foundations", + "id": "b8cc2197-7ef0-42d5-80f7-255a93151296", + "savedPayload": { + "position": { + "x": 34267.798885602024, + "y": 19083.998858203333 + }, + "targetPosition": { + "x": 34367.66183907748, + "y": 19089.232453827626 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "6ecdcfd8-804a-4ea4-97f6-aaa854f5453e", + "savedPayload": { + "position": { + "x": 34367.66183907748, + "y": 19089.232453827626 + }, + "targetPosition": { + "x": 34517.45626929067, + "y": 19097.082847264068 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Record Property", + "name": "MVWAP3", + "config": "{\n \"codeName\": \"mvwap3\",\n \"isString\": false\n}", + "project": "Foundations", + "recordFormula": { + "type": "Record Formula", + "name": "New Record Formula", + "code": "variable.mvwap3", + "project": "Foundations", + "id": "368a40de-2142-4b5c-8992-483a4ab89f1a", + "savedPayload": { + "position": { + "x": 34307.78862730431, + "y": 18960.92308851031 + }, + "targetPosition": { + "x": 34391.655684098856, + "y": 19015.386992011816 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "5166bb7d-6d46-4c7c-a56f-ae4536d3114e", + "savedPayload": { + "position": { + "x": 34391.655684098856, + "y": 19015.386992011816 + }, + "targetPosition": { + "x": 34517.45626929067, + "y": 19097.082847264068 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "f3a59ecc-efe7-4f0b-afdc-3eb2277247a6", + "savedPayload": { + "position": { + "x": 34517.45626929067, + "y": 19097.082847264068 + }, + "targetPosition": { + "x": 34784.75822654718, + "y": 18960.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "dataBuilding": { + "type": "Data Building Procedure", + "name": "New Data Building Procedure", + "project": "Foundations", + "loop": { + "type": "Procedure Loop", + "name": "New Procedure Loop", + "project": "Foundations", + "procedureJavascriptCode": { + "type": "Procedure Javascript Code", + "name": "New Procedure Javascript Code", + "code": "/* Loop Code */\nlet movingAvLen1 = 10;\nlet movingAvLen2 = 5;\t\t\nlet movingAvLen3 = 20;\nlet candle = record.current;\nlet volume = getElement('volumes', candle);\nlet AllVolume = volume.buy; // + volume.sell;\nlet MaxLen = Math.max(movingAvLen1, movingAvLen2, movingAvLen3);\n//variable.volBuy = AllVolume;\n\n\n// Calculate PriceVolume\nvariable.PVSum.push(calculatePV() );\n\nif (variable.PVSum.length > MaxLen) {\n variable.PVSum.splice(0, 1); // Remove the first element of the array to keep it at a maximum of movingAvLen1 elements (default 10) \n}\n\n// Add current volume to array\nvariable.VolSum.push(AllVolume);\n\nif (variable.VolSum.length > MaxLen) {\n variable.VolSum.splice(0, 1) // Remove the first element of the array to keep it at a maximum of movingAvLen1 elements (default 10) \n}\n\nvariable.mvwap1 = calculateVolSum(movingAvLen1);\nvariable.mvwap2 = calculateVolSum(movingAvLen2);\nvariable.mvwap3 = calculateVolSum(movingAvLen3);\n\n//////////////////\n// new functions\n\nfunction calculatePV()\t{\n\treturn (candle.close + candle.max + candle.min) / 3 * AllVolume;\n}\n\nfunction calculateVolSum(length) {\n\t/* We check we have enough values to make the calculation */\n if (variable.PVSum.length < length) { return 0 } // If not, define the value as zero.\n\t\n\tlet sum1 = 0 // Initialise sum variables. \n\tlet sum2 = 0 \n for (let i = variable.PVSum.length - length; i < variable.PVSum.length; i++) { // Iterate through the array\n sum1 = sum1 + variable.PVSum[i];\n\t\tsum2 = sum2 + variable.VolSum[i];\n }\n \n let MVWAP = sum1 / sum2;\n return MVWAP;\n}\n", + "project": "Foundations", + "id": "17c38500-0967-4ed8-8133-471b7ae8cdf9", + "savedPayload": { + "position": { + "x": 33928.303468470316, + "y": 19128.976127557315 + }, + "targetPosition": { + "x": 34208.37759641948, + "y": 19021.465742693726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "63ee4a6c-4ef7-4c90-b985-b7563e87f56f", + "savedPayload": { + "position": { + "x": 34208.37759641948, + "y": 19021.465742693726 + }, + "targetPosition": { + "x": 34488.45172436864, + "y": 18913.955357830135 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "initialization": { + "type": "Procedure Initialization", + "name": "New Procedure Initialization", + "project": "Foundations", + "procedureJavascriptCode": { + "type": "Procedure Javascript Code", + "name": "New Procedure Javascript Code", + "code": "variable.PVSum = []\nvariable.VolSum= []", + "project": "Foundations", + "id": "70e750a1-cd0b-4017-bb43-f6f98a61b3ba", + "savedPayload": { + "position": { + "x": 34022.164147494455, + "y": 18536.363123200234 + }, + "targetPosition": { + "x": 34255.307935931545, + "y": 18725.159240515182 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "b04ba3ae-16ee-4885-b362-9cce885b61df", + "savedPayload": { + "position": { + "x": 34255.307935931545, + "y": 18725.159240515182 + }, + "targetPosition": { + "x": 34488.45172436864, + "y": 18913.955357830135 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "1a1df272-90a1-49e6-92df-f05c376e9cc4", + "savedPayload": { + "position": { + "x": 34488.45172436864, + "y": 18913.955357830135 + }, + "targetPosition": { + "x": 34784.75822654718, + "y": 18960.885697342204 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "0d93e7b6-08f8-4b07-b959-ee2f70d79e70", + "savedPayload": { + "position": { + "x": 34784.75822654718, + "y": 18960.885697342204 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18748.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Plotter Module", + "name": "MVWAP", + "id": "6acec7f3-960f-4747-a675-e5961a67d2fd" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Plotter", + "Foundations", + "d9335835-0c95-4a98-9c42-bad2fb3e8625" + ], + [ + "MVWAP", + "Plotter Module", + "Foundations", + "6acec7f3-960f-4747-a675-e5961a67d2fd" + ] + ] + } + } + ], + "id": "053d6fd9-217c-4469-9796-91021f2f0d53", + "savedPayload": { + "position": { + "x": 34996.89026090314, + "y": 18748.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "plotters": [ + { + "type": "Plotter", + "name": "Keltner Channel", + "config": "{\n \"codeName\": \"PlotterKeltnerChannel\"\n}", + "project": "Foundations", + "modules": [ + { + "type": "Plotter Module", + "name": "Keltner Channel", + "config": "{\n \"codeName\": \"keltner\",\n \"icon\": \"oscillator\"\n}", + "project": "Foundations", + "shapes": { + "type": "Shapes", + "name": "New Shapes", + "project": "Foundations", + "chartPoints": [ + { + "type": "Chart Points", + "name": "New Chart Points", + "project": "Foundations", + "points": [ + { + "type": "Point", + "name": "Upper Begin", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.begin\ny = record.previous.Upper", + "project": "Foundations", + "id": "1fe6c54b-965a-490e-aaa0-9e91d42e1225", + "savedPayload": { + "position": { + "x": 34661.85906606672, + "y": 18814.701890036642 + }, + "targetPosition": { + "x": 34472.246850369556, + "y": 18935.830778657044 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "eadadd34-a8fc-4fbf-96ea-89d6ff20504f", + "savedPayload": { + "position": { + "x": 34472.246850369556, + "y": 18935.830778657044 + }, + "targetPosition": { + "x": 34282.6346346724, + "y": 19056.95966727745 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "Upper End", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.end\ny = record.Upper", + "project": "Foundations", + "id": "e94919ff-a90f-48ad-9ae0-499da910e8db", + "savedPayload": { + "position": { + "x": 34708.48195738203, + "y": 19202.404013131956 + }, + "targetPosition": { + "x": 34495.558296027215, + "y": 19129.681840204703 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "a3126212-4048-4e00-8bdd-af5c33b8e291", + "savedPayload": { + "position": { + "x": 34495.558296027215, + "y": 19129.681840204703 + }, + "targetPosition": { + "x": 34282.6346346724, + "y": 19056.95966727745 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "Lower Begin", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.begin\ny = record.previous.Lower", + "project": "Foundations", + "id": "15981871-4e85-470a-a00d-36720fd49a62", + "savedPayload": { + "position": { + "x": 34396.4835054141, + "y": 19374.677599775503 + }, + "targetPosition": { + "x": 34358.53388183354, + "y": 19268.771622276152 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "092721ff-a16d-44a4-a396-89e7926d3625", + "savedPayload": { + "position": { + "x": 34358.53388183354, + "y": 19268.771622276152 + }, + "targetPosition": { + "x": 34282.6346346724, + "y": 19056.95966727745 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "Lower End", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.end\ny = record.Lower", + "project": "Foundations", + "id": "fb5be4b7-1000-47c6-a94d-b2dbbfbaca47", + "savedPayload": { + "position": { + "x": 34105.21636236135, + "y": 19344.064189446926 + }, + "targetPosition": { + "x": 34164.355786465036, + "y": 19248.3626820571 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "95ff8e74-7261-433c-9b0f-78a6f2f633a5", + "savedPayload": { + "position": { + "x": 34164.355786465036, + "y": 19248.3626820571 + }, + "targetPosition": { + "x": 34282.6346346724, + "y": 19056.95966727745 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "Mid Point Begin", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.begin\ny = record.previous.midPoint", + "project": "Foundations", + "id": "e2ccbb12-3d7e-4acb-844b-f9b301130178", + "savedPayload": { + "position": { + "x": 33947.548797032025, + "y": 19097.25521805978 + }, + "targetPosition": { + "x": 34059.244076245486, + "y": 19083.823367799007 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "d56911f2-08d6-47a3-81ad-418a915a8d6c", + "savedPayload": { + "position": { + "x": 34059.244076245486, + "y": 19083.823367799007 + }, + "targetPosition": { + "x": 34282.6346346724, + "y": 19056.95966727745 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "Mid Point End", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.end\ny = record.midPoint", + "project": "Foundations", + "id": "7d7be680-07e5-4224-8368-31823bd15e56", + "savedPayload": { + "position": { + "x": 34042.20770195132, + "y": 18820.1028750541 + }, + "targetPosition": { + "x": 34122.35001285835, + "y": 18899.05513912855 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "7ddf6ba1-b696-44ea-a0df-9717f0ce94db", + "savedPayload": { + "position": { + "x": 34122.35001285835, + "y": 18899.05513912855 + }, + "targetPosition": { + "x": 34282.6346346724, + "y": 19056.95966727745 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 2, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "9aaac874-f08b-4253-b9bc-a7f3541a1f08", + "savedPayload": { + "position": { + "x": 34282.6346346724, + "y": 19056.95966727745 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18609.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 4, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "polygons": [ + { + "type": "Polygon", + "name": "Upper", + "project": "Foundations", + "polygonBorder": { + "type": "Polygon Border", + "name": "New Polygon Border", + "project": "Foundations", + "style": { + "type": "Style", + "name": "New Style", + "config": "{\n \"default\": {\n \"opacity\": 1,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.3,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\"\n }\n}", + "project": "Foundations", + "id": "72efdcea-34cc-4b0f-b81d-baad3222185e", + "savedPayload": { + "position": { + "x": 34160.33483498095, + "y": 19431.54598285769 + }, + "targetPosition": { + "x": 34144.63404810807, + "y": 19131.95712243132 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "styleConditions": [], + "id": "566b1429-a7e9-4cdf-9701-50daac479e24", + "savedPayload": { + "position": { + "x": 34144.63404810807, + "y": 19131.95712243132 + }, + "targetPosition": { + "x": 34128.93326123519, + "y": 18832.368262004944 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "polygonVertexes": [ + { + "type": "Polygon Vertex", + "name": " Upper Begin", + "project": "Foundations", + "id": "c3d21569-eebe-4eb8-a142-5315f87ab4ca", + "savedPayload": { + "position": { + "x": 33928.19407932753, + "y": 19055.311709648162 + }, + "targetPosition": { + "x": 34128.93326123519, + "y": 18832.368262004944 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "Upper Begin", + "id": "eadadd34-a8fc-4fbf-96ea-89d6ff20504f" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Plotter", + "Foundations", + "964976a0-0546-434f-994b-36c5cd03437e" + ], + [ + "Keltner Channel", + "Plotter Module", + "Foundations", + "32f94206-6147-48df-9860-c94793356f85" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "8f211d0d-ea26-4f02-8135-4ecc38675f56" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "9aaac874-f08b-4253-b9bc-a7f3541a1f08" + ], + [ + "Upper Begin", + "Point", + "Foundations", + "eadadd34-a8fc-4fbf-96ea-89d6ff20504f" + ] + ] + } + }, + { + "type": "Polygon Vertex", + "name": " Upper End", + "project": "Foundations", + "id": "9b7d10f2-1d9e-40e8-b7b4-f91493db86fe", + "savedPayload": { + "position": { + "x": 33829.34440080881, + "y": 18848.069048877827 + }, + "targetPosition": { + "x": 34128.93326123519, + "y": 18832.368262004944 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "Upper End", + "id": "a3126212-4048-4e00-8bdd-af5c33b8e291" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Plotter", + "Foundations", + "964976a0-0546-434f-994b-36c5cd03437e" + ], + [ + "Keltner Channel", + "Plotter Module", + "Foundations", + "32f94206-6147-48df-9860-c94793356f85" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "8f211d0d-ea26-4f02-8135-4ecc38675f56" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "9aaac874-f08b-4253-b9bc-a7f3541a1f08" + ], + [ + "Upper End", + "Point", + "Foundations", + "a3126212-4048-4e00-8bdd-af5c33b8e291" + ] + ] + } + } + ], + "id": "eae5b9d1-5f86-4669-9fac-c656b84ac4f1", + "savedPayload": { + "position": { + "x": 34128.93326123519, + "y": 18832.368262004944 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18609.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Polygon", + "name": "Lower", + "project": "Foundations", + "polygonBorder": { + "type": "Polygon Border", + "name": "New Polygon Border", + "project": "Foundations", + "style": { + "type": "Style", + "name": "New Style", + "config": "{\n \"default\": {\n \"opacity\": 1,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.3,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\"\n }\n}", + "project": "Foundations", + "id": "53e41ab6-14b1-425e-82a0-394103315285", + "savedPayload": { + "position": { + "x": 33709.444741913685, + "y": 19175.000662374307 + }, + "targetPosition": { + "x": 33872.836452418196, + "y": 18923.39949199068 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "styleConditions": [], + "id": "9ed21a92-a6c0-4f9e-b22c-23f528b0b0a0", + "savedPayload": { + "position": { + "x": 33872.836452418196, + "y": 18923.39949199068 + }, + "targetPosition": { + "x": 34036.2281629227, + "y": 18671.798321607053 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "polygonVertexes": [ + { + "type": "Polygon Vertex", + "name": " Lower Begin", + "project": "Foundations", + "id": "e778c4d5-975b-4821-9483-6e41ddf283a1", + "savedPayload": { + "position": { + "x": 33742.78388270256, + "y": 18734.17182885238 + }, + "targetPosition": { + "x": 34036.2281629227, + "y": 18671.798321607053 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "Lower Begin", + "id": "092721ff-a16d-44a4-a396-89e7926d3625" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Plotter", + "Foundations", + "964976a0-0546-434f-994b-36c5cd03437e" + ], + [ + "Keltner Channel", + "Plotter Module", + "Foundations", + "32f94206-6147-48df-9860-c94793356f85" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "8f211d0d-ea26-4f02-8135-4ecc38675f56" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "9aaac874-f08b-4253-b9bc-a7f3541a1f08" + ], + [ + "Lower Begin", + "Point", + "Foundations", + "092721ff-a16d-44a4-a396-89e7926d3625" + ] + ] + } + }, + { + "type": "Polygon Vertex", + "name": " Lower End", + "project": "Foundations", + "id": "05347dbc-3075-4967-b5a8-666d4cdb131f", + "savedPayload": { + "position": { + "x": 33784.62699253907, + "y": 18508.406611102546 + }, + "targetPosition": { + "x": 34036.2281629227, + "y": 18671.798321607053 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "Lower End", + "id": "95ff8e74-7261-433c-9b0f-78a6f2f633a5" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Plotter", + "Foundations", + "964976a0-0546-434f-994b-36c5cd03437e" + ], + [ + "Keltner Channel", + "Plotter Module", + "Foundations", + "32f94206-6147-48df-9860-c94793356f85" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "8f211d0d-ea26-4f02-8135-4ecc38675f56" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "9aaac874-f08b-4253-b9bc-a7f3541a1f08" + ], + [ + "Lower End", + "Point", + "Foundations", + "95ff8e74-7261-433c-9b0f-78a6f2f633a5" + ] + ] + } + } + ], + "id": "983dd24c-8dfd-4e9b-94ae-be479e59e37d", + "savedPayload": { + "position": { + "x": 34036.2281629227, + "y": 18671.798321607053 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18609.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Polygon", + "name": "Mid Point", + "project": "Foundations", + "polygonBorder": { + "type": "Polygon Border", + "name": "New Polygon Border", + "project": "Foundations", + "style": { + "type": "Style", + "name": "New Style", + "config": "{\n \"default\": {\n \"opacity\": 1,\n \"lineWidth\": 2,\n \"lineDash\": [\n 5,\n 5\n ],\n \"paletteColor\": \"UI_COLOR.MANGANESE_PURPLE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.5,\n \"lineWidth\": 2,\n \"lineDash\": [\n 5,\n 5\n ],\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\"\n }\n}", + "project": "Foundations", + "id": "e8131923-c3b3-4d53-a68d-fafcb47e7e5c", + "savedPayload": { + "position": { + "x": 54129.8707465767, + "y": 24314.753439790686 + }, + "targetPosition": { + "x": 54409.94487452586, + "y": 24207.243054927094 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "styleConditions": [], + "id": "5f090d8f-b443-4c66-959a-d9ad8bfc346f", + "savedPayload": { + "position": { + "x": 33911.94487452587, + "y": 18633.24305492709 + }, + "targetPosition": { + "x": 34192.01900247503, + "y": 18525.732670063502 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "polygonVertexes": [ + { + "type": "Polygon Vertex", + "name": " Mid Point Begin", + "project": "Foundations", + "id": "13b06082-50cc-4e47-bf9c-ae32e4a2751b", + "savedPayload": { + "position": { + "x": 33917.95536518225, + "y": 18403.71167714076 + }, + "targetPosition": { + "x": 34192.01900247503, + "y": 18525.732670063502 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "Mid Point Begin", + "id": "d56911f2-08d6-47a3-81ad-418a915a8d6c" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Plotter", + "Foundations", + "964976a0-0546-434f-994b-36c5cd03437e" + ], + [ + "Keltner Channel", + "Plotter Module", + "Foundations", + "32f94206-6147-48df-9860-c94793356f85" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "8f211d0d-ea26-4f02-8135-4ecc38675f56" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "9aaac874-f08b-4253-b9bc-a7f3541a1f08" + ], + [ + "Mid Point Begin", + "Point", + "Foundations", + "d56911f2-08d6-47a3-81ad-418a915a8d6c" + ] + ] + } + }, + { + "type": "Polygon Vertex", + "name": " Mid Point End", + "project": "Foundations", + "id": "004812f4-c081-4e03-867f-a81d982cc412", + "savedPayload": { + "position": { + "x": 34084.50861761144, + "y": 18245.65854211434 + }, + "targetPosition": { + "x": 34192.01900247503, + "y": 18525.732670063502 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "Mid Point End", + "id": "7ddf6ba1-b696-44ea-a0df-9717f0ce94db" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "Keltner Channel", + "Plotter", + "Foundations", + "964976a0-0546-434f-994b-36c5cd03437e" + ], + [ + "Keltner Channel", + "Plotter Module", + "Foundations", + "32f94206-6147-48df-9860-c94793356f85" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "8f211d0d-ea26-4f02-8135-4ecc38675f56" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "9aaac874-f08b-4253-b9bc-a7f3541a1f08" + ], + [ + "Mid Point End", + "Point", + "Foundations", + "7ddf6ba1-b696-44ea-a0df-9717f0ce94db" + ] + ] + } + } + ], + "id": "8047e156-7d45-43ff-ba7a-df4057a2aae9", + "savedPayload": { + "position": { + "x": 34055.60880585006, + "y": 18487.403821438988 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18609.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "images": [], + "texts": [], + "id": "8f211d0d-ea26-4f02-8135-4ecc38675f56", + "savedPayload": { + "position": { + "x": 34137.08263976781, + "y": 18598.75366298624 + }, + "targetPosition": { + "x": 34396.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "panels": [ + { + "type": "Plotter Panel", + "name": "Keltner Channel", + "config": "{\n \"codeName\": \"keltner\"\n}", + "project": "Foundations", + "panelData": [ + { + "type": "Panel Data", + "name": "Upper", + "config": "{\n \"valueDecimals\": 2\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "Upper", + "code": "record.Upper", + "project": "Foundations", + "id": "b7357217-4ca8-411b-9790-bb9a75e6fd41", + "savedPayload": { + "position": { + "x": 33919.86482200751, + "y": 18719.232435497055 + }, + "targetPosition": { + "x": 34069.86482200751, + "y": 18459.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "e7d9afb8-d1c5-430f-bd37-e89fe36354e4", + "savedPayload": { + "position": { + "x": 33769.86482200751, + "y": 18459.424814361726 + }, + "targetPosition": { + "x": 34069.86482200751, + "y": 18459.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3de77949-632a-4d45-a6b1-5f1bc76e3b77", + "savedPayload": { + "position": { + "x": 34069.86482200751, + "y": 18459.424814361726 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18309.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Panel Data", + "name": "Lower", + "config": "{\n \"valueDecimals\": 2\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "New Data Formula", + "code": "record.Lower", + "project": "Foundations", + "id": "251be44e-7fd5-48d6-a8cb-3c61e8daff55", + "savedPayload": { + "position": { + "x": 33769.86482200751, + "y": 18459.424814361726 + }, + "targetPosition": { + "x": 34029.672443142845, + "y": 18309.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "3ff98377-3435-47c6-9b5d-f88a7085658e", + "savedPayload": { + "position": { + "x": 33769.86482200751, + "y": 18159.424814361726 + }, + "targetPosition": { + "x": 34029.672443142845, + "y": 18309.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "43b20f0f-aafa-4b13-9efc-902be33ea670", + "savedPayload": { + "position": { + "x": 34029.672443142845, + "y": 18309.424814361726 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18309.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Panel Data", + "name": "Mid Point", + "config": "{\n \"valueDecimals\": 2\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "New Data Formula", + "code": "record.midPoint", + "project": "Foundations", + "id": "537702dd-be3f-44e5-91d9-965c03724606", + "savedPayload": { + "position": { + "x": 33769.86482200751, + "y": 18159.424814361726 + }, + "targetPosition": { + "x": 34069.86482200751, + "y": 18159.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.MANGANESE_PURPLE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "dd9e76aa-d927-47cb-b230-fd7d9b3de354", + "savedPayload": { + "position": { + "x": 33982.275018632485, + "y": 18083.94604185091 + }, + "targetPosition": { + "x": 34069.86482200751, + "y": 18159.424814361726 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "9dc52956-ac8d-4fa6-a1fc-439cce8f308e", + "savedPayload": { + "position": { + "x": 34069.86482200751, + "y": 18159.424814361726 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18309.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Panel Data", + "name": "ATR", + "config": "{\n \"valueDecimals\": 2\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "New Data Formula", + "code": "record.AverageTrueRange", + "project": "Foundations", + "id": "274174dd-5c5c-4d98-bfc3-45b7500b4a5a", + "savedPayload": { + "position": { + "x": 33919.86482200751, + "y": 17899.617193226397 + }, + "targetPosition": { + "x": 34179.672443142845, + "y": 18049.617193226397 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.RUSTED_RED\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "e7589228-eb40-4902-abbf-616189293c6f", + "savedPayload": { + "position": { + "x": 34071.08263976781, + "y": 17743.94604185091 + }, + "targetPosition": { + "x": 34179.672443142845, + "y": 18049.617193226397 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3b6eea1b-4151-4534-9bc0-dc485c46ce68", + "savedPayload": { + "position": { + "x": 34179.672443142845, + "y": 18049.617193226397 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18309.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Panel Data", + "name": "Average ATR", + "config": "{\n \"valueDecimals\": 2\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "New Data Formula", + "code": "record.AverageATR", + "project": "Foundations", + "id": "926ae312-9817-44ff-aef3-c19d7ffc0eba", + "savedPayload": { + "position": { + "x": 34179.672443142845, + "y": 17749.617193226397 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18009.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.GREEN\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "c383e9ad-56cf-4c54-bbf9-72f4224cab8b", + "savedPayload": { + "position": { + "x": 34479.672443142845, + "y": 17749.617193226397 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18009.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "c56b9c1c-27ea-4d47-93ae-2e5f9f3b4692", + "savedPayload": { + "position": { + "x": 34329.672443142845, + "y": 18009.424814361726 + }, + "targetPosition": { + "x": 34329.672443142845, + "y": 18309.424814361726 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "3c346f09-ed7c-4011-aa5f-d82a6ee4c595", + "savedPayload": { + "position": { + "x": 34137.08263976781, + "y": 18298.75366298624 + }, + "targetPosition": { + "x": 34396.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "32f94206-6147-48df-9860-c94793356f85", + "savedPayload": { + "position": { + "x": 34396.89026090314, + "y": 18448.75366298624 + }, + "targetPosition": { + "x": 34696.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "964976a0-0546-434f-994b-36c5cd03437e", + "savedPayload": { + "position": { + "x": 34696.89026090314, + "y": 18448.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Plotter", + "name": "MVWAP", + "config": "{\n \"codeName\": \"Plotter MVWAP\"\n}", + "project": "Foundations", + "modules": [ + { + "type": "Plotter Module", + "name": "MVWAP", + "config": "{\n \"codeName\": \"Module-MVWAP\",\n \"icon\": \"moving-average\"\n}", + "project": "Foundations", + "shapes": { + "type": "Shapes", + "name": "New Shapes", + "project": "Foundations", + "chartPoints": [ + { + "type": "Chart Points", + "name": "New Chart Points", + "project": "Foundations", + "points": [ + { + "type": "Point", + "name": "1 End", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.end\ny = record.mvwap1", + "project": "Foundations", + "id": "a3d71d3f-4bb7-45ee-bdef-b60e43c7f7be", + "savedPayload": { + "position": { + "x": 34165.74006624955, + "y": 17966.083362207424 + }, + "targetPosition": { + "x": 34361.42628963299, + "y": 17738.69184526379 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3ae0c4f8-30d5-4b97-9381-d6224ea2eb3b", + "savedPayload": { + "position": { + "x": 34361.42628963299, + "y": 17738.69184526379 + }, + "targetPosition": { + "x": 34557.11251301642, + "y": 17511.300328320154 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "1 Begin", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.begin\ny = record.previous.mvwap1", + "project": "Foundations", + "id": "1e6af709-0c5a-411e-9d05-eee0a664c8ce", + "savedPayload": { + "position": { + "x": 34007.175159494436, + "y": 17751.235542912 + }, + "targetPosition": { + "x": 34282.14383625543, + "y": 17631.267935616077 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3f51f704-9795-4dca-bcee-da5c73744ae8", + "savedPayload": { + "position": { + "x": 34282.14383625543, + "y": 17631.267935616077 + }, + "targetPosition": { + "x": 34557.11251301642, + "y": 17511.300328320154 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "2 End", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.end\ny = record.mvwap2", + "project": "Foundations", + "id": "1ea966a8-127d-4d1e-a21b-b9e985dff279", + "savedPayload": { + "position": { + "x": 33957.53209014339, + "y": 17488.865611754358 + }, + "targetPosition": { + "x": 34257.3223015799, + "y": 17500.082970037256 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "8af146a1-40e2-44dd-b39f-bc72d644bb9e", + "savedPayload": { + "position": { + "x": 34257.3223015799, + "y": 17500.082970037256 + }, + "targetPosition": { + "x": 34557.11251301642, + "y": 17511.300328320154 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "2 Begin", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.begin\ny = record.previous.mvwap2", + "project": "Foundations", + "id": "639a2427-aa2b-4562-b5c1-534d21e55c11", + "savedPayload": { + "position": { + "x": 34026.64327691366, + "y": 17230.939151356317 + }, + "targetPosition": { + "x": 34291.87789496504, + "y": 17371.119739838236 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "6ee287b5-0e14-4661-b213-bc195cb30b46", + "savedPayload": { + "position": { + "x": 34291.87789496504, + "y": 17371.119739838236 + }, + "targetPosition": { + "x": 34557.11251301642, + "y": 17511.300328320154 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "3 End", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.end\ny = record.mvwap3", + "project": "Foundations", + "id": "4c18fc30-3ca6-4c7e-a872-3ec3bb712627", + "savedPayload": { + "position": { + "x": 34200.82040167232, + "y": 17028.541660460152 + }, + "targetPosition": { + "x": 34378.96645734437, + "y": 17269.92099439015 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "44bf5bf5-deb5-418b-8e01-1f88b5b4b179", + "savedPayload": { + "position": { + "x": 34378.96645734437, + "y": 17269.92099439015 + }, + "targetPosition": { + "x": 34557.11251301642, + "y": 17511.300328320154 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Point", + "name": "3 Begin", + "project": "Foundations", + "pointFormula": { + "type": "Point Formula", + "name": "New Point Formula", + "code": "x = record.begin\ny = record.previous.mvwap3", + "project": "Foundations", + "id": "dab80706-b152-494d-888b-2bb6ef77e82d", + "savedPayload": { + "position": { + "x": 34445.565548718674, + "y": 16921.760444380183 + }, + "targetPosition": { + "x": 34501.339030867544, + "y": 17216.53038635017 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "1e16fe95-ec92-4e66-b06d-744b71f127ca", + "savedPayload": { + "position": { + "x": 34501.339030867544, + "y": 17216.53038635017 + }, + "targetPosition": { + "x": 34557.11251301642, + "y": 17511.300328320154 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "70e90fe5-e95e-4d30-8f3f-5f85c2450203", + "savedPayload": { + "position": { + "x": 34548.533692292665, + "y": 17557.587502870614 + }, + "targetPosition": { + "x": 34846.89026090314, + "y": 17588.94604185091 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "polygons": [ + { + "type": "Polygon", + "name": "VWAP1", + "project": "Foundations", + "polygonBorder": { + "type": "Polygon Border", + "name": "New Polygon Border", + "project": "Foundations", + "style": { + "type": "Style", + "name": "New Style", + "config": "{\n \"default\": {\n \"opacity\": 0.7,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.ULTRAMARINE_BLUE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.85,\n \"lineWidth\": 2.5,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n }\n}", + "project": "Foundations", + "id": "4f2953f0-0568-4ba5-98e6-793c04e124a2", + "savedPayload": { + "position": { + "x": 34024.76909240718, + "y": 17419.60843368902 + }, + "targetPosition": { + "x": 34324.357952833554, + "y": 17403.907646816137 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "styleConditions": [], + "id": "b9b9e753-b188-42c7-8351-8bb69c04b5ef", + "savedPayload": { + "position": { + "x": 34324.357952833554, + "y": 17403.907646816137 + }, + "targetPosition": { + "x": 34623.94681325993, + "y": 17388.206859943253 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "polygonVertexes": [ + { + "type": "Polygon Vertex", + "name": " 1 Begin", + "project": "Foundations", + "id": "740f091b-f0b4-431a-9e4a-bb81b3ce5fd6", + "savedPayload": { + "position": { + "x": 34401.00336561671, + "y": 17187.467678035595 + }, + "targetPosition": { + "x": 34623.94681325993, + "y": 17388.206859943253 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "1 Begin", + "id": "3f51f704-9795-4dca-bcee-da5c73744ae8" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Plotter", + "Foundations", + "d9335835-0c95-4a98-9c42-bad2fb3e8625" + ], + [ + "MVWAP", + "Plotter Module", + "Foundations", + "6acec7f3-960f-4747-a675-e5961a67d2fd" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "337b350d-42df-441e-b6fa-1f42901dd52b" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "70e90fe5-e95e-4d30-8f3f-5f85c2450203" + ], + [ + "1 Begin", + "Point", + "Foundations", + "3f51f704-9795-4dca-bcee-da5c73744ae8" + ] + ] + } + }, + { + "type": "Polygon Vertex", + "name": " 1 End", + "project": "Foundations", + "id": "e7e2a2ec-86e9-4557-8e83-a1533169fdd0", + "savedPayload": { + "position": { + "x": 34608.246026387045, + "y": 17088.61799951688 + }, + "targetPosition": { + "x": 34623.94681325993, + "y": 17388.206859943253 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "1 End", + "id": "3ae0c4f8-30d5-4b97-9381-d6224ea2eb3b" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Plotter", + "Foundations", + "d9335835-0c95-4a98-9c42-bad2fb3e8625" + ], + [ + "MVWAP", + "Plotter Module", + "Foundations", + "6acec7f3-960f-4747-a675-e5961a67d2fd" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "337b350d-42df-441e-b6fa-1f42901dd52b" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "70e90fe5-e95e-4d30-8f3f-5f85c2450203" + ], + [ + "1 End", + "Point", + "Foundations", + "3ae0c4f8-30d5-4b97-9381-d6224ea2eb3b" + ] + ] + } + } + ], + "id": "9610197b-2ee3-4216-a64f-c39426662712", + "savedPayload": { + "position": { + "x": 34623.94681325993, + "y": 17388.206859943253 + }, + "targetPosition": { + "x": 34846.89026090314, + "y": 17588.94604185091 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Polygon", + "name": "VWAP2", + "project": "Foundations", + "polygonBorder": { + "type": "Polygon Border", + "name": "New Polygon Border", + "project": "Foundations", + "style": { + "type": "Style", + "name": "New Style", + "config": "{\n \"default\": {\n \"opacity\": 0.7,\n \"lineWidth\": 1.5,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.SKY_BLUE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.85,\n \"lineWidth\": 2,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n }\n}", + "project": "Foundations", + "id": "534dfc19-1446-4c09-8fb6-580559cadc02", + "savedPayload": { + "position": { + "x": 34281.31441289056, + "y": 16968.718340621752 + }, + "targetPosition": { + "x": 34532.91558327419, + "y": 17132.110051126263 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "styleConditions": [], + "id": "6459ae72-d0f5-40ce-8626-a658ebe6bc86", + "savedPayload": { + "position": { + "x": 34532.91558327419, + "y": 17132.110051126263 + }, + "targetPosition": { + "x": 34784.516753657816, + "y": 17295.501761630767 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "polygonVertexes": [ + { + "type": "Polygon Vertex", + "name": " 2 Begin", + "project": "Foundations", + "id": "dfdf6655-f57d-4df4-9281-f56c25505b11", + "savedPayload": { + "position": { + "x": 34722.14324641249, + "y": 17002.05748141063 + }, + "targetPosition": { + "x": 34784.516753657816, + "y": 17295.501761630767 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "2 Begin", + "id": "6ee287b5-0e14-4661-b213-bc195cb30b46" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Plotter", + "Foundations", + "d9335835-0c95-4a98-9c42-bad2fb3e8625" + ], + [ + "MVWAP", + "Plotter Module", + "Foundations", + "6acec7f3-960f-4747-a675-e5961a67d2fd" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "337b350d-42df-441e-b6fa-1f42901dd52b" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "70e90fe5-e95e-4d30-8f3f-5f85c2450203" + ], + [ + "2 Begin", + "Point", + "Foundations", + "6ee287b5-0e14-4661-b213-bc195cb30b46" + ] + ] + } + }, + { + "type": "Polygon Vertex", + "name": " 2 End", + "project": "Foundations", + "id": "36e094da-e034-49f8-9214-0aab6a237fb8", + "savedPayload": { + "position": { + "x": 34947.90846416232, + "y": 17043.90059124714 + }, + "targetPosition": { + "x": 34784.516753657816, + "y": 17295.501761630767 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "2 End", + "id": "8af146a1-40e2-44dd-b39f-bc72d644bb9e" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Plotter", + "Foundations", + "d9335835-0c95-4a98-9c42-bad2fb3e8625" + ], + [ + "MVWAP", + "Plotter Module", + "Foundations", + "6acec7f3-960f-4747-a675-e5961a67d2fd" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "337b350d-42df-441e-b6fa-1f42901dd52b" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "70e90fe5-e95e-4d30-8f3f-5f85c2450203" + ], + [ + "2 End", + "Point", + "Foundations", + "8af146a1-40e2-44dd-b39f-bc72d644bb9e" + ] + ] + } + } + ], + "id": "07060d0d-1f1e-4f86-a1ad-1eb257d2da08", + "savedPayload": { + "position": { + "x": 34784.516753657816, + "y": 17295.501761630767 + }, + "targetPosition": { + "x": 34846.89026090314, + "y": 17588.94604185091 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Polygon", + "name": "VWAP3", + "project": "Foundations", + "polygonBorder": { + "type": "Polygon Border", + "name": "New Polygon Border", + "project": "Foundations", + "style": { + "type": "Style", + "name": "New Style", + "config": "{\n \"default\": {\n \"opacity\": 0.7,\n \"lineWidth\": 2.5,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.TRUE_BLUE\"\n },\n \"atMousePosition\": {\n \"opacity\": 0.85,\n \"lineWidth\": 2.75,\n \"lineDash\": [\n 0,\n 0\n ],\n \"paletteColor\": \"UI_COLOR.DARK_TURQUOISE\"\n }\n}", + "project": "Foundations", + "id": "783ce799-6d4d-4375-87e3-5ac1fb63ed35", + "savedPayload": { + "position": { + "x": 34753.8904840987, + "y": 16754.73414865981 + }, + "targetPosition": { + "x": 34861.40086896229, + "y": 17034.80827660897 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "styleConditions": [], + "id": "b69d8381-bdae-4cda-ae70-628a4c3d3b07", + "savedPayload": { + "position": { + "x": 34861.40086896229, + "y": 17034.80827660897 + }, + "targetPosition": { + "x": 34968.911253825885, + "y": 17314.882404558128 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "polygonVertexes": [ + { + "type": "Polygon Vertex", + "name": " 3 Begin", + "project": "Foundations", + "id": "a7d90d47-a1ed-4515-879d-cb7a47d3d538", + "savedPayload": { + "position": { + "x": 35090.93224674862, + "y": 17040.81876726535 + }, + "targetPosition": { + "x": 34968.911253825885, + "y": 17314.882404558128 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "3 Begin", + "id": "1e16fe95-ec92-4e66-b06d-744b71f127ca" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Plotter", + "Foundations", + "d9335835-0c95-4a98-9c42-bad2fb3e8625" + ], + [ + "MVWAP", + "Plotter Module", + "Foundations", + "6acec7f3-960f-4747-a675-e5961a67d2fd" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "337b350d-42df-441e-b6fa-1f42901dd52b" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "70e90fe5-e95e-4d30-8f3f-5f85c2450203" + ], + [ + "3 Begin", + "Point", + "Foundations", + "1e16fe95-ec92-4e66-b06d-744b71f127ca" + ] + ] + } + }, + { + "type": "Polygon Vertex", + "name": " 3 End", + "project": "Foundations", + "id": "33600057-d3ae-46c1-a4e6-2a9eadb841cc", + "savedPayload": { + "position": { + "x": 35248.98538177504, + "y": 17207.37201969454 + }, + "targetPosition": { + "x": 34968.911253825885, + "y": 17314.882404558128 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "Point", + "name": "3 End", + "id": "44bf5bf5-deb5-418b-8e01-1f88b5b4b179" + }, + "referenceParentCombinedNodePath": [ + [ + "quantum", + "Data Mine", + "Foundations", + "c605cc22-976a-4661-afbd-f735d6f8f8d9" + ], + [ + "MVWAP", + "Plotter", + "Foundations", + "d9335835-0c95-4a98-9c42-bad2fb3e8625" + ], + [ + "MVWAP", + "Plotter Module", + "Foundations", + "6acec7f3-960f-4747-a675-e5961a67d2fd" + ], + [ + "New Shapes", + "Shapes", + "Foundations", + "337b350d-42df-441e-b6fa-1f42901dd52b" + ], + [ + "New Chart Points", + "Chart Points", + "Foundations", + "70e90fe5-e95e-4d30-8f3f-5f85c2450203" + ], + [ + "3 End", + "Point", + "Foundations", + "44bf5bf5-deb5-418b-8e01-1f88b5b4b179" + ] + ] + } + } + ], + "id": "4ac279a5-f593-4e57-975e-a6cd3beea1ff", + "savedPayload": { + "position": { + "x": 34968.911253825885, + "y": 17314.882404558128 + }, + "targetPosition": { + "x": 34846.89026090314, + "y": 17588.94604185091 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "images": [], + "texts": [], + "id": "337b350d-42df-441e-b6fa-1f42901dd52b", + "savedPayload": { + "position": { + "x": 34846.89026090314, + "y": 17588.94604185091 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 17848.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "panels": [ + { + "type": "Plotter Panel", + "name": "MVWAP", + "config": "{\n \"codeName\": \"MVWAP\",\n \"isLegacy\": false\n}", + "project": "Foundations", + "panelData": [ + { + "type": "Panel Data", + "name": "MVWAP10", + "config": "{\n \"valueDecimals\": 0\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "New Data Formula", + "code": "record.mvwap1", + "project": "Foundations", + "id": "4cbc5c03-82be-4db7-b5bf-460291f33a4c", + "savedPayload": { + "position": { + "x": 35334.343595569226, + "y": 17108.97591509952 + }, + "targetPosition": { + "x": 35334.343595569226, + "y": 17408.97591509952 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.ULTRAMARINE_BLUE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "d6eb5d47-59f1-424c-963f-f8cfc3852a56", + "savedPayload": { + "position": { + "x": 35484.343595569226, + "y": 17149.16829396419 + }, + "targetPosition": { + "x": 35334.343595569226, + "y": 17408.97591509952 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 3, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "48e7bb41-87eb-44b4-9b6b-12d550dfdcc3", + "savedPayload": { + "position": { + "x": 35334.343595569226, + "y": 17408.97591509952 + }, + "targetPosition": { + "x": 35256.697882038476, + "y": 17698.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Panel Data", + "name": "MVWAP5", + "config": "{\n \"valueDecimals\": 0\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "New Data Formula", + "code": "record.mvwap2", + "project": "Foundations", + "id": "d268e7dd-6ca5-4c60-bffe-78a3a2061d5d", + "savedPayload": { + "position": { + "x": 35666.5055031738, + "y": 17288.94604185091 + }, + "targetPosition": { + "x": 35516.5055031738, + "y": 17548.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.SKY_BLUE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "b8931bdd-e69e-4eda-9401-c3d2efa5148e", + "savedPayload": { + "position": { + "x": 35816.5055031738, + "y": 17548.75366298624 + }, + "targetPosition": { + "x": 35516.5055031738, + "y": 17548.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "aa49c607-112f-49bf-88df-4e3fe6d653c6", + "savedPayload": { + "position": { + "x": 35516.5055031738, + "y": 17548.75366298624 + }, + "targetPosition": { + "x": 35256.697882038476, + "y": 17698.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + { + "type": "Panel Data", + "name": "MVWAP20", + "config": "{\n \"valueDecimals\": 0\n}", + "project": "Foundations", + "dataFormula": { + "type": "Data Formula", + "name": "New Data Formula", + "code": "record.mvwap3", + "project": "Foundations", + "id": "0b605c7c-5b89-4296-8271-283aebd45f43", + "savedPayload": { + "position": { + "x": 35836.25337781192, + "y": 17698.75366298624 + }, + "targetPosition": { + "x": 35546.4756299252, + "y": 17776.399376516994 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "textStyle": { + "type": "Text Style", + "name": "New Text Style", + "config": "{\n \"paletteColor\": \"UI_COLOR.TRUE_BLUE\",\n \"opacity\": 1,\n \"fontSize\": 14\n}", + "project": "Foundations", + "id": "5f40143c-249d-405a-80b4-6f10b1027ed5", + "savedPayload": { + "position": { + "x": 35758.60766428116, + "y": 17988.531410872958 + }, + "targetPosition": { + "x": 35546.4756299252, + "y": 17776.399376516994 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "5ec16890-5aee-47ae-904e-9ca9bbd485d0", + "savedPayload": { + "position": { + "x": 35546.4756299252, + "y": 17776.399376516994 + }, + "targetPosition": { + "x": 35256.697882038476, + "y": 17698.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "4b891f79-86a4-43ab-8e04-6041602d6c10", + "savedPayload": { + "position": { + "x": 35256.697882038476, + "y": 17698.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 17848.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "6acec7f3-960f-4747-a675-e5961a67d2fd", + "savedPayload": { + "position": { + "x": 34996.89026090314, + "y": 17848.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18148.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "d9335835-0c95-4a98-9c42-bad2fb3e8625", + "savedPayload": { + "position": { + "x": 34996.89026090314, + "y": 18148.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "id": "c605cc22-976a-4661-afbd-f735d6f8f8d9", + "savedPayload": { + "position": { + "x": 34996.89026090314, + "y": 18448.75366298624 + }, + "targetPosition": { + "x": 34996.89026090314, + "y": 18448.75366298624 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From e32f5244f023890e6c1d2beb83a39472df483018 Mon Sep 17 00:00:00 2001 From: Tentacule23 Date: Mon, 13 Sep 2021 09:05:08 -0400 Subject: [PATCH 54/65] reference_info_in_menu_tooltip Tentacule23 --- .../UI/Spaces/Floating-Space/CircularMenuItem.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js b/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js index 581dba410..67fe1cd7c 100644 --- a/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js +++ b/Projects/Foundations/UI/Spaces/Floating-Space/CircularMenuItem.js @@ -301,7 +301,13 @@ function newCircularMenuItem() { function onMouseOver(point) { if (thisObject.container.frame.isThisPointHere(point, true, false) === true) { - thisObject.payload.uiObject.setInfoMessage(thisObject.action) + let text = thisObject.action + + if(thisObject.payload.uiObject.payload.referenceParent !== undefined && thisObject.action === 'Reference Detach'){ + text = text + ' -> [Existing Reference] Type : [' + thisObject.payload.uiObject.payload.referenceParent.type + '] , Name : [' + thisObject.payload.uiObject.payload.referenceParent.name + ']' + } + + thisObject.payload.uiObject.setInfoMessage(text) isMouseOver = true } else { isMouseOver = false From 87765207c058fbb370aa713f98a81ae8c3cb2948 Mon Sep 17 00:00:00 2001 From: Julian Molina Date: Mon, 13 Sep 2021 18:04:52 +0200 Subject: [PATCH 55/65] Improvements in Governance tutorial pages --- ...profile-tutorial-003-tutorial-step-are-you-ready.json | 4 ++-- ...e-tutorial-010-tutorial-step-where-it-all-begins.json | 5 +++++ ...e-tutorial-012-tutorial-step-pump-that-heartbeat.json | 4 ++-- ...file-tutorial-023-tutorial-step-how-github-works.json | 9 +++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json index 2a2bcc4a9..f546b64fb 100644 --- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json +++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-003-tutorial-step-are-you-ready.json @@ -47,8 +47,8 @@ }, { "style": "Success", - "text": "No need to be an expert, but you will need some general knowledge of the system to understand what this is all about!", - "updated": 1629720316727, + "text": "No need to be an expert, but you do need to know how to operate the system! Otherwise, the process may be confusing and even frustrating!", + "updated": 1631546896227, "translations": [ { "language": "ES", diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json index 19371f55b..d151cd89f 100644 --- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json +++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-010-tutorial-step-where-it-all-begins.json @@ -44,6 +44,11 @@ "style": "Text" } ] + }, + { + "style": "Important", + "text": "We will use this node to build your User Profile. Later on, you will delete this node to erase all the sensitive information you may enter along with the information the constructor will generate. But no need to worry at this point! I'll let you know when to delete it!", + "updated": 1631547429975 } ] } \ No newline at end of file diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json index 757426111..19a75edc9 100644 --- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json +++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-012-tutorial-step-pump-that-heartbeat.json @@ -39,8 +39,8 @@ }, { "style": "Text", - "text": "If you want to link an address you already own, type the twelve word mnemonic associated with your address under the mnemonic property. If not, leave the property blank and the system will make a new one for you!", - "updated": 1629706491511, + "text": "If you want to link an existing address, type its twelve-word mnemonic in the mnemonic property. Leave the property blank to generate a new address! You will delete this sensitive info later on. The info will not leave your computer and will not be saved to disk.", + "updated": 1631547921782, "translations": [ { "language": "ES", diff --git a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json index 16673017f..3d8a658e3 100644 --- a/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json +++ b/Projects/Governance/Schemas/Docs-Tutorials/C/Creating/Creating-Your-User-Profile-Tutorial/creating-your-user-profile-tutorial-023-tutorial-step-how-github-works.json @@ -21,8 +21,8 @@ "paragraphs": [ { "style": "Note", - "text": "That is why we ask you to help in this manner! By completing those three tasks, you are effectively helping more developers find Superalgos, which is a win for everyone, as the more developers, the faster the project advances!", - "updated": 1630660356226, + "text": "That is why we ask you to help in this manner! By completing those three tasks, you are effectively helping more developers find Superalgos.", + "updated": 1631548798983, "translations": [ { "language": "ES", @@ -70,6 +70,11 @@ "style": "List" } ] + }, + { + "style": "List", + "text": "This may not be immediately reflected in the system, as Github limits the number of queries the system makes. Don't worry, you will get your tokens anyway.", + "updated": 1631548891216 } ] } \ No newline at end of file From edf824b77d70ffe18395b11a6daaeb83b60cfe24 Mon Sep 17 00:00:00 2001 From: harrellbm Date: Mon, 13 Sep 2021 12:35:24 -0500 Subject: [PATCH 56/65] Update Space setting docs and default config --- .../Schemas/App-Schema/space-settings.json | 2 +- .../Space/Space-Settings/space-settings.json | 47 +++++++++++++------ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/Projects/Foundations/Schemas/App-Schema/space-settings.json b/Projects/Foundations/Schemas/App-Schema/space-settings.json index 079349f18..b83d0f1e9 100644 --- a/Projects/Foundations/Schemas/App-Schema/space-settings.json +++ b/Projects/Foundations/Schemas/App-Schema/space-settings.json @@ -9,7 +9,7 @@ "config": true }, "initialValues": { - "config": "{\"node\":{\"distancePercentage\":60,\"radiusPercentage\":85,\"massPercentage\":100,\"animationSteps\":2,\"menuItem\":{\"widthPercentage\":100,\"heightPercentage\":60,\"radiusPercentage\":90}},\"physics\":false,\"shortcuts\":{\"toggleMapMode\":\"M\",\"toggleDrawRelationshipLines\":\"R\",\"toggleDrawParentLines\":\"C\",\"saveWorkspace\":\"S\",\"adjustAspectRatio\":\"A\"}}" + "config": "{\"node\":{\"distancePercentage\":60,\"radiusPercentage\":85,\"massPercentage\":100,\"animationSteps\":2,\"menuItem\":{\"widthPercentage\":100,\"heightPercentage\":60,\"radiusPercentage\":90}},\"physics\":false,\"shortcuts\":{\"toggleMapMode\":\"M\",\"toggleDrawRelationshipLines\":\"R\",\"toggleDrawParentLines\":\"C\",\"saveWorkspace\":\"S\",\"adjustAspectRatio\":\"A\"}, \"indexContent\": true \n }" }, "menuItems": [ { diff --git a/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json b/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json index 5aecde6da..99f9d1edd 100644 --- a/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json +++ b/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json @@ -16,7 +16,25 @@ { "style": "Subtitle", "text": "Properties", - "updated": 1609863924784 + "updated": 1631554214199 + }, + { + "style": "List", + "text": "physics determines whether the environment is static (false) or dynamic (true). When physics is set to true, nodes in the design space are affected by th gravitational pull and repulsion of other nodes.", + "updated": 1631554248476 + }, + { + "style": "List", + "text": "indexContent defines whether the contents of the docs space will be indexed for searching upon loading the workspace. If false docs space will be disabled allowing faster load times for development.", + "updated": 1631554443380 + }, + { + "style": "List", + "text": "detachUsingMouse defines if you can detach nodes from it's parent or reference parents only using the mouse (when true) or if you can not use the mouse for that and can only do it using the detach buttons on the icon's menu (when false)." + }, + { + "style": "Subtitle", + "text": "Node Properties" }, { "style": "List", @@ -24,8 +42,12 @@ }, { "style": "List", - "text": "radiusPercentage is the radius of the circular nodes' menu applied as a percentage of an arbitrary default radius.", - "updated": 1609863960583 + "text": "distancePercentage", + "updated": 1631554058045 + }, + { + "style": "List", + "text": "radiusPercentage is the radius of the circular nodes'menu applied as a percentage of an arbitrary default radius." }, { "style": "List", @@ -34,8 +56,13 @@ }, { "style": "List", - "text": "menuItem refers to the items on the right-hand side of nodes' menus.", - "updated": 1609863969621 + "text": "animationSteps", + "updated": 1631554296700 + }, + { + "style": "List", + "text": "menuItem refers to the items on the right-hand side of nodes'menus and has the following three properties.", + "updated": 1631554154211 }, { "style": "List", @@ -50,15 +77,7 @@ { "style": "List", "text": "radiusPercentage is the reference radious of the circular matrix that governs the distribution of items in the circular menu. Larger numbers cause items to spread appart while smaller numbers makes items lie closer to each other.", - "updated": 1609863985113 - }, - { - "style": "List", - "text": "physics determines wether the environment is static (false) or dynamic (true). When physics is set to true, nodes in the design space are affected by th gravitational pull and repulsion of other nodes." - }, - { - "style": "List", - "text": "detachUsingMouse defines if you can detach nodes from it's parent or reference parents only using the mouse (when true) or if you can not use the mouse for that and can only do it using the detach buttons on the icon's menu (when false)." + "updated": 1631554041849 }, { "style": "Subtitle", From 3e98e21b439c1610a4bbfc848a8df462fab23bd2 Mon Sep 17 00:00:00 2001 From: FMW-NAmorim Date: Mon, 13 Sep 2021 23:31:45 +0100 Subject: [PATCH 57/65] User Profile NAmorim --- .../Plugins/User-Profiles/NAmorim.json | 485 ++++++++++++++++++ 1 file changed, 485 insertions(+) create mode 100644 Projects/Governance/Plugins/User-Profiles/NAmorim.json diff --git a/Projects/Governance/Plugins/User-Profiles/NAmorim.json b/Projects/Governance/Plugins/User-Profiles/NAmorim.json new file mode 100644 index 000000000..3cac3e7c5 --- /dev/null +++ b/Projects/Governance/Plugins/User-Profiles/NAmorim.json @@ -0,0 +1,485 @@ +{ + "type": "User Profile", + "name": "NAmorim", + "config": "{\n \"signature\": {\n \"message\": \"NAmorim\",\n \"messageHash\": \"0xd7fc194bfd83696ca9404e75ac4958a23e7b9204e9cefefd6b6a9d29953ebbaa\",\n \"v\": \"0x1b\",\n \"r\": \"0x91266021e1be8deaf8cfe2ac7893d6ce2bddad47459e7ba71b584ac29d25e449\",\n \"s\": \"0x2e06590f5eb90ad96683508cbad5349963621ce2babc394accd880c4530c0968\",\n \"signature\": \"0x91266021e1be8deaf8cfe2ac7893d6ce2bddad47459e7ba71b584ac29d25e4492e06590f5eb90ad96683508cbad5349963621ce2babc394accd880c4530c09681b\"\n }\n}", + "project": "Governance", + "tokenPowerSwitch": { + "type": "Token Power Switch", + "name": "New Token Power Switch", + "config": "{}", + "project": "Governance", + "tokenPowerSwitch": [], + "onboardingPrograms": { + "type": "Onboarding Programs", + "name": "New Onboarding Programs", + "config": "{\"percentage\": 0}", + "project": "Governance", + "airdropProgram": { + "type": "Airdrop Program", + "name": "New Airdrop Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "46bee27c-95f4-4ab9-8c1a-d46efcc05244", + "savedPayload": { + "position": { + "x": 13662, + "y": 16698.077136594 + }, + "targetPosition": { + "x": 13812, + "y": 16957.884757729335 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "27083db5-024d-4457-857a-88394a7b5118", + "savedPayload": { + "position": { + "x": 13812, + "y": 16957.884757729335 + }, + "targetPosition": { + "x": 13962, + "y": 17217.692378864667 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "githubProgram": { + "type": "Github Program", + "name": "New Github Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "43a4f00c-eec3-464d-868b-13f480cc7e11", + "savedPayload": { + "position": { + "x": 14562, + "y": 17217.692378864667 + }, + "targetPosition": { + "x": 14262, + "y": 17217.692378864667 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3d762541-5bf7-4647-a545-f545cef7ef8b", + "savedPayload": { + "position": { + "x": 14262, + "y": 17217.692378864667 + }, + "targetPosition": { + "x": 13962, + "y": 17217.692378864667 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "f88e2ac9-88e0-4816-b765-be4c4d1b400d", + "savedPayload": { + "position": { + "x": 13962, + "y": 17217.692378864667 + }, + "targetPosition": { + "x": 13812, + "y": 17477.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "communityBuildingPrograms": { + "type": "Community Building Programs", + "name": "New Community Building Programs", + "config": "{}", + "project": "Governance", + "referralProgram": { + "type": "Referral Program", + "name": "New Referral Program", + "config": "{}", + "project": "Governance", + "userReferrers": [ + { + "type": "User Referrer", + "name": "Luis-Fernando-Molina", + "config": "{}", + "project": "Governance", + "id": "7491735f-f040-4483-8f74-8694c0759c81", + "savedPayload": { + "position": { + "x": 14262, + "y": 17437.307621135333 + }, + "targetPosition": { + "x": 14262, + "y": 17737.307621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Luis-Fernando-Molina", + "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "22664cdf-92cf-4102-8ccb-22a9f6f99801", + "savedPayload": { + "position": { + "x": 14562, + "y": 17737.307621135333 + }, + "targetPosition": { + "x": 14262, + "y": 17737.307621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "ee42c455-97f3-4624-b47a-ddd225ff8331", + "savedPayload": { + "position": { + "x": 14262, + "y": 18037.307621135333 + }, + "targetPosition": { + "x": 14262, + "y": 17737.307621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "3a8ef207-973f-4579-8acc-c98271e770ed", + "savedPayload": { + "position": { + "x": 14262, + "y": 17737.307621135333 + }, + "targetPosition": { + "x": 13962, + "y": 17737.307621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "supportProgram": { + "type": "Support Program", + "name": "New Support Program", + "config": "{}", + "project": "Governance", + "userSupporters": [ + { + "type": "User Supporter", + "name": "", + "config": "{}", + "project": "Governance", + "id": "09c6fe47-e4c1-46dd-8825-b62e0524aab9", + "savedPayload": { + "position": { + "x": 14071.807621135331, + "y": 18147.115242270665 + }, + "targetPosition": { + "x": 13812, + "y": 17997.115242270665 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "1874837c-6e22-460d-8847-6b884f7292aa", + "savedPayload": { + "position": { + "x": 13662, + "y": 18256.922863406 + }, + "targetPosition": { + "x": 13812, + "y": 17997.115242270665 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "483b5f57-da5d-4583-b1cf-410c9fb40ae3", + "savedPayload": { + "position": { + "x": 13552.192378864669, + "y": 17847.115242270665 + }, + "targetPosition": { + "x": 13812, + "y": 17997.115242270665 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "d2e657d3-e189-40a3-bd8d-b9c3bf152694", + "savedPayload": { + "position": { + "x": 13812, + "y": 17997.115242270665 + }, + "targetPosition": { + "x": 13962, + "y": 17737.307621135333 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "1f6187e8-4878-43d1-a7df-9b33a73ccb57", + "savedPayload": { + "position": { + "x": 13962, + "y": 17737.307621135333 + }, + "targetPosition": { + "x": 13812, + "y": 17477.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "2d11ec65-8e01-49af-910c-1d6151e1ebe9", + "savedPayload": { + "position": { + "x": 13812, + "y": 17477.5 + }, + "targetPosition": { + "x": 13512, + "y": 17477.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "5fb7a0f5-034b-4ce1-9052-c02cee1f6a38", + "savedPayload": { + "position": { + "x": 13212, + "y": 17477.5 + }, + "targetPosition": { + "x": 13512, + "y": 17477.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "d611eda3-4202-438a-af65-8981a90e742a", + "savedPayload": { + "position": { + "x": 13512, + "y": 17477.5 + }, + "targetPosition": { + "x": 13512, + "y": 17477.5 + }, + "floatingObject": { + "isPinned": true, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From 266257135794f0209690a3f4593191e1b1bb7a26 Mon Sep 17 00:00:00 2001 From: Brenden Harrell Date: Mon, 13 Sep 2021 21:04:35 -0500 Subject: [PATCH 58/65] Handle projects that do not have hierarchy head nodes --- Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js b/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js index e3576dc9c..23dab5ef5 100644 --- a/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js +++ b/Projects/Foundations/UI/Function-Libraries/WorkspaceFunctions.js @@ -21,6 +21,7 @@ function newFoundationsFunctionLibraryWorkspaceFunctions() { if (alreadyExist === false) { let child = UI.projects.foundations.functionLibraries.uiObjectsFromNodes.addUIObject(node, project + ' Project', rootNodes, project) + if (child === undefined) { continue } child.project = project child.projectDefinition.name = project child.projectDefinition.config = "{ \n \"codeName\": \"" + project + "\"\n}" From e59eb365bb1e356244bdc93710890a7b8f383a86 Mon Sep 17 00:00:00 2001 From: Brenden Harrell Date: Mon, 13 Sep 2021 21:04:53 -0500 Subject: [PATCH 59/65] Hierarchy Head node for Education Project --- .../Schemas/App-Schema/education-project.json | 38 +++++++++++++++++++ .../Schemas/App-Schema/other-hierarchies.json | 7 ---- 2 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 Projects/Education/Schemas/App-Schema/education-project.json diff --git a/Projects/Education/Schemas/App-Schema/education-project.json b/Projects/Education/Schemas/App-Schema/education-project.json new file mode 100644 index 000000000..5e2718003 --- /dev/null +++ b/Projects/Education/Schemas/App-Schema/education-project.json @@ -0,0 +1,38 @@ +{ + "type": "Education Project", + "menuItems": [ + { + "action": "Add UI Object", + "actionProject": "Foundations", + "label": "Add Tutorial", + "iconProject": "Education", + "relatedUiObject": "Tutorial", + "actionFunction": "payload.executeAction" + }, + { + "action": "Delete UI Object", + "actionProject": "Foundations", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "actionFunction": "payload.executeAction", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity" + } + ], + "isProjectHead": true, + "isTitleAllwaysVisible": false, + "addLeftIcons": true, + "isPinned": true, + "positionLocked": true, + "childrenNodesProperties": [ + { + "name": "projectDefinition", + "type": "node", + "childType": "Project Definition", + "project": "Foundations", + "autoAdd": true + } + ], + "icon": "education" +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json b/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json index 3a505ceef..f08aa1ce2 100644 --- a/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json +++ b/Projects/Foundations/Schemas/App-Schema/other-hierarchies.json @@ -7,13 +7,6 @@ "relatedUiObject": "Network", "actionFunction": "payload.executeAction" }, - { - "action": "Add UI Object", - "label": "Add Tutorial", - "iconProject": "Education", - "relatedUiObject": "Tutorial", - "actionFunction": "payload.executeAction" - }, { "action": "Add UI Object", "label": "Add Plugins", From ec582c45bcad0106767161dfb61d71f9859332eb Mon Sep 17 00:00:00 2001 From: Brenden Harrell Date: Mon, 13 Sep 2021 22:10:57 -0500 Subject: [PATCH 60/65] Finish Education Project Head node --- .../Education/Schemas/App-Schema/education-project.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Projects/Education/Schemas/App-Schema/education-project.json b/Projects/Education/Schemas/App-Schema/education-project.json index 5e2718003..83546485c 100644 --- a/Projects/Education/Schemas/App-Schema/education-project.json +++ b/Projects/Education/Schemas/App-Schema/education-project.json @@ -9,6 +9,13 @@ "relatedUiObject": "Tutorial", "actionFunction": "payload.executeAction" }, + { + "action": "Add UI Object", + "actionProject": "Foundations", + "label": "Add Docs Space", + "relatedUiObject": "Docs Space", + "actionFunction": "payload.executeAction" + }, { "action": "Delete UI Object", "actionProject": "Foundations", From a93925e52095540cccfe5b23ba2aed9173d83e74 Mon Sep 17 00:00:00 2001 From: Brenden Harrell Date: Mon, 13 Sep 2021 22:11:21 -0500 Subject: [PATCH 61/65] Refactor docs space and fix space settings node overlap --- .../Education/Icons/docs-space-settings.png | Bin 0 -> 20366 bytes Projects/Education/Icons/docs-space-style.png | Bin 0 -> 1938 bytes .../Docs => Education/Icons}/docs-space.png | Bin .../App-Schema/docs-space-settings.json | 33 ++++++++++++++++++ .../Schemas/App-Schema/docs-space-style.json | 33 ++++++++++++++++++ .../Schemas/App-Schema/docs-space.json | 8 ++--- .../docs-space-settings.json | 18 ++++++++++ .../Docs-Space-Style/docs-space-style.json | 13 +++++++ .../UI/Spaces/Docs-Space/SearchEngine.js | 4 +-- .../Schemas/App-Schema/space-settings.json | 2 +- .../Schemas/App-Schema/spaces.json | 6 ---- .../Space/Space-Settings/space-settings.json | 31 ++++++++-------- 12 files changed, 118 insertions(+), 30 deletions(-) create mode 100644 Projects/Education/Icons/docs-space-settings.png create mode 100644 Projects/Education/Icons/docs-space-style.png rename Projects/{Foundations/Icons/Docs => Education/Icons}/docs-space.png (100%) create mode 100644 Projects/Education/Schemas/App-Schema/docs-space-settings.json create mode 100644 Projects/Education/Schemas/App-Schema/docs-space-style.json rename Projects/{Foundations => Education}/Schemas/App-Schema/docs-space.json (87%) create mode 100644 Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Settings/docs-space-settings.json create mode 100644 Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Style/docs-space-style.json diff --git a/Projects/Education/Icons/docs-space-settings.png b/Projects/Education/Icons/docs-space-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..7894c559625adffa73366820249b6da477f9c055 GIT binary patch literal 20366 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 QW}xW|p00i_>zopr0QFau2><{9 literal 0 HcmV?d00001 diff --git a/Projects/Foundations/Icons/Docs/docs-space.png b/Projects/Education/Icons/docs-space.png similarity index 100% rename from Projects/Foundations/Icons/Docs/docs-space.png rename to Projects/Education/Icons/docs-space.png diff --git a/Projects/Education/Schemas/App-Schema/docs-space-settings.json b/Projects/Education/Schemas/App-Schema/docs-space-settings.json new file mode 100644 index 000000000..99c4ed7f4 --- /dev/null +++ b/Projects/Education/Schemas/App-Schema/docs-space-settings.json @@ -0,0 +1,33 @@ +{ + "type": "Docs Space Settings", + "level": 4, + "propertyNameAtParent": "docsSpaceSettings", + "attachingRules": { + "compatibleTypes": "Docs Space->" + }, + "editors": { + "config": true + }, + "initialValues": { + "config": "{\"indexContent\": true \n }" + }, + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "actionFunction": "payload.executeAction", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity" + } + ], + "addLeftIcons": true +} \ No newline at end of file diff --git a/Projects/Education/Schemas/App-Schema/docs-space-style.json b/Projects/Education/Schemas/App-Schema/docs-space-style.json new file mode 100644 index 000000000..d3b71598c --- /dev/null +++ b/Projects/Education/Schemas/App-Schema/docs-space-style.json @@ -0,0 +1,33 @@ +{ + "type": "Docs Space Style", + "level": 4, + "propertyNameAtParent": "docsSpaceStyle", + "attachingRules": { + "compatibleTypes": "Docs Space->" + }, + "editors": { + "config": true + }, + "initialValues": { + "config": "{\"backgroundColor\":\"UI_COLOR.BLACK\",\"node\":{\"fontSize\":16,\"imageSize\":60,\"type\":{\"fontColor\":\"UI_COLOR.WHITE\"},\"name\":{\"fontColor\":\"UI_COLOR.WHITE\"},\"menuItem\":{\"backgroundColor\":\"UI_COLOR.BLACK\",\"fontColor\":\"UI_COLOR.WHITE\",\"fontSize\":14,\"imageSize\":14}}}" + }, + "menuItems": [ + { + "action": "Configure", + "actionFunction": "uiObject.configEditor.activate", + "label": "Configure", + "iconPathOn": "configuration", + "iconPathOff": "configuration" + }, + { + "action": "Delete UI Object", + "askConfirmation": true, + "confirmationLabel": "Confirm to Delete", + "actionFunction": "payload.executeAction", + "label": "Delete", + "iconPathOn": "delete-entity", + "iconPathOff": "delete-entity" + } + ], + "addLeftIcons": true +} \ No newline at end of file diff --git a/Projects/Foundations/Schemas/App-Schema/docs-space.json b/Projects/Education/Schemas/App-Schema/docs-space.json similarity index 87% rename from Projects/Foundations/Schemas/App-Schema/docs-space.json rename to Projects/Education/Schemas/App-Schema/docs-space.json index aa6306186..44d674bb2 100644 --- a/Projects/Foundations/Schemas/App-Schema/docs-space.json +++ b/Projects/Education/Schemas/App-Schema/docs-space.json @@ -32,15 +32,15 @@ "level": 0, "childrenNodesProperties": [ { - "name": "spaceStyle", + "name": "docsSpaceStyle", "type": "node", - "childType": "Space Style", + "childType": "Docs Space Style", "autoAdd": true }, { - "name": "spaceSettings", + "name": "docsSpaceSettings", "type": "node", - "childType": "Space Settings", + "childType": "Docs Space Settings", "autoAdd": true } ] diff --git a/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Settings/docs-space-settings.json b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Settings/docs-space-settings.json new file mode 100644 index 000000000..6f6f5c4a6 --- /dev/null +++ b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Settings/docs-space-settings.json @@ -0,0 +1,18 @@ +{ + "type": "Docs Space Settings", + "definition": { + "text": "This node allows the user to determine how the docs space will be loaded by the current workspace.", + "updated": 1631587592724 + }, + "paragraphs": [ + { + "style": "Subtitle", + "text": "Properties", + "updated": 1631587516173 + }, + { + "style": "List", + "text": "indexContent defines whether the contents of the docs space will be indexed for searching upon loading the workspace. If false docs space will be disabled allowing faster load times for development." + } + ] +} \ No newline at end of file diff --git a/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Style/docs-space-style.json b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Style/docs-space-style.json new file mode 100644 index 000000000..470ca9b6f --- /dev/null +++ b/Projects/Education/Schemas/Docs-Nodes/D/Docs/Docs-Space-Style/docs-space-style.json @@ -0,0 +1,13 @@ +{ + "type": "Docs Space Style", + "definition": { + "text": "This node is currently a place holder that will eventually allow users to adjust the visual apperance of the docs space.", + "updated": 1631589004055 + }, + "paragraphs": [ + { + "style": "Text", + "text": "Right click and select the pencil button to enter edit mode." + } + ] +} \ No newline at end of file diff --git a/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js b/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js index 88c80fa97..584e5fa31 100644 --- a/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js +++ b/Projects/Education/UI/Spaces/Docs-Space/SearchEngine.js @@ -23,8 +23,8 @@ function newFoundationsDocsSearchEngine() { */ let docsSpaceNode = UI.projects.foundations.spaces.designSpace.workspace.getHierarchyHeadByNodeType('Docs Space') if (docsSpaceNode !== undefined) { - if (docsSpaceNode.spaceSettings !== undefined) { - let indexContent = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(docsSpaceNode.spaceSettings.payload, 'indexContent') + if (docsSpaceNode.docsSpaceSettings !== undefined) { + let indexContent = UI.projects.foundations.utilities.nodeConfig.loadConfigProperty(docsSpaceNode.docsSpaceSettings.payload, 'indexContent') if (indexContent === false) { callbackFunction() return diff --git a/Projects/Foundations/Schemas/App-Schema/space-settings.json b/Projects/Foundations/Schemas/App-Schema/space-settings.json index b83d0f1e9..d4d21f643 100644 --- a/Projects/Foundations/Schemas/App-Schema/space-settings.json +++ b/Projects/Foundations/Schemas/App-Schema/space-settings.json @@ -9,7 +9,7 @@ "config": true }, "initialValues": { - "config": "{\"node\":{\"distancePercentage\":60,\"radiusPercentage\":85,\"massPercentage\":100,\"animationSteps\":2,\"menuItem\":{\"widthPercentage\":100,\"heightPercentage\":60,\"radiusPercentage\":90}},\"physics\":false,\"shortcuts\":{\"toggleMapMode\":\"M\",\"toggleDrawRelationshipLines\":\"R\",\"toggleDrawParentLines\":\"C\",\"saveWorkspace\":\"S\",\"adjustAspectRatio\":\"A\"}, \"indexContent\": true \n }" + "config": "{\"node\":{\"distancePercentage\":60,\"radiusPercentage\":85,\"massPercentage\":100,\"animationSteps\":2,\"menuItem\":{\"widthPercentage\":100,\"heightPercentage\":60,\"radiusPercentage\":90}},\"physics\":false,\"shortcuts\":{\"toggleMapMode\":\"M\",\"toggleDrawRelationshipLines\":\"R\",\"toggleDrawParentLines\":\"C\",\"saveWorkspace\":\"S\",\"adjustAspectRatio\":\"A\"} \n }" }, "menuItems": [ { diff --git a/Projects/Foundations/Schemas/App-Schema/spaces.json b/Projects/Foundations/Schemas/App-Schema/spaces.json index 3da28cce9..c3bc5754d 100644 --- a/Projects/Foundations/Schemas/App-Schema/spaces.json +++ b/Projects/Foundations/Schemas/App-Schema/spaces.json @@ -13,12 +13,6 @@ "relatedUiObject": "Design Space", "actionFunction": "payload.executeAction" }, - { - "action": "Add UI Object", - "label": "Add Docs Space", - "relatedUiObject": "Docs Space", - "actionFunction": "payload.executeAction" - }, { "action": "Delete UI Object", "askConfirmation": true, diff --git a/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json b/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json index 99f9d1edd..c39e88e0e 100644 --- a/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json +++ b/Projects/Foundations/Schemas/Docs-Nodes/S/Space/Space-Settings/space-settings.json @@ -20,13 +20,8 @@ }, { "style": "List", - "text": "physics determines whether the environment is static (false) or dynamic (true). When physics is set to true, nodes in the design space are affected by th gravitational pull and repulsion of other nodes.", - "updated": 1631554248476 - }, - { - "style": "List", - "text": "indexContent defines whether the contents of the docs space will be indexed for searching upon loading the workspace. If false docs space will be disabled allowing faster load times for development.", - "updated": 1631554443380 + "text": "\"physics\" determines whether the environment is static (false) or dynamic (true). When physics is set to true, nodes in the design space are affected by th gravitational pull and repulsion of other nodes.", + "updated": 1631588883144 }, { "style": "List", @@ -38,31 +33,33 @@ }, { "style": "List", - "text": "node refers to every node in the design space." + "text": "\"node\" here refers to every node in the design space. This collection of properties adjusts the settings of all nodes in the design space.", + "updated": 1631588871268 }, { "style": "List", - "text": "distancePercentage", - "updated": 1631554058045 + "text": "distancePercentage adjusts the baseline distance between nodes.", + "updated": 1631588124341 }, { "style": "List", - "text": "radiusPercentage is the radius of the circular nodes'menu applied as a percentage of an arbitrary default radius." + "text": "radiusPercentage is the radius of the circular nodes' menu applied as a percentage of an arbitrary default radius. A higher value will lead to a larger node menu.", + "updated": 1631588202567 }, { "style": "List", - "text": "massPercentage is the refernce mass of nodes that affect the attraction and repulsion of the environment's pysics whe the physics setting is set to true.", - "updated": 1609863964761 + "text": "massPercentage is the reference mass of nodes that affects the attraction and repulsion of the environment's physics when the physics setting is set to true.", + "updated": 1631588798797 }, { "style": "List", - "text": "animationSteps", - "updated": 1631554296700 + "text": "animationSteps adjusts the amount of steps the animation takes to open a node menu upon hovering over it. A higher value leads to smoother transtion.", + "updated": 1631588728860 }, { "style": "List", - "text": "menuItem refers to the items on the right-hand side of nodes'menus and has the following three properties.", - "updated": 1631554154211 + "text": "menuItem refers to the items on the right-hand side of a node's menus and has the following three properties.", + "updated": 1631588761551 }, { "style": "List", From ecb9f0013fe66fb8eb7ac2d00f564bb6d722de71 Mon Sep 17 00:00:00 2001 From: Alexandru Bacanu Date: Tue, 14 Sep 2021 13:40:43 +0300 Subject: [PATCH 62/65] User Profile alexbacanu --- .../Plugins/User-Profiles/alexbacanu.json | 625 ++++++++++++++++++ 1 file changed, 625 insertions(+) create mode 100644 Projects/Governance/Plugins/User-Profiles/alexbacanu.json diff --git a/Projects/Governance/Plugins/User-Profiles/alexbacanu.json b/Projects/Governance/Plugins/User-Profiles/alexbacanu.json new file mode 100644 index 000000000..3af051aa0 --- /dev/null +++ b/Projects/Governance/Plugins/User-Profiles/alexbacanu.json @@ -0,0 +1,625 @@ +{ + "type": "User Profile", + "name": "alexbacanu", + "config": "{\n \"signature\": {\n \"message\": \"alexbacanu\",\n \"messageHash\": \"0x82893d94bbeef59c79191b46b55e3b02ebf06138e914152b13de5633f26699d0\",\n \"v\": \"0x1b\",\n \"r\": \"0x9f2bec070af89bfde331a6f06c623c876133da647eb5657ccd83ee7af0e714dd\",\n \"s\": \"0x5c6af340c2febc2dbe3fac50e3a8e1dee226e2994613ea52a6b33089b59c7c30\",\n \"signature\": \"0x9f2bec070af89bfde331a6f06c623c876133da647eb5657ccd83ee7af0e714dd5c6af340c2febc2dbe3fac50e3a8e1dee226e2994613ea52a6b33089b59c7c301b\"\n },\n \"codeName\": \"alexbacanu\"\n}", + "project": "Governance", + "tokenPowerSwitch": { + "type": "Token Power Switch", + "name": "New Token Power Switch", + "config": "{}", + "project": "Governance", + "tokenPowerSwitch": [], + "onboardingPrograms": { + "type": "Onboarding Programs", + "name": "New Onboarding Programs", + "config": "{\n \"percentage\": 0\n}", + "project": "Governance", + "airdropProgram": { + "type": "Airdrop Program", + "name": "New Airdrop Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "febe4283-b7d6-4bbf-a2e2-5733b1715abe", + "savedPayload": { + "position": { + "x": 11831.807621135331, + "y": 10098.884757729338 + }, + "targetPosition": { + "x": 11681.807621135331, + "y": 10358.692378864669 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "370792a3-ab0d-4dc0-83bc-a48633923f99", + "savedPayload": { + "position": { + "x": 11681.807621135331, + "y": 10358.692378864669 + }, + "targetPosition": { + "x": 11531.807621135331, + "y": 10618.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "githubProgram": { + "type": "Github Program", + "name": "New Github Program", + "config": "{}", + "project": "Governance", + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "40385ee3-3d90-414d-b54e-22024ae8166f", + "savedPayload": { + "position": { + "x": 12131.807621135331, + "y": 10618.5 + }, + "targetPosition": { + "x": 11831.807621135331, + "y": 10618.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "24e27fdf-111e-4f37-ace8-d980638dcd7a", + "savedPayload": { + "position": { + "x": 11831.807621135331, + "y": 10618.5 + }, + "targetPosition": { + "x": 11531.807621135331, + "y": 10618.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "1ecb2c89-e7e8-485c-9f98-98428c78a02a", + "savedPayload": { + "position": { + "x": 11531.807621135331, + "y": 10618.5 + }, + "targetPosition": { + "x": 11272, + "y": 10768.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "communityBuildingPrograms": { + "type": "Community Building Programs", + "name": "New Community Building Programs", + "config": "{}", + "project": "Governance", + "referralProgram": { + "type": "Referral Program", + "name": "New Referral Program", + "config": "{}", + "project": "Governance", + "userReferrers": [ + { + "type": "User Referrer", + "name": "Luis-Fernando-Molina", + "config": "{}", + "project": "Governance", + "id": "5ff1e995-2b2e-40fd-8de0-e9b4fcdeb69f", + "savedPayload": { + "position": { + "x": 11971.585369022052, + "y": 10581.046665333914 + }, + "targetPosition": { + "x": 11821.585369022052, + "y": 10840.854286469244 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "Luis-Fernando-Molina", + "id": "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + }, + "referenceParentCombinedNodePath": [ + [ + "Luis-Fernando-Molina", + "User Profile", + "Governance", + "a8de78f0-c3e4-4a2a-b7e8-f659073969db" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "8b8e990a-3458-4400-95da-d6232e24bf4a", + "savedPayload": { + "position": { + "x": 12111.363116908773, + "y": 10763.208572938489 + }, + "targetPosition": { + "x": 11821.585369022052, + "y": 10840.854286469244 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "ebc8ef82-ddec-41ab-9eed-2017f6e7b183", + "savedPayload": { + "position": { + "x": 12081.392990157383, + "y": 10990.854286469244 + }, + "targetPosition": { + "x": 11821.585369022052, + "y": 10840.854286469244 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "8f9aaa46-d804-4c10-a54b-92c2061dc858", + "savedPayload": { + "position": { + "x": 11821.585369022052, + "y": 10840.854286469244 + }, + "targetPosition": { + "x": 11531.807621135331, + "y": 10918.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "supportProgram": { + "type": "Support Program", + "name": "New Support Program", + "config": "{}", + "project": "Governance", + "userSupporters": [ + { + "type": "User Supporter", + "name": "harrellbm", + "config": "{}", + "project": "Governance", + "id": "0e12f022-9c73-4dfc-ae01-679792d745c6", + "savedPayload": { + "position": { + "x": 12356.18567466841, + "y": 11027.031429703866 + }, + "targetPosition": { + "x": 11921.519052838328, + "y": 11143.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "harrellbm", + "id": "3af73d3b-7c0e-4de7-a1e1-a72238081740" + }, + "referenceParentCombinedNodePath": [ + [ + "harrellbm", + "User Profile", + "Governance", + "3af73d3b-7c0e-4de7-a1e1-a72238081740" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "9a79cf1a-b9da-4f50-8ef0-39c151233c09", + "savedPayload": { + "position": { + "x": 12311.230484541325, + "y": 11368.5 + }, + "targetPosition": { + "x": 11921.519052838328, + "y": 11143.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "bbd18748-77f8-481b-a3d2-4bed02907cd2", + "savedPayload": { + "position": { + "x": 12037.987623134462, + "y": 11578.166621830082 + }, + "targetPosition": { + "x": 11921.519052838328, + "y": 11143.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "bc56de66-7e54-4b59-beb0-69cb612b4b71", + "savedPayload": { + "position": { + "x": 11921.519052838328, + "y": 11143.5 + }, + "targetPosition": { + "x": 11531.807621135331, + "y": 10918.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 4, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "mentorshipProgram": { + "type": "Mentorship Program", + "name": "New Mentorship Program", + "config": "{}", + "project": "Governance", + "userMentors": [ + { + "type": "User Mentor", + "name": "PLuv", + "config": "{}", + "project": "Governance", + "id": "4d568744-258e-45a1-949c-0ea69e6683ef", + "savedPayload": { + "position": { + "x": 11869.260955801417, + "y": 11358.277747886721 + }, + "targetPosition": { + "x": 11609.453334666086, + "y": 11208.277747886721 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + }, + "referenceParent": { + "type": "User Profile", + "name": "PLuv", + "id": "142f5de2-3762-4f55-a839-22eac5c03c8f" + }, + "referenceParentCombinedNodePath": [ + [ + "PLuv", + "User Profile", + "Governance", + "142f5de2-3762-4f55-a839-22eac5c03c8f" + ] + ] + } + } + ], + "tokensAwarded": { + "type": "Tokens Awarded", + "name": "New Tokens Awarded", + "project": "Governance", + "id": "9b6fd291-940b-48aa-9c9c-fc48487c72c9", + "savedPayload": { + "position": { + "x": 11687.099048196842, + "y": 11498.055495773442 + }, + "targetPosition": { + "x": 11609.453334666086, + "y": 11208.277747886721 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensBonus": { + "type": "Tokens Bonus", + "name": "New Tokens Bonus", + "project": "Governance", + "id": "550e7a42-80f5-44c1-b866-40187888aec4", + "savedPayload": { + "position": { + "x": 11459.453334666086, + "y": 11468.085369022052 + }, + "targetPosition": { + "x": 11609.453334666086, + "y": 11208.277747886721 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "f158e082-bb8e-4d01-abf7-a8b504551b0a", + "savedPayload": { + "position": { + "x": 11609.453334666086, + "y": 11208.277747886721 + }, + "targetPosition": { + "x": 11531.807621135331, + "y": 10918.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "4f885985-7142-4cb8-a863-ef8e9ee7acec", + "savedPayload": { + "position": { + "x": 11531.807621135331, + "y": 10918.5 + }, + "targetPosition": { + "x": 11272, + "y": 10768.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 2, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "bfd6fc8e-8c79-4f63-90ab-b565348444ca", + "savedPayload": { + "position": { + "x": 11272, + "y": 10768.5 + }, + "targetPosition": { + "x": 10972, + "y": 10768.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "tokensMined": { + "type": "Tokens Mined", + "name": "New Tokens Mined", + "project": "Governance", + "id": "2d4b83f8-b6d4-4555-9b1c-48a86442c077", + "savedPayload": { + "position": { + "x": 10672, + "y": 10768.5 + }, + "targetPosition": { + "x": 10972, + "y": 10768.5 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": false, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } + }, + "id": "ec022964-1f09-49e1-a147-3ba00abab9db", + "savedPayload": { + "position": { + "x": 22727.272727272724, + "y": 24250 + }, + "targetPosition": { + "x": 22727.272727272724, + "y": 24250 + }, + "floatingObject": { + "isPinned": false, + "isFrozen": false, + "isCollapsed": true, + "angleToParent": 1, + "distanceToParent": 3, + "arrangementStyle": 0 + }, + "uiObject": { + "isRunning": false + } + } +} \ No newline at end of file From e30addb819fdd9b81f01daf154e9b4682441a9f5 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Tue, 14 Sep 2021 15:51:48 +0200 Subject: [PATCH 63/65] Social Trading: event for getting the timeline --- Desktop/UI/WebApp.js | 227 ++++++++++-------- .../Test-Network-Client-Profile.json | 8 +- .../Test-Network-Node-Profile.json | 8 +- Projects/Social-Trading/NT/Globals/Memory.js | 3 +- .../NT/Modules/ClientInterface.js | 6 + .../NT/Modules/Queries/Events.js | 6 +- Projects/Social-Trading/NT/Modules/Query.js | 2 +- .../NT/Utilities/QueriesValidations.js | 6 +- 8 files changed, 150 insertions(+), 116 deletions(-) diff --git a/Desktop/UI/WebApp.js b/Desktop/UI/WebApp.js index 037b5d7f8..bce4eb31d 100644 --- a/Desktop/UI/WebApp.js +++ b/Desktop/UI/WebApp.js @@ -16,7 +16,8 @@ function newWebApp() { setupRootObject(UI, 'UI') setupRootObject(SA, 'SA') await UI.projects.socialTrading.modules.webSocketsClient.initialize() - setupHomePage() + loadWUserProfileTimeline() + loadWhoToFollow() setupEventHandlers() } catch (err) { console.log('[ERROR] initialize -> err.stack = ' + err.stack) @@ -94,21 +95,16 @@ function newWebApp() { } } - async function setupHomePage() { - let queryMessage - let query - /* - Test Query User Profiles. - */ - queryMessage = { - queryType: SA.projects.socialTrading.globals.queryTypes.UNFOLLOWED_USER_PROFILES, + async function loadWUserProfileTimeline() { + let queryMessage = { + queryType: SA.projects.socialTrading.globals.queryTypes.EVENTS, emitterUserProfileId: undefined, - initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_FIRST, - amountRequested: 3, - direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP + initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_LAST, + amountRequested: 100, + direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST } - query = { + let query = { requestType: 'Query', queryMessage: JSON.stringify(queryMessage) } @@ -116,23 +112,121 @@ function newWebApp() { await UI.projects.socialTrading.modules.webSocketsClient.sendMessage( JSON.stringify(query) ) - .then(showProfiles) + .then(addToContentDiv) .catch(onError) - async function showProfiles(profiles) { - console.log(profiles) - document.getElementById('context-cell') - - addWhoToFollowTable(profiles) - } - - /* - Error Handling - */ function onError(errorMessage) { console.log('[ERROR] Query not executed. ' + errorMessage) console.log('[ERROR] query = ' + JSON.stringify(query)) } + + function addToContentDiv(events) { + + let contentDiv = document.getElementById('content-div') + + for (let i = 0; i < events.length; i++) { + let event = events[i] + + let postDiv = document.createElement("div") + postDiv.setAttribute("class", "post-div") + let textNode = document.createTextNode('POST #' + i) + postDiv.appendChild(textNode) + contentDiv.appendChild(postDiv) + } + } + } + + async function loadWhoToFollow() { + let queryMessage = { + queryType: SA.projects.socialTrading.globals.queryTypes.UNFOLLOWED_USER_PROFILES, + emitterUserProfileId: undefined, + initialIndex: SA.projects.socialTrading.globals.queryConstants.INITIAL_INDEX_FIRST, + amountRequested: 3, + direction: SA.projects.socialTrading.globals.queryConstants.DIRECTION_UP + } + + let query = { + requestType: 'Query', + queryMessage: JSON.stringify(queryMessage) + } + + await UI.projects.socialTrading.modules.webSocketsClient.sendMessage( + JSON.stringify(query) + ) + .then(addWhoToFollowTable) + .catch(onError) + + function onError(errorMessage) { + console.log('[ERROR] Query not executed. ' + errorMessage) + console.log('[ERROR] query = ' + JSON.stringify(query)) + } + + function addWhoToFollowTable(profiles) { + + let contextCell = document.getElementById('who-to-follow-cell') + let table = document.createElement("table") + let tblBody = document.createElement("tbody") + + for (let i = 0; i < profiles.length; i++) { + let profile = profiles[i] + let row = document.createElement("tr") + + let cell = document.createElement("td") + addProfileToFollowTable(cell, profile) + row.appendChild(cell) + + tblBody.appendChild(row) + } + + table.appendChild(tblBody) + contextCell.appendChild(table) + table.setAttribute("class", "who-to-follow-table") + + function addProfileToFollowTable(htmlElement, profile) { + let table = document.createElement("table") + let tblBody = document.createElement("tbody") + + let row = document.createElement("tr") + + { + let cell = document.createElement("td") + let textNode = document.createTextNode('Profile Picture') + cell.appendChild(textNode) + row.appendChild(cell) + } + { + let cell = document.createElement("td") + let textNode = document.createTextNode(profile.userProfileHandle) + cell.appendChild(textNode) + row.appendChild(cell) + } + { + let cell = document.createElement("td") + let span = document.createElement("span") + let button = document.createElement("button") + let text = document.createTextNode('Follow') + + span.setAttribute("id", "profile-to-follow-span-" + profile.userProfileId) + button.setAttribute("id", "profile-to-follow-button-" + profile.userProfileId) + button.name = 'Follow Profile' + button.userProfileId = profile.userProfileId + + span.setAttribute("class", "profile-to-follow-span") + button.setAttribute("class", "profile-to-follow-button") + + button.appendChild(text) + span.appendChild(button) + cell.appendChild(span) + row.appendChild(cell) + } + + tblBody.appendChild(row) + + table.appendChild(tblBody) + htmlElement.appendChild(table) + table.setAttribute("class", "profile-to-follow-table") + } + } } function setupEventHandlers() { @@ -150,7 +244,7 @@ function newWebApp() { let textArea = document.getElementById("new-post-text-area") await sendNewPostEvent( textArea.value - ) + ) .then(updateTextArea) .catch(onError) @@ -163,7 +257,7 @@ function newWebApp() { await sendTargetUserProfileEvent( event.target.userProfileId, SA.projects.socialTrading.globals.eventTypes.FOLLOW_USER_PROFILE - ) + ) .then(updateButton) .catch(onError) @@ -180,7 +274,7 @@ function newWebApp() { await sendTargetUserProfileEvent( event.target.userProfileId, SA.projects.socialTrading.globals.eventTypes.UNFOLLOW_USER_PROFILE - ) + ) .then(updateButton) .catch(onError) @@ -210,84 +304,17 @@ function newWebApp() { } } - function addWhoToFollowTable(profiles) { - - let contextCell = document.getElementById('who-to-follow-cell') - let table = document.createElement("table") - let tblBody = document.createElement("tbody") - - for (let i = 0; i < profiles.length; i++) { - let profile = profiles[i] - let row = document.createElement("tr") - - let cell = document.createElement("td") - addProfileToFollowTable(cell, profile) - row.appendChild(cell) - - tblBody.appendChild(row) - } - - table.appendChild(tblBody) - contextCell.appendChild(table) - table.setAttribute("class", "who-to-follow-table") - } - - function addProfileToFollowTable(htmlElement, profile) { - let table = document.createElement("table") - let tblBody = document.createElement("tbody") - - let row = document.createElement("tr") - - { - let cell = document.createElement("td") - let cellText = document.createTextNode('Profile Picture') - cell.appendChild(cellText) - row.appendChild(cell) - } - { - let cell = document.createElement("td") - let cellText = document.createTextNode(profile.userProfileHandle) - cell.appendChild(cellText) - row.appendChild(cell) - } - { - let cell = document.createElement("td") - let span = document.createElement("span") - let button = document.createElement("button") - let text = document.createTextNode('Follow') - - span.setAttribute("id", "profile-to-follow-span-" + profile.userProfileId) - button.setAttribute("id", "profile-to-follow-button-" + profile.userProfileId) - button.name = 'Follow Profile' - button.userProfileId = profile.userProfileId - - span.setAttribute("class", "profile-to-follow-span") - button.setAttribute("class", "profile-to-follow-button") - - button.appendChild(text) - span.appendChild(button) - cell.appendChild(span) - row.appendChild(cell) - } - - tblBody.appendChild(row) - - table.appendChild(tblBody) - htmlElement.appendChild(table) - table.setAttribute("class", "profile-to-follow-table") - } - async function sendTargetUserProfileEvent( userProfileId, - eventType - ) { + eventType + ) { return new Promise((resolve, reject) => { asyncCall(resolve, reject) }) async function asyncCall(resolve, reject) { let eventMessage let event - + eventMessage = { eventType: eventType, eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), @@ -315,15 +342,15 @@ function newWebApp() { } async function sendNewPostEvent( - postText - ) { + postText + ) { return new Promise((resolve, reject) => { asyncCall(resolve, reject) }) async function asyncCall(resolve, reject) { let eventMessage let event - + eventMessage = { eventType: SA.projects.socialTrading.globals.eventTypes.NEW_USER_POST, eventId: SA.projects.foundations.utilities.miscellaneousFunctions.genereteUniqueId(), diff --git a/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json b/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json index 3279c2cd7..ca0070a33 100644 --- a/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json +++ b/Projects/Governance/Plugins/User-Profiles/Test-Network-Client-Profile.json @@ -62,12 +62,12 @@ "id": "baa2f02c-2920-4edb-a103-d452fc61d82f", "savedPayload": { "position": { - "x": 20588.235294117643, - "y": 18250 + "x": 30769.230769230762, + "y": 21250 }, "targetPosition": { - "x": 20588.235294117643, - "y": 18250 + "x": 30769.230769230762, + "y": 21250 }, "floatingObject": { "isPinned": false, diff --git a/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json b/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json index 10d3ae958..2ef8dfc42 100644 --- a/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json +++ b/Projects/Governance/Plugins/User-Profiles/Test-Network-Node-Profile.json @@ -62,12 +62,12 @@ "id": "36c2b050-631f-4291-987c-418adc94317d", "savedPayload": { "position": { - "x": 17647.05882352941, - "y": 21251 + "x": 28846.15384615384, + "y": 18250 }, "targetPosition": { - "x": 17647.05882352941, - "y": 21251 + "x": 28846.15384615384, + "y": 18250 }, "floatingObject": { "isPinned": false, diff --git a/Projects/Social-Trading/NT/Globals/Memory.js b/Projects/Social-Trading/NT/Globals/Memory.js index 6a42e762a..b0b2b9458 100644 --- a/Projects/Social-Trading/NT/Globals/Memory.js +++ b/Projects/Social-Trading/NT/Globals/Memory.js @@ -7,11 +7,12 @@ exports.newSocialTradingGlobalsMemory = function () { USER_PROFILES_BY_ID: new Map(), // Here we will store the user profiles by User Profile Id. USER_PROFILES_BY_HANDLE: new Map(), // Here we will store the user profiles by User Profile Handle. USER_PROFILES_BY_BLOCHAIN_ACCOUNT: new Map(), // Here we will store the user profiles by Blockchain Account. - EVENTS: new Map(), // This is the registry of all events received that prevents processing them more than once. + EVENTS: new Map() // This is the registry of all events received that prevents processing them more than once. }, arrays: { NETWORK_CLIENTS: [], // These are the Network Clients connected to this Network Node ordered by Ranking. NETWORK_PEERS: [], // These are the Network Peers connected to this Network Node ordered by Ranking. + EVENTS: [] // This is the registry of all events in order that prevents ordering them more than once. } } diff --git a/Projects/Social-Trading/NT/Modules/ClientInterface.js b/Projects/Social-Trading/NT/Modules/ClientInterface.js index 742b7541f..f37d898a0 100644 --- a/Projects/Social-Trading/NT/Modules/ClientInterface.js +++ b/Projects/Social-Trading/NT/Modules/ClientInterface.js @@ -142,6 +142,9 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule Any exception that happens while trying to change the state of the Social Graph, will be returned to the caller without doing anything else here. */ + if (err.stack !== undefined) { + console.log('[ERROR] Client Interface -> err.stack = ' + err.stack) + } let errorMessage = err.message if (errorMessage === undefined) { errorMessage = err } let response = { @@ -215,6 +218,9 @@ exports.newSocialTradingModulesClientInterface = function newSocialTradingModule /* Any exception that happens while trying to execute the query. */ + if (err.stack !== undefined) { + console.log('[ERROR] Client Interface -> err.stack = ' + err.stack) + } let errorMessage = err.message if (errorMessage === undefined) { errorMessage = err } let response = { diff --git a/Projects/Social-Trading/NT/Modules/Queries/Events.js b/Projects/Social-Trading/NT/Modules/Queries/Events.js index 1732fe794..b8085c5b9 100644 --- a/Projects/Social-Trading/NT/Modules/Queries/Events.js +++ b/Projects/Social-Trading/NT/Modules/Queries/Events.js @@ -22,7 +22,7 @@ exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQ function initialize(queryReceived) { NT.projects.socialTrading.utilities.queriesValidations.profilesValidations(queryReceived, thisObject) - NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, NT.memory.arrays.EVENTS) + NT.projects.socialTrading.utilities.queriesValidations.arrayValidations(queryReceived, thisObject, NT.projects.socialTrading.globals.memory.arrays.EVENTS) } @@ -31,7 +31,7 @@ exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQ switch (thisObject.direction) { case SA.projects.socialTrading.globals.queryConstants.DIRECTION_FUTURE: { for (let i = thisObject.initialIndex; i < thisObject.initialIndex + thisObject.amountRequested; i++) { - let event = NT.memory.arrays.EVENTS[i] + let event = NT.projects.socialTrading.globals.memory.arrays.EVENTS[i] if (event === undefined) { break } checkEventContext(event) } @@ -39,7 +39,7 @@ exports.newSocialTradingModulesQueriesEvents = function newSocialTradingModulesQ } case SA.projects.socialTrading.globals.queryConstants.DIRECTION_PAST: { for (let i = thisObject.initialIndex; i > thisObject.initialIndex - thisObject.amountRequested; i--) { - let event = NT.memory.arrays.EVENTS[i] + let event = NT.projects.socialTrading.globals.memory.arrays.EVENTS[i] if (event === undefined) { break } checkEventContext(event) } diff --git a/Projects/Social-Trading/NT/Modules/Query.js b/Projects/Social-Trading/NT/Modules/Query.js index 8f9ab4633..9c0831118 100644 --- a/Projects/Social-Trading/NT/Modules/Query.js +++ b/Projects/Social-Trading/NT/Modules/Query.js @@ -76,7 +76,7 @@ exports.newSocialTradingModulesQuery = function newSocialTradingModulesQuery() { break } - case SA.projects.socialTrading.globals.queryTypes.maps.EVENTS: { + case SA.projects.socialTrading.globals.queryTypes.EVENTS: { thisObject.query = NT.projects.socialTrading.modules.queriesEvents.newSocialTradingModulesQueriesEvents() thisObject.query.initialize(queryReceived) break diff --git a/Projects/Social-Trading/NT/Utilities/QueriesValidations.js b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js index 21d7932b7..5dc208fb7 100644 --- a/Projects/Social-Trading/NT/Utilities/QueriesValidations.js +++ b/Projects/Social-Trading/NT/Utilities/QueriesValidations.js @@ -16,11 +16,11 @@ exports.newSocialTradingUtilitiesQueriesValidations = function newSocialTradingU */ if (queryReceived.targetUserProfileId !== undefined) { thisObject.profile = NT.projects.socialTrading.globals.memory.maps.USER_PROFILES_BY_ID.get(queryReceived.targetUserProfileId) + if (thisObject.profile === undefined) { + throw ('Target User Profile Not Found.') + } } - if (thisObject.profile === undefined) { - throw ('Target User Profile Not Found.') - } /* Validate Bot Profile */ From 9d24120b9b4c38bfee9ede94c65e3a53670fe73b Mon Sep 17 00:00:00 2001 From: Ferrox85 <64791738+Ferrox85@users.noreply.github.com> Date: Tue, 14 Sep 2021 21:21:37 +0200 Subject: [PATCH 64/65] Changes to CSV Snapshot and Filestorage foor CSV handling Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js changes on this file: adds only the first run a header to the to be saved content next runs it fetches the CSV file adds the new content to it saves the file this way you have a snapshot of all trades for referencing Projects/Foundations/TS/Task-Modules/FileStorage.js changes on this file: -skips JSON validation (because it is no json file) and returns the text --- .../Low-Frequency-Trading/Snapshots.js | 219 +++++++++++------- .../TS/Task-Modules/FileStorage.js | 32 ++- 2 files changed, 159 insertions(+), 92 deletions(-) diff --git a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js index 35f3bf21b..4de4e1bb5 100644 --- a/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js +++ b/Projects/Foundations/TS/Bot-Modules/Trading-Bot/Low-Frequency-Trading/Snapshots.js @@ -1,7 +1,7 @@ -exports.newFoundationsBotModulesSnapshots = function (processIndex) { +exports.newFoundationsBotModulesSnapshots = function(processIndex) { /* - This module encapsulates the snapshots functionality. - */ + This module encapsulates the snapshots functionality. + */ const MODULE_NAME = 'Snapshots' let thisObject = { @@ -28,20 +28,21 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { positions: [] } - let positionKeys = new Map() // This is to prevent adding the same indicator / variable to the output collection. + let positionKeys = new Map() // This is to prevent adding the same indicator / variable to the output collection. let strategyKeys = new Map() - let createHeaders = true // This is going to be true only once - let createCloseHeaders = true // This is going to be true only once + let createHeaders = true // This is going to be true only once + let createCloseHeaders = true // This is going to be true only once let closeValues let strategyValues let addToStrategyValues let positionValues let addToPositionValues + let snapshotAvailable = false /* - These 3 are the main data structures available to users - when writing conditions and formulas. - */ + These 3 are the main data structures available to users + when writing conditions and formulas. + */ let chart let exchange let market @@ -52,6 +53,12 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { tradingEngine = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingEngine tradingSystem = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SIMULATION_STATE.tradingSystem sessionParameters = TS.projects.foundations.globals.processConstants.CONSTANTS_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_NODE.tradingParameters + // first trade forces overwrite of the existing file + if (tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value > 1) { + snapshotAvailable = true + createHeaders = false // This is going to be true only once + createCloseHeaders = false + } } function finalize() { @@ -70,9 +77,9 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { function updateChart(pChart, pExchange, pMarket) { /* - We need these 3 data structures to be a local objects - accessible while evaluating conditions and formulas. - */ + We need these 3 data structures to be a local objects + accessible while evaluating conditions and formulas. + */ chart = pChart exchange = pExchange market = pMarket @@ -80,9 +87,9 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { function strategyEntry() { /* - We will record here a snapshot of all values used in conditions and formulas within the Trading System. - If the strategy exists with a trade, this information will be added to the snapshots file. - */ + We will record here a snapshot of all values used in conditions and formulas within the Trading System. + If the strategy exists with a trade, this information will be added to the snapshots file. + */ strategyKeys = new Map() strategyValues = [] @@ -147,24 +154,26 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { let property = schemaDocument.childrenNodesProperties[i] switch (property.type) { - case 'node': { - if (property.name !== previousPropertyName) { + case 'node': + { + if (property.name !== previousPropertyName) { + if (node[property.name] !== undefined) { + evalNode(node[property.name]) + } + previousPropertyName = property.name + } + break + } + case 'array': + { if (node[property.name] !== undefined) { - evalNode(node[property.name]) + let nodePropertyArray = node[property.name] + for (let m = 0; m < nodePropertyArray.length; m++) { + evalNode(nodePropertyArray[m]) + } } - previousPropertyName = property.name + break } - break - } - case 'array': { - if (node[property.name] !== undefined) { - let nodePropertyArray = node[property.name] - for (let m = 0; m < nodePropertyArray.length; m++) { - evalNode(nodePropertyArray[m]) - } - } - break - } } } } @@ -173,10 +182,10 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { function evalCondition(node) { /* - The code can be at the condition node if it was done with the Conditions Editor, or it can also be - at a Javascript Code node. If there is a Javascript object we will give it preference and take the code - from there. Otherwise we will take the code from the Condition node. - */ + The code can be at the condition node if it was done with the Conditions Editor, or it can also be + at a Javascript Code node. If there is a Javascript object we will give it preference and take the code + from there. Otherwise we will take the code from the Condition node. + */ let nodeWithCode = node if (node.javascriptCode !== undefined) { @@ -211,14 +220,15 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { instruction = instruction.replace(/!==/g, '') instruction = instruction.replace(/==/g, '') instruction = instruction.replace(/===/g, '') - instruction = instruction.replace(/{/g, '') - instruction = instruction.replace(/}/g, '') + instruction = instruction.replace(/{/g, '') //this wrecks something in JS markup? + instruction = instruction.replace(/}/g, '') //this wrecks something in JS markup? if (instruction.indexOf('chart') >= 0) { let parts = instruction.split('.') let timeFrame = parts[1] let product = parts[2] let property checkPrevious(3) + function checkPrevious(index) { property = parts[index] if (property === 'previous') { @@ -295,17 +305,17 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { let closeHeaders = ['Trade Number', 'Open Datetime', 'Close Datetime', 'Strategy Name', 'Trigger On Situation', 'Take Position Situation', 'Result In Base Asset', 'Result In Quoted Asset', 'ROI in Base Asset', 'ROI in Quoted Asset', 'Exit Type'] closeValues = [ - tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value, // Position Number - (new Date(openDatetime)).toISOString(), // Open Datetime - (new Date(closeDatetime)).toISOString(), // Open Datetime - tradingEngine.tradingCurrent.strategy.strategyName.value, // Strategy Name - tradingEngine.tradingCurrent.strategy.situationName.value, // Trigger On Situation - tradingEngine.tradingCurrent.position.situationName.value, // Take Position Situation - tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value, // Result in Base Asset - tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value, // Result in Base Asset - tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value, // ROI in Base Asseet - tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value, // ROI in Quoted Asset - tradingEngine.tradingCurrent.position.exitType.value // Exit Type + tradingEngine.tradingCurrent.tradingEpisode.tradingEpisodeCounters.positions.value, // Position Number + (new Date(openDatetime)).toISOString(), // Open Datetime + (new Date(closeDatetime)).toISOString(), // Open Datetime + tradingEngine.tradingCurrent.strategy.strategyName.value, // Strategy Name + tradingEngine.tradingCurrent.strategy.situationName.value, // Trigger On Situation + tradingEngine.tradingCurrent.position.situationName.value, // Take Position Situation + tradingEngine.tradingCurrent.position.positionBaseAsset.hitFail.value, // Result in Base Asset + tradingEngine.tradingCurrent.position.positionQuotedAsset.hitFail.value, // Result in Base Asset + tradingEngine.tradingCurrent.position.positionBaseAsset.ROI.value, // ROI in Base Asseet + tradingEngine.tradingCurrent.position.positionQuotedAsset.ROI.value, // ROI in Quoted Asset + tradingEngine.tradingCurrent.position.exitType.value // Exit Type ] if (createCloseHeaders === true) { @@ -333,46 +343,95 @@ exports.newFoundationsBotModulesSnapshots = function (processIndex) { try { let fileStorage = TS.projects.foundations.taskModules.fileStorage.newFileStorage(processIndex); - let fileContent = ""; - let separator = "\r\n"; + let fileName = pFileName + '.csv' - parseRecord(snapshots.headers) - - for (let i = 0; i < snapshotArray.length; i++) { - let record = snapshotArray[i]; - parseRecord(record) - } - - function parseRecord(record) { - for (let j = 0; j < record.length; j++) { - let property = record[j] - - fileContent = fileContent + '' + property - if (j !== record.length - 1) { - fileContent = fileContent + "," - } - } - fileContent = fileContent + separator - } - - fileContent = "" + fileContent + ""; - - let fileName = pFileName + '.csv'; - let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + "/Output/" + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + "/" + SNAPSHOTS_FOLDER_NAME; + let filePath = TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).FILE_PATH_ROOT + '/Output/' + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).SESSION_FOLDER_NAME + '/' + SNAPSHOTS_FOLDER_NAME; filePath += '/' + fileName - fileStorage.createTextFile(filePath, fileContent + '\n', onFileCreated); + //Get contents of current file if available, otherwise start empty file + if (snapshotAvailable) { + getSnapShotFile(filePath) + } else { + writeOutput('') + } - function onFileCreated(err) { - if (err.result !== TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) { - TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> onFileCreated -> err = " + err.stack); - TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> onFileCreated -> filePath = " + filePath); - TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> onFileCreated -> market = " + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + "_" + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName); + function writeOutput(fileContent) { + let separator = '\r\n'; + + parseRecord(snapshots.headers) + + for (let i = 0; i < snapshotArray.length; i++) { + let record = snapshotArray[i]; + parseRecord(record) + } + + function parseRecord(record) { + for (let j = 0; j < record.length; j++) { + let property = record[j] + + fileContent = fileContent + '' + property + if (j !== record.length - 1) { + fileContent = fileContent + "," + } + } + fileContent = fileContent + separator + } + + fileContent = "" + fileContent + ""; + + fileStorage.createTextFile(filePath, fileContent + '\n', onFileCreated) + + function onFileCreated(err) { + if (err.result !== TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) { + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] writeSnapshotFile -> onFileCreated -> err = ' + err.stack); + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] writeSnapshotFile -> onFileCreated -> filePath = ' + filePath); + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] writeSnapshotFile -> onFileCreated -> market = ' + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.baseAsset.referenceParent.config.codeName + '_' + TS.projects.foundations.globals.taskConstants.TASK_NODE.parentNode.parentNode.parentNode.referenceParent.quotedAsset.referenceParent.config.codeName); + } } } + + } catch (err) { + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get( + processIndex + ).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write( + MODULE_NAME, + '[ERROR] writeSnapshotFile -> err = ' + err.stack + ) } - catch (err) { - TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, "[ERROR] writeSnapshotFile -> err = " + err.stack); + //get file contents + function getSnapShotFile(filePath) { + + try { + + let fileStorage = TS.projects.foundations.taskModules.fileStorage.newFileStorage(processIndex); + + fileStorage.getTextFile(filePath, onFileReceived) + + function onFileReceived(err, text) { + if (err.result === TS.projects.foundations.globals.standardResponses.DEFAULT_OK_RESPONSE.result) { + try { + writeOutput(text) + } catch (err) { + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> fileName = ' + filePath); + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> filePath = ' + filePath); + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> err = ' + err.stack); + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> Asuming this is a temporary situation. Requesting a Retry.'); + callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE) + } + } else { + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> err = ' + err.stack); + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> filePath = ' + filePath); + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err; + callBackFunction(err) + } + } + + } catch (error) { + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> err = ' + err.stack); + TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT.write(MODULE_NAME, '[ERROR] start -> loadExistingFiles -> loopBody -> readExistingFile -> onFileReceived -> filePath = ' + filePath); + TS.projects.foundations.globals.processVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).UNEXPECTED_ERROR = err; + callBackFunction(err); + } } } } \ No newline at end of file diff --git a/Projects/Foundations/TS/Task-Modules/FileStorage.js b/Projects/Foundations/TS/Task-Modules/FileStorage.js index 97cd5a7f6..a680fd6ab 100644 --- a/Projects/Foundations/TS/Task-Modules/FileStorage.js +++ b/Projects/Foundations/TS/Task-Modules/FileStorage.js @@ -8,16 +8,17 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { let thisObject = { asyncGetTextFile: asyncGetTextFile, - asyncCreateTextFile: asyncCreateTextFile, + asyncCreateTextFile: asyncCreateTextFile, getTextFile: getTextFile, createTextFile: createTextFile, deleteTextFile: deleteTextFile } - + let logger if (TS.projects.foundations.globals.loggerVariables.VARIABLES_BY_PROCESS_INDEX_MAP.get(processIndex).BOT_MAIN_LOOP_LOGGER_MODULE_OBJECT === undefined) { // Dummy logger logger = {} + function write() { } @@ -31,16 +32,17 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { /* This function allows its caller to work with async / await instead of callbacks */ let promise = new Promise((resolve, reject) => { - getTextFile(filePath, onFileRead, noRetry, canUsePrevious) + getTextFile(filePath, onFileRead, noRetry, canUsePrevious) + function onFileRead(err, text) { - + let response = { err: err, text: text } resolve(response) } - }) + }) return promise } @@ -49,15 +51,16 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { /* This function allows its caller to work with async / await instead of callbacks */ let promise = new Promise((resolve, reject) => { - createTextFile(filePath, fileContent, onFileWriten, keepPrevious, noTemp) + createTextFile(filePath, fileContent, onFileWriten, keepPrevious, noTemp) + function onFileWriten(err) { - + let response = { err: err } resolve(response) } - }) + }) return promise } @@ -78,8 +81,13 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { fileLocation = global.env.PATH_TO_PROJECTS + '/' + filePath mustBeJason = false } else { + if (filePath.indexOf('.csv') > 0) { + mustBeJason = false + } else { + mustBeJason = true + } fileLocation = global.env.PATH_TO_DATA_STORAGE + '/' + filePath - mustBeJason = true + } try { @@ -145,7 +153,7 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { } /* - We are going to check if the file is a valir JSON object + We are going to check if the file is a valid JSON object */ try { let jsonCheck = JSON.parse(text.toString()) @@ -457,7 +465,7 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { let request = http.get(url, onResponse); - request.on('error', function (err) { + request.on('error', function(err) { logger.write(MODULE_NAME, "[ERROR] getFileViaHTTP -> onError -> err = " + err.stack); logger.write(MODULE_NAME, "[ERROR] getFileViaHTTP -> onError -> Failed to fetch file via HTTP. Will retry later. "); callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE); @@ -498,4 +506,4 @@ exports.newFileStorage = function newFileStorage(processIndex, host, port) { callBackFunction(TS.projects.foundations.globals.standardResponses.DEFAULT_RETRY_RESPONSE); } } -} +} \ No newline at end of file From f7f5a5859cba16aa4a9487505c5bd8d316578505 Mon Sep 17 00:00:00 2001 From: ssplatt Date: Tue, 14 Sep 2021 16:03:47 -0400 Subject: [PATCH 65/65] fix spelling of strength --- .../Plugins/Data-Mines/Sparta.json | 78 +++++++++---------- .../Plugins/Trading-Mines/Masters.json | 8 +- .../Workspaces/BB-Top-Bounce-Demo.json | 10 +-- .../Workspaces/Custom-Charts-Tutorials.json | 14 ++-- 4 files changed, 55 insertions(+), 55 deletions(-) diff --git a/Projects/Foundations/Plugins/Data-Mines/Sparta.json b/Projects/Foundations/Plugins/Data-Mines/Sparta.json index 41371d69c..5c9127b28 100644 --- a/Projects/Foundations/Plugins/Data-Mines/Sparta.json +++ b/Projects/Foundations/Plugins/Data-Mines/Sparta.json @@ -19330,7 +19330,7 @@ }, { "type": "Indicator Bot", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "config": "{\n\"codeName\": \"RSI\"\n}", "project": "Foundations", "processes": [ @@ -19383,7 +19383,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Indicator Bot", "Foundations", "b2fc1830-30e3-407a-9cd2-ab93a9e36cc7" @@ -19535,7 +19535,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Indicator Bot", "Foundations", "b2fc1830-30e3-407a-9cd2-ab93a9e36cc7" @@ -19829,7 +19829,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Indicator Bot", "Foundations", "b2fc1830-30e3-407a-9cd2-ab93a9e36cc7" @@ -19920,7 +19920,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Indicator Bot", "Foundations", "b2fc1830-30e3-407a-9cd2-ab93a9e36cc7" @@ -20717,7 +20717,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -38266,7 +38266,7 @@ }, { "type": "Plotter", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "config": "{\n\"codeName\": \"Plotter RSI\"\n}", "project": "Foundations", "modules": [ @@ -39291,7 +39291,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -39363,7 +39363,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -39435,7 +39435,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -39507,7 +39507,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -39664,7 +39664,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -39736,7 +39736,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -39808,7 +39808,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -39880,7 +39880,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40037,7 +40037,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40109,7 +40109,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40181,7 +40181,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40253,7 +40253,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40410,7 +40410,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40482,7 +40482,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40554,7 +40554,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40626,7 +40626,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40783,7 +40783,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -40855,7 +40855,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41012,7 +41012,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41084,7 +41084,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41241,7 +41241,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41313,7 +41313,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41470,7 +41470,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41542,7 +41542,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41699,7 +41699,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41771,7 +41771,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -41985,7 +41985,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -42057,7 +42057,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -42214,7 +42214,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -42286,7 +42286,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -42358,7 +42358,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" @@ -42430,7 +42430,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Plotter", "Foundations", "d87c1a49-c376-404b-98ff-62feac714c64" diff --git a/Projects/Foundations/Plugins/Trading-Mines/Masters.json b/Projects/Foundations/Plugins/Trading-Mines/Masters.json index 36d3009b3..028f14daf 100644 --- a/Projects/Foundations/Plugins/Trading-Mines/Masters.json +++ b/Projects/Foundations/Plugins/Trading-Mines/Masters.json @@ -9604,7 +9604,7 @@ }, { "type": "Bot Data Dependencies", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "dataDependencies": [ { @@ -9646,7 +9646,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Indicator Bot", "Foundations", "b2fc1830-30e3-407a-9cd2-ab93a9e36cc7" @@ -9706,7 +9706,7 @@ "63b3bd4b-97da-47a7-8f72-b9eaf0632ebb" ], [ - "Relative Strenght Index (RSI)", + "Relative Strength Index (RSI)", "Indicator Bot", "Foundations", "b2fc1830-30e3-407a-9cd2-ab93a9e36cc7" @@ -16872,7 +16872,7 @@ "botDataDependencies": [ { "type": "Bot Data Dependencies", - "name": "Relative Strenght Index - Wilder Method (RSI-W)", + "name": "Relative Strength Index - Wilder Method (RSI-W)", "project": "Foundations", "dataDependencies": [ { diff --git a/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json b/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json index 9f0835618..444a563c0 100644 --- a/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json +++ b/Projects/Foundations/Plugins/Workspaces/BB-Top-Bounce-Demo.json @@ -166,11 +166,11 @@ }, { "type": "Task", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "bot": { "type": "Indicator Bot Instance", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}", "project": "Foundations", "processes": [ @@ -2736,7 +2736,7 @@ }, { "type": "Bot Products", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "dataProducts": [ { @@ -21362,7 +21362,7 @@ }, { "type": "Bot Layers", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "layers": [ { @@ -31933,7 +31933,7 @@ }, { "type": "Bot Layers", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "layers": [ { diff --git a/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json b/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json index 3116aedf9..0147bfaed 100644 --- a/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json +++ b/Projects/Foundations/Plugins/Workspaces/Custom-Charts-Tutorials.json @@ -408,17 +408,17 @@ }, { "type": "Task", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "bot": { "type": "Indicator Bot Instance", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "config": "{ \n\"parameter1\": \"Value for parameter1 defined at the Product Definition\"\n}", "project": "Foundations", "processes": [ { "type": "Indicator Process Instance", - "name": "Relative Strenght Index (RSI) Multi-Time-Frame-Market", + "name": "Relative Strength Index (RSI) Multi-Time-Frame-Market", "project": "Foundations", "id": "ffa5490a-b87c-4d25-a0bf-3a978ba22521", "savedPayload": { @@ -450,7 +450,7 @@ }, { "type": "Indicator Process Instance", - "name": "Relative Strenght Index (RSI) Multi-Time-Frame-Daily", + "name": "Relative Strength Index (RSI) Multi-Time-Frame-Daily", "project": "Foundations", "id": "69ff12a5-65b8-4d00-ad9d-329f502aab42", "savedPayload": { @@ -3601,7 +3601,7 @@ }, { "type": "Bot Products", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "dataProducts": [ { @@ -25409,7 +25409,7 @@ }, { "type": "Bot Layers", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "layers": [ { @@ -39990,7 +39990,7 @@ }, { "type": "Bot Layers", - "name": "Relative Strenght Index (RSI)", + "name": "Relative Strength Index (RSI)", "project": "Foundations", "layers": [ {