From ca26eddbf069bad63d1af85744c09d12434967a7 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 24 May 2019 09:29:13 +0200 Subject: [PATCH 01/18] Workspace first root node being saved --- Canvas.js | 1 + FloatingSpace/StrategyPart.js | 3 - Spaces/StrategySpace.js | 5 + StrategySpace/Workspace.js | 208 ++++++++++++++++++++++++++++++++-- 4 files changed, 204 insertions(+), 13 deletions(-) diff --git a/Canvas.js b/Canvas.js index 19a14f60a..28e4e995b 100644 --- a/Canvas.js +++ b/Canvas.js @@ -128,6 +128,7 @@ function newCanvas () { animation.addCallBackFunction('CockpitSpace Physics', thisObject.cockpitSpace.physics) animation.addCallBackFunction('Top Space Draw', thisObject.topSpace.draw) animation.addCallBackFunction('Strategy Space Draw', thisObject.strategySpace.draw) + animation.addCallBackFunction('Strategy Space Physics', thisObject.strategySpace.physics) animation.addCallBackFunction('Splash Screen Draw', splashScreen.draw) animation.start() } catch (err) { diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 664ec9fc8..72e44ef31 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -614,9 +614,6 @@ function newStrategyPart () { } } - if (thisObject.isExecuting === true) { - let a = 1 - } if (executingIcon !== undefined) { if (executingIcon.canDrawIcon === true) { if (thisObject.isExecuting === true) { diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index c24ffadbc..42a9f0fb4 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -10,6 +10,7 @@ function newStrategySpace () { workspace: undefined, isDeployed: false, isInitialized: false, + physics: physics, draw: draw, getContainer: getContainer, makeVisible: makeVisible, @@ -138,6 +139,10 @@ function newStrategySpace () { } } + function physics () { + thisObject.workspace.physics() + } + function makeVisible () { if (thisObject.isDeployed !== true) { deploydTradingSystem() diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index f2c76368a..b95a52ed9 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -5,6 +5,7 @@ function newWorkspace () { let thisObject = { tradingSystem: undefined, container: undefined, + physics: physics, spawn: spawn, detachNode: detachNode, attachNode: attachNode, @@ -30,6 +31,8 @@ function newWorkspace () { y: canvas.floatingSpace.container.frame.height / 2 } + let rootNodes = new Map() + return thisObject function finalize () { @@ -44,12 +47,25 @@ function newWorkspace () { strategies: tradingSystem.subStrategies } generateStrategyParts() + + rootNodes.set(thisObject.tradingSystem.id, thisObject.tradingSystem) } function getContainer (point) { } + function physics () { + /* Here we will save all the workspace related objects into the local storage */ + rootNodes.forEach(saveRootNode) + + function saveRootNode (value, key, map) { + workspaceNode = getWorkspaceNode(value) + let textToSave = JSON.stringify(workspaceNode) + window.localStorage.setItem('nodeValue', textToSave) + } + } + function spawn (nodeText, point) { point = canvas.floatingSpace.container.frame.unframeThisPoint(point) spawnPosition.x = point.x @@ -730,15 +746,16 @@ function newWorkspace () { { let condition = { type: node.type, + subType: node.subType, name: node.name, code: node.code } return condition - break } case 'Situation': { let situation = { type: node.type, + subType: node.subType, name: node.name, conditions: [] } @@ -748,7 +765,6 @@ function newWorkspace () { situation.conditions.push(condition) } return situation - break } case 'Phase': { let phase = { @@ -764,7 +780,6 @@ function newWorkspace () { phase.situations.push(situation) } return phase - break } case 'Stop': { let stop = { @@ -779,7 +794,6 @@ function newWorkspace () { stop.phases.push(phase) } return stop - break } case 'Take Profit': { let takeProfit = { @@ -794,7 +808,6 @@ function newWorkspace () { takeProfit.phases.push(phase) } return takeProfit - break } case 'Take Position Event': { let event = { @@ -809,7 +822,6 @@ function newWorkspace () { event.situations.push(situation) } return event - break } case 'Trigger On Event': { let event = { @@ -824,7 +836,6 @@ function newWorkspace () { event.situations.push(situation) } return event - break } case 'Trigger Off Event': { let event = { @@ -839,7 +850,6 @@ function newWorkspace () { event.situations.push(situation) } return event - break } case 'Strategy': { let strategy = { @@ -853,7 +863,6 @@ function newWorkspace () { buyOrder: getProtocolNode(node.buyOrder) } return strategy - break } case 'Trading System': { let tradingSystem = { @@ -868,7 +877,186 @@ function newWorkspace () { tradingSystem.strategies.push(strategy) } return tradingSystem - break + } + } + } + + function getWorkspaceNode (node) { + switch (node.type) { + case 'Condition': + { + let condition = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + code: node.code, + savedPayload: getSavedPayload(node) + } + return condition + } + case 'Situation': { + let situation = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + conditions: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.conditions.length; m++) { + let condition = getWorkspaceNode(node.conditions[m]) + situation.conditions.push(condition) + } + return situation + } + case 'Phase': { + let phase = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + code: node.code, + situations: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.situations.length; m++) { + let situation = getWorkspaceNode(node.situations[m]) + phase.situations.push(situation) + } + return phase + } + case 'Stop': { + let stop = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + phases: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.phases.length; m++) { + let phase = getWorkspaceNode(node.phases[m]) + stop.phases.push(phase) + } + return stop + } + case 'Take Profit': { + let takeProfit = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + phases: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.phases.length; m++) { + let phase = getWorkspaceNode(node.phases[m]) + takeProfit.phases.push(phase) + } + return takeProfit + } + case 'Take Position Event': { + let event = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + situations: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.situations.length; m++) { + let situation = getWorkspaceNode(node.situations[m]) + event.situations.push(situation) + } + return event + } + case 'Trigger On Event': { + let event = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + situations: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.situations.length; m++) { + let situation = getWorkspaceNode(node.situations[m]) + event.situations.push(situation) + } + return event + } + case 'Trigger Off Event': { + let event = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + situations: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.situations.length; m++) { + let situation = getWorkspaceNode(node.situations[m]) + event.situations.push(situation) + } + return event + } + case 'Strategy': { + let strategy = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + entryPoint: getWorkspaceNode(node.entryPoint), + exitPoint: getWorkspaceNode(node.exitPoint), + sellPoint: getWorkspaceNode(node.sellPoint), + stopLoss: getWorkspaceNode(node.stopLoss), + buyOrder: getWorkspaceNode(node.buyOrder), + savedPayload: getSavedPayload(node) + } + return strategy + } + case 'Trading System': { + let tradingSystem = { + id: node.id, + type: node.type, + subType: node.subType, + name: node.name, + strategies: [], + savedPayload: getSavedPayload(node) + } + + for (let m = 0; m < node.strategies.length; m++) { + let strategy = getWorkspaceNode(node.strategies[m]) + tradingSystem.strategies.push(strategy) + } + return tradingSystem + } + } + } + + function getSavedPayload (node) { + let savedPayload = { + position: { + x: node.payload.position.x, + y: node.payload.position.y + }, + targetPosition: { + x: node.payload.targetPosition.x, + y: node.payload.targetPosition.y + }, + floatingObject: { + isPinned: node.payload.floatingObject.isPinned + }, + uiObject: { + } } } From 57df515f60bbef305957197b8e62b3f236d1cb91 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 24 May 2019 11:57:50 +0200 Subject: [PATCH 02/18] Recovering Object State from local storage implemented --- Canvas.js | 7 ++--- FloatingSpace/FloatingObject.js | 6 ++-- FloatingSpace/StrategyPartConstructor.js | 13 +++++++++ Spaces/StrategySpace.js | 34 +++++++++++----------- StrategySpace/Workspace.js | 36 ++++++++++++++++-------- 5 files changed, 61 insertions(+), 35 deletions(-) diff --git a/Canvas.js b/Canvas.js index 28e4e995b..c99219890 100644 --- a/Canvas.js +++ b/Canvas.js @@ -82,6 +82,9 @@ function newCanvas () { /* Instantiate all the children spaces of Canvas object */ + thisObject.floatingSpace = newFloatingSpace() + thisObject.floatingSpace.initialize() + thisObject.topSpace = newTopSpace() await thisObject.topSpace.initialize() @@ -94,9 +97,6 @@ function newCanvas () { thisObject.panelsSpace = newPanelsSpace() thisObject.panelsSpace.initialize() - thisObject.floatingSpace = newFloatingSpace() - thisObject.floatingSpace.initialize() - thisObject.chartSpace = newChartSpace() thisObject.chartSpace.initialize(onCharSpaceInitialized) @@ -706,4 +706,3 @@ function newCanvas () { } } } - diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index 266a7cd0c..53e612b2f 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -21,6 +21,7 @@ function newFloatingObject () { targetRadius: 0, // This is the target radius of the floating object with zoom applied. It should be animated until reaching this value. isPinned: false, nearbyFloatingObjects: [], + setPosition: setPosition, pinToggle: pinToggle, physics: physics, initializeMass: initializeMass, @@ -267,8 +268,10 @@ function newFloatingObject () { y: Math.floor((Math.random() * (200) - 100)) + arroundPoint.y } - // thisObject.container.frame.position = thisObject.container.frame.frameThisPoint(position) + setPosition(position) + } + function setPosition (position) { thisObject.container.frame.position.x = position.x thisObject.container.frame.position.y = position.y @@ -309,4 +312,3 @@ function newFloatingObject () { function updateRadius () { } } - diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index bbe0151e8..88701ae54 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -36,6 +36,19 @@ function newStrategyPartConstructor () { floatingObject.initialize('Strategy Part', payload) payload.floatingObject = floatingObject + if (payload.node.savedPayload !== undefined) { + position = { + x: payload.node.savedPayload.position.x, + y: payload.node.savedPayload.position.y + } + floatingObject.setPosition(position) + payload.node.savedPayload.position = undefined + if (payload.node.savedPayload.floatingObject.isPinned === true) { + floatingObject.pinToggle() + } + payload.node.savedPayload = undefined + } + let strategyPart = newStrategyPart() strategyPart.fitFunction = canvas.floatingSpace.fitIntoVisibleArea strategyPart.isVisibleFunction = canvas.floatingSpace.isThisPointVisible diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index 42a9f0fb4..ae0cd0150 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -8,7 +8,6 @@ function newStrategySpace () { iconCollection: undefined, iconByPartType: undefined, workspace: undefined, - isDeployed: false, isInitialized: false, physics: physics, draw: draw, @@ -30,16 +29,24 @@ function newStrategySpace () { return thisObject async function initialize () { - thisObject.strategizerGateway = newStrategizerGateway() - - thisObject.strategizerGateway.initialize() - await thisObject.strategizerGateway.loadFromStrategyzer() - loadIconCollection() buildIconByPartTypeMap() - if (thisObject.strategizerGateway.strategizerData !== undefined) { + thisObject.strategizerGateway = newStrategizerGateway() + thisObject.strategizerGateway.initialize() + + let savedWorkspace = window.localStorage.getItem('workspace') + if (savedWorkspace === null) { + await thisObject.strategizerGateway.loadFromStrategyzer() + if (thisObject.strategizerGateway.strategizerData !== undefined) { + thisObject.isInitialized = true + thisObject.workspace = newWorkspace() + thisObject.workspace.initialize(thisObject.strategizerGateway.strategizerData) + } + } else { thisObject.isInitialized = true + thisObject.workspace = newWorkspace() + thisObject.workspace.initialize() } } @@ -140,25 +147,15 @@ function newStrategySpace () { } function physics () { + if (visible !== true) { return } thisObject.workspace.physics() } function makeVisible () { - if (thisObject.isDeployed !== true) { - deploydTradingSystem() - } canvas.floatingSpace.makeVisible() visible = true } - function deploydTradingSystem () { - thisObject.workspace = newWorkspace() - if (thisObject.strategizerGateway.strategizerData !== undefined) { - thisObject.workspace.initialize(thisObject.strategizerGateway.strategizerData) - thisObject.isDeployed = true - } - } - function makeInvisible () { visible = false } @@ -185,3 +182,4 @@ function newStrategySpace () { } } } + diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index b95a52ed9..0e1f5f71c 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -42,12 +42,16 @@ function newWorkspace () { } function initialize (tradingSystem) { - thisObject.tradingSystem = { - id: tradingSystem.id, - strategies: tradingSystem.subStrategies + let savedWorkspace = window.localStorage.getItem('workspace') + if (savedWorkspace === null) { + thisObject.tradingSystem = { + id: tradingSystem.id, + strategies: tradingSystem.subStrategies + } + } else { + thisObject.tradingSystem = JSON.parse(savedWorkspace) } generateStrategyParts() - rootNodes.set(thisObject.tradingSystem.id, thisObject.tradingSystem) } @@ -62,7 +66,7 @@ function newWorkspace () { function saveRootNode (value, key, map) { workspaceNode = getWorkspaceNode(value) let textToSave = JSON.stringify(workspaceNode) - window.localStorage.setItem('nodeValue', textToSave) + window.localStorage.setItem('workspace', textToSave) } } @@ -340,15 +344,24 @@ function newWorkspace () { function createPart (partType, name, node, parentNode, chainParent, title) { let payload = {} - if (chainParent === undefined) { + + if (node.savedPayload !== undefined) { payload.targetPosition = { - x: spawnPosition.x, - y: spawnPosition.y + x: node.savedPayload.targetPosition.x, + y: node.savedPayload.targetPosition.y } + node.savedPayload.targetPosition = undefined } else { - payload.targetPosition = { - x: chainParent.payload.position.x, - y: chainParent.payload.position.y + if (chainParent === undefined) { + payload.targetPosition = { + x: spawnPosition.x, + y: spawnPosition.y + } + } else { + payload.targetPosition = { + x: chainParent.payload.position.x, + y: chainParent.payload.position.y + } } } @@ -1059,5 +1072,6 @@ function newWorkspace () { } } + return savedPayload } } From 5ce0bdb4a6ce79f51ec9f70ab357bb04cc7b209e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 24 May 2019 12:48:57 +0200 Subject: [PATCH 03/18] Bug Fixed: pinned icon now working --- FloatingSpace/CircularMenu.js | 1 + FloatingSpace/CircularMenuItem.js | 8 ++++++++ FloatingSpace/FloatingObject.js | 5 +++++ FloatingSpace/StrategyPartConstructor.js | 10 ++++++++++ 4 files changed, 24 insertions(+) diff --git a/FloatingSpace/CircularMenu.js b/FloatingSpace/CircularMenu.js index 89113c067..5a6c96be7 100644 --- a/FloatingSpace/CircularMenu.js +++ b/FloatingSpace/CircularMenu.js @@ -52,6 +52,7 @@ function newCircularMenu () { menuItem.action = menuItemInitialValue.action menuItem.actionFunction = menuItemInitialValue.actionFunction + menuItem.actionStatus = menuItemInitialValue.actionStatus menuItem.label = menuItemInitialValue.label menuItem.workingLabel = menuItemInitialValue.workingLabel menuItem.workDoneLabel = menuItemInitialValue.workDoneLabel diff --git a/FloatingSpace/CircularMenuItem.js b/FloatingSpace/CircularMenuItem.js index b4f191322..cbda91bc9 100644 --- a/FloatingSpace/CircularMenuItem.js +++ b/FloatingSpace/CircularMenuItem.js @@ -10,6 +10,7 @@ function newCircularMenuItem () { currentIcon: undefined, action: undefined, actionFunction: undefined, + actionStatus: undefined, label: undefined, workingLabel: undefined, workDoneLabel: undefined, @@ -70,6 +71,7 @@ function newCircularMenuItem () { thisObject.currentIcon = undefined thisObject.payload = undefined thisObject.actionFunction = undefined + thisObject.actionStatus = undefined } function initialize (pPayload) { @@ -140,6 +142,12 @@ function newCircularMenuItem () { thisObject.iconOff = canvas.strategySpace.iconCollection.get(thisObject.iconPathOff) } + /* Current Status might be linked to some other object status */ + + if (thisObject.actionStatus !== undefined) { + thisObject.currentStatus = thisObject.actionStatus() + } + /* Current Status sets the icon to be used */ if (thisObject.currentStatus === true) { diff --git a/FloatingSpace/FloatingObject.js b/FloatingSpace/FloatingObject.js index 53e612b2f..6bc85f59d 100644 --- a/FloatingSpace/FloatingObject.js +++ b/FloatingSpace/FloatingObject.js @@ -20,6 +20,7 @@ function newFloatingObject () { rawRadius: 0, // This is the radius of this floating object without zoom. targetRadius: 0, // This is the target radius of the floating object with zoom applied. It should be animated until reaching this value. isPinned: false, + getPinStatus: getPinStatus, nearbyFloatingObjects: [], setPosition: setPosition, pinToggle: pinToggle, @@ -100,6 +101,10 @@ function newFloatingObject () { } } + function getPinStatus () { + return thisObject.isPinned + } + function pinToggle () { if (thisObject.isPinned !== true) { thisObject.isPinned = true diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 88701ae54..bee92f260 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -74,6 +74,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: true, label: undefined, visible: false, @@ -131,6 +132,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -172,6 +174,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -214,6 +217,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -256,6 +260,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -298,6 +303,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -340,6 +346,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -387,6 +394,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -454,6 +462,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, @@ -513,6 +522,7 @@ function newStrategyPartConstructor () { { action: 'Pin / Unpin', actionFunction: floatingObject.pinToggle, + actionStatus: floatingObject.getPinStatus, currentStatus: false, label: undefined, visible: false, From a01e7115f6ae95886ac45ccd133fc6f2883275c5 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 24 May 2019 12:59:38 +0200 Subject: [PATCH 04/18] BUG FIXED: not saving because of trading sustem id --- Spaces/StrategySpace.js | 1 - StrategySpace/StrategizerGateway.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index ae0cd0150..b754ba5f7 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -182,4 +182,3 @@ function newStrategySpace () { } } } - diff --git a/StrategySpace/StrategizerGateway.js b/StrategySpace/StrategizerGateway.js index 26db512ec..a742b2b7d 100644 --- a/StrategySpace/StrategizerGateway.js +++ b/StrategySpace/StrategizerGateway.js @@ -80,7 +80,7 @@ function newStrategizerGateway () { apolloClient.mutate({ mutation: GRAPHQL_MUTATION_UPDATE_STRATEGIES, variables: { - id: thisObject.strategizerData.id, + id: tradingSystem.id, strategy: dataToSave.strategy } }) From a7ca5ce82004fb2468ca2c5c18da93c6e0ca0b32 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 24 May 2019 13:02:50 +0200 Subject: [PATCH 05/18] BUG Fixed, strange lines at the left deleted --- ChartsSpace/TimeMachine.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ChartsSpace/TimeMachine.js b/ChartsSpace/TimeMachine.js index 0f01ddf25..b56d543dd 100644 --- a/ChartsSpace/TimeMachine.js +++ b/ChartsSpace/TimeMachine.js @@ -346,6 +346,7 @@ function newTimeMachine () { } function thisBackground () { + return let params = { cornerRadius: 15, lineWidth: 5, From b10d5a4ef222a2731437a16408353ca1833d1547 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 24 May 2019 19:42:50 +0200 Subject: [PATCH 06/18] Saving and Retrieving Multiple Root Nodes --- StrategySpace/Workspace.js | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index 0e1f5f71c..3a3d1262c 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -31,7 +31,7 @@ function newWorkspace () { y: canvas.floatingSpace.container.frame.height / 2 } - let rootNodes = new Map() + let rootNodes = [] return thisObject @@ -44,15 +44,19 @@ function newWorkspace () { function initialize (tradingSystem) { let savedWorkspace = window.localStorage.getItem('workspace') if (savedWorkspace === null) { - thisObject.tradingSystem = { + let adaptedTradingSystem = { id: tradingSystem.id, strategies: tradingSystem.subStrategies } + rootNodes.push(adaptedTradingSystem) + generateStrategyParts(adaptedTradingSystem) } else { - thisObject.tradingSystem = JSON.parse(savedWorkspace) + rootNodes = JSON.parse(savedWorkspace) + for (let i = 0; i < rootNodes.length; i++) { + let rootNode = rootNodes[i] + createPartFromNode(rootNode, undefined, undefined) + } } - generateStrategyParts() - rootNodes.set(thisObject.tradingSystem.id, thisObject.tradingSystem) } function getContainer (point) { @@ -61,13 +65,14 @@ function newWorkspace () { function physics () { /* Here we will save all the workspace related objects into the local storage */ - rootNodes.forEach(saveRootNode) - - function saveRootNode (value, key, map) { - workspaceNode = getWorkspaceNode(value) - let textToSave = JSON.stringify(workspaceNode) - window.localStorage.setItem('workspace', textToSave) + let stringifyReadyNodes = [] + for (let i = 0; i < rootNodes.length; i++) { + let rootNode = rootNodes[i] + let workspaceNode = getWorkspaceNode(rootNode) + stringifyReadyNodes.push(workspaceNode) } + let textToSave = JSON.stringify(stringifyReadyNodes) + window.localStorage.setItem('workspace', textToSave) } function spawn (nodeText, point) { @@ -77,6 +82,7 @@ function newWorkspace () { let dirtyNode = JSON.parse(nodeText) let rootNode = getProtocolNode(dirtyNode) + rootNodes.push(rootNode) createPartFromNode(rootNode, undefined, undefined) } @@ -390,9 +396,9 @@ function newWorkspace () { canvas.floatingSpace.strategyPartConstructor.destroyStrategyPart(node.payload) } - function generateStrategyParts () { + function generateStrategyParts (node) { let lastPhase - let tradingSystem = thisObject.tradingSystem + let tradingSystem = node createPart('Trading System', '', tradingSystem, undefined, undefined) From 1b2dbd313b475efb19fd75e8dd95a0720033d31f Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Fri, 24 May 2019 19:57:48 +0200 Subject: [PATCH 07/18] Attach and Detach creating Root Nodes --- StrategySpace/Workspace.js | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index 3a3d1262c..8a7f4daae 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -207,8 +207,7 @@ function newWorkspace () { if (strategy.id === node.id) { payload.parentNode.strategies.splice(i, 1) } - payload.parentNode = undefined - payload.chainParent = undefined + completeDetachment(node) } } break @@ -240,8 +239,7 @@ function newWorkspace () { payload.parentNode.conditions.splice(i, 1) } } - node.payload.chainParent = undefined - node.payload.parentNode = undefined + completeDetachment(node) } break case 'Situation': { @@ -252,8 +250,7 @@ function newWorkspace () { payload.parentNode.situations.splice(i, 1) } } - node.payload.chainParent = undefined - node.payload.parentNode = undefined + completeDetachment(node) } break case 'Phase': { @@ -271,8 +268,7 @@ function newWorkspace () { } } payload.parentNode.phases.splice(i, 1) - payload.parentNode = undefined - payload.chainParent = undefined + completeDetachment(node) return } } @@ -286,6 +282,7 @@ function newWorkspace () { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode node.payload.parentNode.strategies.push(node) + completeAttachment(node) } break case 'Phase': { @@ -299,6 +296,7 @@ function newWorkspace () { node.payload.chainParent = attachToNode } attachToNode.phases.push(node) + completeAttachment(node) } break case 'Take Profit': { @@ -310,6 +308,7 @@ function newWorkspace () { node.payload.chainParent = attachToNode } attachToNode.phases.push(node) + completeAttachment(node) } break case 'Phase': { @@ -320,11 +319,13 @@ function newWorkspace () { if (i === node.payload.parentNode.phases.length - 1) { node.payload.chainParent = attachToNode node.payload.parentNode.phases.push(node) + completeAttachment(node) } else { node.payload.chainParent = attachToNode let nextPhase = node.payload.parentNode.phases[i + 1] nextPhase.payload.chainParent = node node.payload.parentNode.phases.splice(i + 1, 0, node) + completeAttachment(node) return } } @@ -337,17 +338,35 @@ function newWorkspace () { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode node.payload.parentNode.situations.push(node) + completeAttachment(node) } break case 'Condition': { node.payload.parentNode = attachToNode node.payload.chainParent = attachToNode node.payload.parentNode.conditions.push(node) + completeAttachment(node) } break } } + function completeDetachment (node) { + node.payload.parentNode = undefined + node.payload.chainParent = undefined + rootNodes.push(node) + } + + function completeAttachment (node) { + for (let i = 0; i < rootNodes.length; i++) { + let rootNode = rootNodes[i] + if (rootNode.id === node.id) { + rootNodes.splice(i, 1) + return + } + } + } + function createPart (partType, name, node, parentNode, chainParent, title) { let payload = {} From 3203398b575527792dec27708da30b04cb53bd74 Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 24 May 2019 20:28:36 -0300 Subject: [PATCH 08/18] Removing sessionToken --- Dashboard.js | 3 --- StrategySpace/StrategizerGateway.js | 2 -- TopSpace/CurrentEvent.js | 12 ++++++------ TopSpace/Login.js | 12 +++--------- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/Dashboard.js b/Dashboard.js index 663c7cfa6..773606797 100644 --- a/Dashboard.js +++ b/Dashboard.js @@ -120,7 +120,6 @@ function newDashboard () { isTrader avatarHandle avatarChangeDate - sessionToken role { id } @@ -136,8 +135,6 @@ function newDashboard () { } }) .then(response => { - sessionToken = response.data.users_UserByAuthId.sessionToken; - window.localStorage.setItem('loggedInUser', JSON.stringify(response.data.users_UserByAuthId)); resolve({ user: response.data.users_UserByAuthId }) }) diff --git a/StrategySpace/StrategizerGateway.js b/StrategySpace/StrategizerGateway.js index 26db512ec..60d4cff73 100644 --- a/StrategySpace/StrategizerGateway.js +++ b/StrategySpace/StrategizerGateway.js @@ -262,8 +262,6 @@ function newStrategizerGateway () { const authId = user.authId - let sessionToken - const apolloClient = new Apollo.lib.ApolloClient({ networkInterface: Apollo.lib.createNetworkInterface({ uri: window.canvasApp.graphQL.masterAppApiUrl, diff --git a/TopSpace/CurrentEvent.js b/TopSpace/CurrentEvent.js index b2831e277..29b9b1ab7 100644 --- a/TopSpace/CurrentEvent.js +++ b/TopSpace/CurrentEvent.js @@ -86,9 +86,9 @@ function newCurrentEvent () { return thisObject function initialize (pSharedStatus) { - let sessionToken = window.localStorage.getItem('sessionToken') + let accessToken = window.localStorage.getItem('access_token') - if (sessionToken === null || sessionToken === '') { + if (accessToken === null || accessToken === '') { /* not logged in */ return } @@ -126,9 +126,9 @@ function newCurrentEvent () { } function onClick () { - let sessionToken = window.localStorage.getItem('sessionToken') + let accessToken = window.localStorage.getItem('access_token') - if (sessionToken === null || sessionToken === '') { + if (accessToken === null || accessToken === '') { /* not logged in */ return } @@ -169,9 +169,9 @@ function newCurrentEvent () { } function draw () { - let sessionToken = window.localStorage.getItem('sessionToken') + let accessToken = window.localStorage.getItem('access_token') - if (sessionToken === null || sessionToken === '') { + if (accessToken === null || accessToken === '') { /* not logged in */ return } diff --git a/TopSpace/Login.js b/TopSpace/Login.js index 61aa996c1..c5a8a58af 100644 --- a/TopSpace/Login.js +++ b/TopSpace/Login.js @@ -44,7 +44,6 @@ function newLogin () { // if there is no user that means that we are logged off, which means it is time to clean the local storage of things from the last log in. window.localStorage.removeItem('loggedInUser') - window.localStorage.removeItem('sessionToken') return } @@ -52,8 +51,6 @@ function newLogin () { const authId = user.authId - let sessionToken - const apolloClient = new Apollo.lib.ApolloClient({ networkInterface: Apollo.lib.createNetworkInterface({ uri: window.canvasApp.graphQL.masterAppApiUrl, @@ -79,7 +76,6 @@ function newLogin () { isTrader avatarHandle avatarChangeDate - sessionToken role { id } @@ -95,8 +91,6 @@ function newLogin () { } }) .then(response => { - sessionToken = response.data.users_UserByAuthId.sessionToken - window.localStorage.setItem('loggedInUser', JSON.stringify(response.data.users_UserByAuthId)) resolve({ user: response.data.users_UserByAuthId}) }) @@ -342,9 +336,10 @@ function newLogin () { thisObject.container.eventHandler.listenToEvent('onMouseClick', onClick) async function authenticateUser () { - if (sessionToken === undefined) { sessionToken = '' } + // TODO USER_PROFILE should be retrieved from saweb-api ecosystem + return - let path = window.canvasApp.urlPrefix + 'AABrowserAPI/authenticateUser/' + sessionToken + let path = window.canvasApp.urlPrefix + 'AABrowserAPI/authenticateUser/' return new Promise( function (resolve, reject) { @@ -359,7 +354,6 @@ function newLogin () { } window.USER_PROFILE = responseFromServer.userProfile - window.localStorage.setItem('sessionToken', sessionToken) currentLabel = 'Logged In' resolve() From 40095a0fe30464f040a72cd735df23f6f23119a0 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 09:11:14 +0200 Subject: [PATCH 09/18] Adding the possibility of any Trading System to RUN --- FloatingSpace/StrategyPart.js | 39 ++++++++++++++++++++++++ FloatingSpace/StrategyPartConstructor.js | 22 +++++++++---- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 72e44ef31..bfd25b6e4 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -17,6 +17,8 @@ function newStrategyPart () { codeEditor: undefined, partTitle: undefined, isExecuting: undefined, + isRunning: undefined, + run: run, getReadyToAttach: getReadyToAttach, showAvailabilityToAttach: showAvailabilityToAttach, highlight: highlight, @@ -50,6 +52,7 @@ function newStrategyPart () { let isHighlighted let highlightCounter = 0 + let runningCounter = 0 let previousDistance @@ -160,6 +163,7 @@ function newStrategyPart () { } iconPhysics() + runningPhisycs() highlightPhisycs() detachingPhysics() attachingPhysics() @@ -292,6 +296,25 @@ function newStrategyPart () { // highlightCounter = 0 } + function runningPhisycs () { + if (canvas.strategySpace.workspace.tradingSystem !== undefined) { + if (canvas.strategySpace.workspace.tradingSystem.id !== thisObject.payload.node.id) { + runningCounter-- + } + } + + if (runningCounter < 0) { + runningCounter = 0 + thisObject.isRunning = false + } + } + + function run () { + canvas.strategySpace.workspace.tradingSystem = thisObject.payload.node + isRunning = true + runningCounter = 30 + } + function iconPhysics () { icon = canvas.strategySpace.iconByPartType.get(thisObject.payload.node.type) executingIcon = canvas.strategySpace.iconCollection.get('attractive') @@ -556,6 +579,21 @@ function newStrategyPart () { browserCanvasContext.fill() + if (thisObject.isRunning === true) { + VISIBLE_RADIUS = thisObject.container.frame.radius * 2 + let OPACITY = runningCounter / 30 + + browserCanvasContext.beginPath() + browserCanvasContext.arc(visiblePosition.x, visiblePosition.y, VISIBLE_RADIUS, 0, Math.PI * 2, true) + browserCanvasContext.closePath() + + browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.RUSTED_RED + ', ' + OPACITY + ')' + + browserCanvasContext.lineWidth = 10 + browserCanvasContext.setLineDash([4, 20]) + browserCanvasContext.stroke() + } + if (isHighlighted === true) { VISIBLE_RADIUS = thisObject.container.frame.radius let OPACITY = highlightCounter / 30 @@ -630,3 +668,4 @@ function newStrategyPart () { } } } + diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index bee92f260..7b177e844 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -6,12 +6,10 @@ function newStrategyPartConstructor () { logger.fileName = MODULE_NAME let thisObject = { - createStrategyPart: createStrategyPart, destroyStrategyPart: destroyStrategyPart, initialize: initialize, finalize: finalize - } let floatingLayer @@ -50,12 +48,12 @@ function newStrategyPartConstructor () { } let strategyPart = newStrategyPart() + payload.uiObject = strategyPart strategyPart.fitFunction = canvas.floatingSpace.fitIntoVisibleArea strategyPart.isVisibleFunction = canvas.floatingSpace.isThisPointVisible let menuItemsInitialValues = getMenuItemsInitialValues(strategyPart, floatingObject, payload) strategyPart.initialize(payload, menuItemsInitialValues) strategyPart.container.connectToParent(floatingObject.container, false, false, true, true, false, false, true, true, true, true, true) - payload.uiObject = strategyPart setFloatingObjectBasicProperties(floatingObject, payload) @@ -85,6 +83,18 @@ function newStrategyPartConstructor () { currentRadius: 0, angle: -135 }, + { + action: 'Run Trading System', + actionFunction: payload.uiObject.run, + label: 'Run', + visible: false, + iconPathOn: 'paper-plane', + iconPathOff: 'upload', + rawRadius: 8, + targetRadius: 0, + currentRadius: 0, + angle: -60 + }, { action: 'Save Trading System', actionFunction: payload.onMenuItemClick, @@ -98,7 +108,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: -40 + angle: -20 }, { action: 'New Strategy', @@ -111,7 +121,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 0 + angle: 20 }, { action: 'Download', @@ -123,7 +133,7 @@ function newStrategyPartConstructor () { rawRadius: 8, targetRadius: 0, currentRadius: 0, - angle: 40 + angle: 60 }] break } From 07d2e6abbe060e932274ae7204575a5fd1ab9f63 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 09:18:03 +0200 Subject: [PATCH 10/18] Bug Fixed: thisObject missing --- FloatingSpace/StrategyPart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index bfd25b6e4..c48692e74 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -311,7 +311,7 @@ function newStrategyPart () { function run () { canvas.strategySpace.workspace.tradingSystem = thisObject.payload.node - isRunning = true + thisObject.isRunning = true runningCounter = 30 } From efd529f696367523f1784e274525b3fa2a0ec3b3 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 09:45:05 +0200 Subject: [PATCH 11/18] Calling Restart Button from Run Menu Item done --- CockpitSpace/RestartSimulation.js | 7 ++++++- FloatingSpace/StrategyPart.js | 2 +- FloatingSpace/StrategyPartConstructor.js | 9 ++++++++- StrategySpace/Workspace.js | 2 +- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CockpitSpace/RestartSimulation.js b/CockpitSpace/RestartSimulation.js index 97a494a7a..8629efc83 100644 --- a/CockpitSpace/RestartSimulation.js +++ b/CockpitSpace/RestartSimulation.js @@ -6,6 +6,7 @@ function newRestartSimulation () { visible: true, container: undefined, status: undefined, + restart: restart, physics: physics, draw: draw, getContainer: getContainer, @@ -73,7 +74,11 @@ function newRestartSimulation () { isMouseOver = false } - async function onMouseClick (event) { + function onMouseClick (event) { + restart() + } + + async function restart () { let dateAtScreenCorner = new Date(window.localStorage.getItem('Date @ Screen Corner')) let currentTimePeriod = JSON.parse(window.localStorage.getItem('Current Time Period')) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index c48692e74..b31507392 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -311,6 +311,7 @@ function newStrategyPart () { function run () { canvas.strategySpace.workspace.tradingSystem = thisObject.payload.node + canvas.cockpitSpace.restartSimulation.restart() thisObject.isRunning = true runningCounter = 30 } @@ -668,4 +669,3 @@ function newStrategyPart () { } } } - diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 7b177e844..78a5795dc 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -44,7 +44,6 @@ function newStrategyPartConstructor () { if (payload.node.savedPayload.floatingObject.isPinned === true) { floatingObject.pinToggle() } - payload.node.savedPayload = undefined } let strategyPart = newStrategyPart() @@ -55,6 +54,14 @@ function newStrategyPartConstructor () { strategyPart.initialize(payload, menuItemsInitialValues) strategyPart.container.connectToParent(floatingObject.container, false, false, true, true, false, false, true, true, true, true, true) + if (payload.node.savedPayload !== undefined) { + if (payload.node.savedPayload.uiObject.isRunning === true) { + strategyPart.isRunning = true + canvas.strategySpace.workspace.tradingSystem = payload.node + } + } + payload.node.savedPayload = undefined + setFloatingObjectBasicProperties(floatingObject, payload) floatingLayer.addFloatingObject(floatingObject) diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index 8a7f4daae..994499089 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -1094,7 +1094,7 @@ function newWorkspace () { isPinned: node.payload.floatingObject.isPinned }, uiObject: { - + isRunning: node.payload.uiObject.isRunning } } return savedPayload From 2046a96dc564daf258ae4ed2643f8d717f0199a8 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 09:55:31 +0200 Subject: [PATCH 12/18] Getting Saved Running Status Working --- FloatingSpace/StrategyPart.js | 5 +++++ FloatingSpace/StrategyPartConstructor.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index b31507392..1226b4fd0 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -19,6 +19,7 @@ function newStrategyPart () { isExecuting: undefined, isRunning: undefined, run: run, + setRunningStatus: setRunningStatus, getReadyToAttach: getReadyToAttach, showAvailabilityToAttach: showAvailabilityToAttach, highlight: highlight, @@ -312,6 +313,10 @@ function newStrategyPart () { function run () { canvas.strategySpace.workspace.tradingSystem = thisObject.payload.node canvas.cockpitSpace.restartSimulation.restart() + setRunningStatus() + } + + function setRunningStatus () { thisObject.isRunning = true runningCounter = 30 } diff --git a/FloatingSpace/StrategyPartConstructor.js b/FloatingSpace/StrategyPartConstructor.js index 78a5795dc..2ea714253 100644 --- a/FloatingSpace/StrategyPartConstructor.js +++ b/FloatingSpace/StrategyPartConstructor.js @@ -56,7 +56,7 @@ function newStrategyPartConstructor () { if (payload.node.savedPayload !== undefined) { if (payload.node.savedPayload.uiObject.isRunning === true) { - strategyPart.isRunning = true + strategyPart.setRunningStatus() canvas.strategySpace.workspace.tradingSystem = payload.node } } From e05085b8ed2d581bddcc1b206dec5823e8c95714 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 10:21:37 +0200 Subject: [PATCH 13/18] Bug Fixed: Trading System Marked as Running when loaded from strategizer --- StrategySpace/Workspace.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index 994499089..c3ae5075a 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -50,6 +50,8 @@ function newWorkspace () { } rootNodes.push(adaptedTradingSystem) generateStrategyParts(adaptedTradingSystem) + thisObject.tradingSystem = adaptedTradingSystem + thisObject.tradingSystem.payload.uiObject.setRunningStatus() } else { rootNodes = JSON.parse(savedWorkspace) for (let i = 0; i < rootNodes.length; i++) { From b079bf1befacbf1aecca49d8604379a47fe6f9eb Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 10:52:09 +0200 Subject: [PATCH 14/18] Storing IdAtStrategizer across sessions --- CockpitSpace/RestartSimulation.js | 2 +- Spaces/CockpitSpace.js | 4 ++- Spaces/StrategySpace.js | 16 ++---------- StrategySpace/StrategizerGateway.js | 6 +++-- StrategySpace/Workspace.js | 38 +++++++++++++++++++---------- 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/CockpitSpace/RestartSimulation.js b/CockpitSpace/RestartSimulation.js index 8629efc83..530dff1cb 100644 --- a/CockpitSpace/RestartSimulation.js +++ b/CockpitSpace/RestartSimulation.js @@ -108,7 +108,7 @@ function newRestartSimulation () { } try { thisObject.status = 'Saving' - let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer(canvas.strategySpace.workspace.tradingSystem) + let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer() if (result === true) { thisObject.status = 'Restarting' await graphQlRestartSimulation(simulationParams) diff --git a/Spaces/CockpitSpace.js b/Spaces/CockpitSpace.js index 92cb0e922..9de6a2eb1 100644 --- a/Spaces/CockpitSpace.js +++ b/Spaces/CockpitSpace.js @@ -47,7 +47,9 @@ thisObject.container.frame.position.x = 0 let INITIAL_POSITION - if (canvas.strategySpace.isInitialized === true) { + const accessToken = window.localStorage.getItem(LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY) + + if (accessToken !== null) { INITIAL_POSITION = 55 } else { INITIAL_POSITION = 100 diff --git a/Spaces/StrategySpace.js b/Spaces/StrategySpace.js index b754ba5f7..3685ae89b 100644 --- a/Spaces/StrategySpace.js +++ b/Spaces/StrategySpace.js @@ -8,7 +8,6 @@ function newStrategySpace () { iconCollection: undefined, iconByPartType: undefined, workspace: undefined, - isInitialized: false, physics: physics, draw: draw, getContainer: getContainer, @@ -35,19 +34,8 @@ function newStrategySpace () { thisObject.strategizerGateway = newStrategizerGateway() thisObject.strategizerGateway.initialize() - let savedWorkspace = window.localStorage.getItem('workspace') - if (savedWorkspace === null) { - await thisObject.strategizerGateway.loadFromStrategyzer() - if (thisObject.strategizerGateway.strategizerData !== undefined) { - thisObject.isInitialized = true - thisObject.workspace = newWorkspace() - thisObject.workspace.initialize(thisObject.strategizerGateway.strategizerData) - } - } else { - thisObject.isInitialized = true - thisObject.workspace = newWorkspace() - thisObject.workspace.initialize() - } + thisObject.workspace = newWorkspace() + thisObject.workspace.initialize() } function buildIconByPartTypeMap () { diff --git a/StrategySpace/StrategizerGateway.js b/StrategySpace/StrategizerGateway.js index a742b2b7d..783eada72 100644 --- a/StrategySpace/StrategizerGateway.js +++ b/StrategySpace/StrategizerGateway.js @@ -36,7 +36,7 @@ function newStrategizerGateway () { } - async function saveToStrategyzer (tradingSystem) { + async function saveToStrategyzer () { try { const accessToken = window.localStorage.getItem(LOGGED_IN_ACCESS_TOKEN_LOCAL_STORAGE_KEY) @@ -73,6 +73,8 @@ function newStrategizerGateway () { } }]) + let tradingSystem = canvas.strategySpace.workspace.tradingSystem + let idAtStrategizer = canvas.strategySpace.workspace.idAtStrategizer let dataToSave = buildGraphQLDataToSave(tradingSystem) const updateStrategies = () => { @@ -80,7 +82,7 @@ function newStrategizerGateway () { apolloClient.mutate({ mutation: GRAPHQL_MUTATION_UPDATE_STRATEGIES, variables: { - id: tradingSystem.id, + id: idAtStrategizer, strategy: dataToSave.strategy } }) diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index c3ae5075a..cab7f2e69 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -5,6 +5,7 @@ function newWorkspace () { let thisObject = { tradingSystem: undefined, container: undefined, + idAtStrategizer: undefined, physics: physics, spawn: spawn, detachNode: detachNode, @@ -41,19 +42,26 @@ function newWorkspace () { thisObject.container = undefined } - function initialize (tradingSystem) { - let savedWorkspace = window.localStorage.getItem('workspace') + function initialize () { + + let savedWorkspace = window.localStorage.getItem('xxxworkspace') if (savedWorkspace === null) { - let adaptedTradingSystem = { - id: tradingSystem.id, - strategies: tradingSystem.subStrategies + await canvas.strategySpace.strategizerGateway.loadFromStrategyzer() + let tradingSystem = canvas.strategySpace.strategizerGateway.strategizerData + if (tradingSystem !== undefined) { + let adaptedTradingSystem = { + strategies: tradingSystem.subStrategies + } + thisObject.idAtStrategizer = tradingSystem.id + rootNodes.push(adaptedTradingSystem) + generateStrategyParts(adaptedTradingSystem) + thisObject.tradingSystem = adaptedTradingSystem + thisObject.tradingSystem.payload.uiObject.setRunningStatus() } - rootNodes.push(adaptedTradingSystem) - generateStrategyParts(adaptedTradingSystem) - thisObject.tradingSystem = adaptedTradingSystem - thisObject.tradingSystem.payload.uiObject.setRunningStatus() - } else { - rootNodes = JSON.parse(savedWorkspace) + } else { + workspace = JSON.parse(savedWorkspace) + rootNodes = workspace.rootNodes + thisObject.idAtStrategizer = workspace.idAtStrategizer for (let i = 0; i < rootNodes.length; i++) { let rootNode = rootNodes[i] createPartFromNode(rootNode, undefined, undefined) @@ -73,7 +81,11 @@ function newWorkspace () { let workspaceNode = getWorkspaceNode(rootNode) stringifyReadyNodes.push(workspaceNode) } - let textToSave = JSON.stringify(stringifyReadyNodes) + let workspace = { + idAtStrategizer: thisObject.idAtStrategizer, + rootNodes: stringifyReadyNodes + } + let textToSave = JSON.stringify(workspace) window.localStorage.setItem('workspace', textToSave) } @@ -513,7 +525,7 @@ function newWorkspace () { switch (action) { case 'Save Trading System': { - let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer(canvas.strategySpace.workspace.tradingSystem) + let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer() return result break } From ae2a99c0c37cf4d7627a1f57fa3f95251403e3d8 Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 10:57:33 +0200 Subject: [PATCH 15/18] Saving Multiple Strategies Working --- StrategySpace/Workspace.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index cab7f2e69..373dad186 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -42,9 +42,8 @@ function newWorkspace () { thisObject.container = undefined } - function initialize () { - - let savedWorkspace = window.localStorage.getItem('xxxworkspace') + async function initialize () { + let savedWorkspace = window.localStorage.getItem('workspace') if (savedWorkspace === null) { await canvas.strategySpace.strategizerGateway.loadFromStrategyzer() let tradingSystem = canvas.strategySpace.strategizerGateway.strategizerData @@ -58,7 +57,7 @@ function newWorkspace () { thisObject.tradingSystem = adaptedTradingSystem thisObject.tradingSystem.payload.uiObject.setRunningStatus() } - } else { + } else { workspace = JSON.parse(savedWorkspace) rootNodes = workspace.rootNodes thisObject.idAtStrategizer = workspace.idAtStrategizer From 684b00b132168431d960776205b39d024ba66f4c Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 11:10:21 +0200 Subject: [PATCH 16/18] Protection for idAtStrategizer not present at local storage --- StrategySpace/Workspace.js | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index 373dad186..803decfad 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -45,29 +45,37 @@ function newWorkspace () { async function initialize () { let savedWorkspace = window.localStorage.getItem('workspace') if (savedWorkspace === null) { - await canvas.strategySpace.strategizerGateway.loadFromStrategyzer() - let tradingSystem = canvas.strategySpace.strategizerGateway.strategizerData - if (tradingSystem !== undefined) { - let adaptedTradingSystem = { - strategies: tradingSystem.subStrategies - } - thisObject.idAtStrategizer = tradingSystem.id - rootNodes.push(adaptedTradingSystem) - generateStrategyParts(adaptedTradingSystem) - thisObject.tradingSystem = adaptedTradingSystem - thisObject.tradingSystem.payload.uiObject.setRunningStatus() - } + initializeLoadingFromStrategizer() } else { workspace = JSON.parse(savedWorkspace) rootNodes = workspace.rootNodes thisObject.idAtStrategizer = workspace.idAtStrategizer - for (let i = 0; i < rootNodes.length; i++) { - let rootNode = rootNodes[i] - createPartFromNode(rootNode, undefined, undefined) + if (thisObject.idAtStrategizer === undefined) { + initializeLoadingFromStrategizer() + } else { + for (let i = 0; i < rootNodes.length; i++) { + let rootNode = rootNodes[i] + createPartFromNode(rootNode, undefined, undefined) + } } } } + async function initializeLoadingFromStrategizer () { + await canvas.strategySpace.strategizerGateway.loadFromStrategyzer() + let tradingSystem = canvas.strategySpace.strategizerGateway.strategizerData + if (tradingSystem !== undefined) { + let adaptedTradingSystem = { + strategies: tradingSystem.subStrategies + } + thisObject.idAtStrategizer = tradingSystem.id + rootNodes.push(adaptedTradingSystem) + generateStrategyParts(adaptedTradingSystem) + thisObject.tradingSystem = adaptedTradingSystem + thisObject.tradingSystem.payload.uiObject.setRunningStatus() + } + } + function getContainer (point) { } From b40019068e799ecfef7ac50b74ee8dd5cde57f1e Mon Sep 17 00:00:00 2001 From: Luis Fernando Molina Date: Sat, 25 May 2019 11:44:58 +0200 Subject: [PATCH 17/18] Trading System Title always visible --- FloatingSpace/StrategyPart.js | 3 ++- FloatingSpace/StrategyPartTitle.js | 3 ++- StrategySpace/Workspace.js | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/FloatingSpace/StrategyPart.js b/FloatingSpace/StrategyPart.js index 1226b4fd0..8076cb23c 100644 --- a/FloatingSpace/StrategyPart.js +++ b/FloatingSpace/StrategyPart.js @@ -482,7 +482,7 @@ function newStrategyPart () { labelPoint = { x: position.x - label.length / 2 * fontSize * FONT_ASPECT_RATIO - 5, - y: position.y + radius * 2 / 3 + fontSize * FONT_ASPECT_RATIO + 15 + y: position.y + radius * 4 / 5 + fontSize * FONT_ASPECT_RATIO + 15 } browserCanvasContext.font = fontSize + 'px ' + UI_FONT.PRIMARY @@ -674,3 +674,4 @@ function newStrategyPart () { } } } + diff --git a/FloatingSpace/StrategyPartTitle.js b/FloatingSpace/StrategyPartTitle.js index 296b05772..865b1039b 100644 --- a/FloatingSpace/StrategyPartTitle.js +++ b/FloatingSpace/StrategyPartTitle.js @@ -49,6 +49,7 @@ function newStrategyPartTitle () { switch (payload.node.type) { case 'Trading System': { + thisObject.allwaysVisible = true break } case 'Strategy': { @@ -116,7 +117,7 @@ function newStrategyPartTitle () { const FRAME_HEIGHT = 25 const FRAME_WIDTH = title.length / 2 * thisObject.payload.floatingObject.currentFontSize * FONT_ASPECT_RATIO * 1.2 * 2 thisObject.container.frame.position.x = 0 - FRAME_WIDTH / 2 - thisObject.container.frame.position.y = 0 - thisObject.container.frame.radius * 1 / 2 - thisObject.payload.floatingObject.currentFontSize * FONT_ASPECT_RATIO - 10 - FRAME_HEIGHT + thisObject.container.frame.position.y = 0 - thisObject.container.frame.radius * 1 / 2 - thisObject.payload.floatingObject.currentFontSize * FONT_ASPECT_RATIO - 20 - FRAME_HEIGHT thisObject.container.frame.width = FRAME_WIDTH thisObject.container.frame.height = FRAME_HEIGHT diff --git a/StrategySpace/Workspace.js b/StrategySpace/Workspace.js index 803decfad..180c97dec 100644 --- a/StrategySpace/Workspace.js +++ b/StrategySpace/Workspace.js @@ -391,6 +391,7 @@ function newWorkspace () { function createPart (partType, name, node, parentNode, chainParent, title) { let payload = {} + if (name === '' || name === undefined) { name = 'My ' + partType } if (node.savedPayload !== undefined) { payload.targetPosition = { x: node.savedPayload.targetPosition.x, @@ -440,7 +441,7 @@ function newWorkspace () { let lastPhase let tradingSystem = node - createPart('Trading System', '', tradingSystem, undefined, undefined) + createPart('Trading System', tradingSystem.name, tradingSystem, undefined, undefined) for (m = 0; m < tradingSystem.strategies.length; m++) { let strategy = tradingSystem.strategies[m] From 7c01cd19a38f8d2b53fade39d56e0db9bb611993 Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 24 May 2019 20:28:36 -0300 Subject: [PATCH 18/18] Removing sessionToken --- Dashboard.js | 3 --- StrategySpace/StrategizerGateway.js | 2 -- TopSpace/CurrentEvent.js | 12 ++++++------ TopSpace/Login.js | 12 +++--------- 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/Dashboard.js b/Dashboard.js index 663c7cfa6..773606797 100644 --- a/Dashboard.js +++ b/Dashboard.js @@ -120,7 +120,6 @@ function newDashboard () { isTrader avatarHandle avatarChangeDate - sessionToken role { id } @@ -136,8 +135,6 @@ function newDashboard () { } }) .then(response => { - sessionToken = response.data.users_UserByAuthId.sessionToken; - window.localStorage.setItem('loggedInUser', JSON.stringify(response.data.users_UserByAuthId)); resolve({ user: response.data.users_UserByAuthId }) }) diff --git a/StrategySpace/StrategizerGateway.js b/StrategySpace/StrategizerGateway.js index 783eada72..1e06d799b 100644 --- a/StrategySpace/StrategizerGateway.js +++ b/StrategySpace/StrategizerGateway.js @@ -264,8 +264,6 @@ function newStrategizerGateway () { const authId = user.authId - let sessionToken - const apolloClient = new Apollo.lib.ApolloClient({ networkInterface: Apollo.lib.createNetworkInterface({ uri: window.canvasApp.graphQL.masterAppApiUrl, diff --git a/TopSpace/CurrentEvent.js b/TopSpace/CurrentEvent.js index b2831e277..29b9b1ab7 100644 --- a/TopSpace/CurrentEvent.js +++ b/TopSpace/CurrentEvent.js @@ -86,9 +86,9 @@ function newCurrentEvent () { return thisObject function initialize (pSharedStatus) { - let sessionToken = window.localStorage.getItem('sessionToken') + let accessToken = window.localStorage.getItem('access_token') - if (sessionToken === null || sessionToken === '') { + if (accessToken === null || accessToken === '') { /* not logged in */ return } @@ -126,9 +126,9 @@ function newCurrentEvent () { } function onClick () { - let sessionToken = window.localStorage.getItem('sessionToken') + let accessToken = window.localStorage.getItem('access_token') - if (sessionToken === null || sessionToken === '') { + if (accessToken === null || accessToken === '') { /* not logged in */ return } @@ -169,9 +169,9 @@ function newCurrentEvent () { } function draw () { - let sessionToken = window.localStorage.getItem('sessionToken') + let accessToken = window.localStorage.getItem('access_token') - if (sessionToken === null || sessionToken === '') { + if (accessToken === null || accessToken === '') { /* not logged in */ return } diff --git a/TopSpace/Login.js b/TopSpace/Login.js index 61aa996c1..c5a8a58af 100644 --- a/TopSpace/Login.js +++ b/TopSpace/Login.js @@ -44,7 +44,6 @@ function newLogin () { // if there is no user that means that we are logged off, which means it is time to clean the local storage of things from the last log in. window.localStorage.removeItem('loggedInUser') - window.localStorage.removeItem('sessionToken') return } @@ -52,8 +51,6 @@ function newLogin () { const authId = user.authId - let sessionToken - const apolloClient = new Apollo.lib.ApolloClient({ networkInterface: Apollo.lib.createNetworkInterface({ uri: window.canvasApp.graphQL.masterAppApiUrl, @@ -79,7 +76,6 @@ function newLogin () { isTrader avatarHandle avatarChangeDate - sessionToken role { id } @@ -95,8 +91,6 @@ function newLogin () { } }) .then(response => { - sessionToken = response.data.users_UserByAuthId.sessionToken - window.localStorage.setItem('loggedInUser', JSON.stringify(response.data.users_UserByAuthId)) resolve({ user: response.data.users_UserByAuthId}) }) @@ -342,9 +336,10 @@ function newLogin () { thisObject.container.eventHandler.listenToEvent('onMouseClick', onClick) async function authenticateUser () { - if (sessionToken === undefined) { sessionToken = '' } + // TODO USER_PROFILE should be retrieved from saweb-api ecosystem + return - let path = window.canvasApp.urlPrefix + 'AABrowserAPI/authenticateUser/' + sessionToken + let path = window.canvasApp.urlPrefix + 'AABrowserAPI/authenticateUser/' return new Promise( function (resolve, reject) { @@ -359,7 +354,6 @@ function newLogin () { } window.USER_PROFILE = responseFromServer.userProfile - window.localStorage.setItem('sessionToken', sessionToken) currentLabel = 'Logged In' resolve()