Merge pull request #76 from AAMasters/develop

Workspace download & upload
This commit is contained in:
benme authored and GitHub committed 2019-06-29 14:57:21 -03:00
commit 7c4943e019
12 files changed
+334 -110

No files matched your search

+1
View File
@@ -67,6 +67,7 @@ function newCircularMenu () {
menuItem.currentStatus = menuItemInitialValue.currentStatus
menuItem.relatedStrategyPart = menuItemInitialValue.relatedStrategyPart
menuItem.dontShowAtFullscreen = menuItemInitialValue.dontShowAtFullscreen
menuItem.askConfirmation = menuItemInitialValue.askConfirmation
if (menuItem.label === undefined) {
menuItem.type = 'Icon Only'
+10 -1
View File
@@ -5,6 +5,7 @@ function newCircularMenuItem () {
let thisObject = {
type: undefined,
isDeployed: undefined,
askConfirmation: undefined,
iconOn: undefined,
iconOff: undefined,
currentIcon: undefined,
@@ -170,7 +171,7 @@ function newCircularMenuItem () {
}
async function onMouseClick (event) {
if (temporaryStatus === 0) {
if (temporaryStatus === 0 && thisObject.askConfirmation !== true) {
if (thisObject.workingLabel !== undefined) {
setTemporaryStatus(thisObject.workingLabel, UI_COLOR.GREY, 500)
}
@@ -187,6 +188,14 @@ function newCircularMenuItem () {
}
}
}
if (temporaryStatus > 0 && thisObject.askConfirmation === true) {
thisObject.currentStatus = await thisObject.actionFunction(thisObject.payload, thisObject.action)
}
if (temporaryStatus === 0 && thisObject.askConfirmation === true) {
setTemporaryStatus('Confirm to Delete', UI_COLOR.GREY, 50)
}
}
function setTemporaryStatus (text, backgroundColor, waitingCycles) {
+15 -6
View File
@@ -34,7 +34,7 @@ function newFloatingObject () {
initializeRadius: initializeRadius,
initializeImageSize: initializeImageSize,
initializeFontSize: initializeFontSize,
radomizeCurrentPosition: radomizeCurrentPosition,
initializeCurrentPosition: initializeCurrentPosition,
radomizeCurrentSpeed: radomizeCurrentSpeed,
drawBackground: drawBackground,
drawMiddleground: drawMiddleground,
@@ -89,7 +89,7 @@ function newFloatingObject () {
/* Assign a position and speed */
thisObject.radomizeCurrentPosition(thisObject.payload.targetPosition)
thisObject.initializeCurrentPosition(thisObject.payload.targetPosition)
thisObject.radomizeCurrentSpeed()
}
@@ -297,10 +297,19 @@ function newFloatingObject () {
thisObject.currentFontSize = size / 3
}
function radomizeCurrentPosition (arroundPoint) {
let position = {
x: Math.floor((Math.random() * (200) - 100)) + arroundPoint.x,
y: Math.floor((Math.random() * (200) - 100)) + arroundPoint.y
function initializeCurrentPosition (arroundPoint) {
let position
if (thisObject.payload.position === undefined) {
position = {
x: Math.floor((Math.random() * (200) - 100)) + arroundPoint.x,
y: Math.floor((Math.random() * (200) - 100)) + arroundPoint.y
}
} else {
position = {
x: thisObject.payload.position.x,
y: thisObject.payload.position.y
}
}
setPosition(position)
+1 -1
View File
@@ -849,7 +849,7 @@ function newStrategyPart () {
browserCanvasContext.arc(visiblePosition.x, visiblePosition.y, VISIBLE_RADIUS, 0, Math.PI * 2, true)
browserCanvasContext.closePath()
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.TURQUOISE + ', ' + OPACITY + ')'
browserCanvasContext.strokeStyle = 'rgba(' + UI_COLOR.LIGHT_GREY + ', ' + OPACITY + ')'
browserCanvasContext.lineWidth = 10
browserCanvasContext.setLineDash([4, 20])
+71
View File
@@ -79,6 +79,52 @@ function newStrategyPartConstructor () {
function getMenuItemsInitialValues (strategyPart, floatingObject, payload) {
let menuItemsInitialValues = []
switch (payload.node.type) {
case 'Workspace': {
floatingObject.isPinned = true
floatingObject.positionLocked = true
menuItemsInitialValues = [
{
action: 'Pin / Unpin',
actionFunction: floatingObject.pinToggle,
actionStatus: floatingObject.getPinStatus,
currentStatus: true,
label: undefined,
visible: false,
iconPathOn: 'target',
iconPathOff: 'security',
rawRadius: 8,
targetRadius: 0,
currentRadius: 0,
angle: -135
},
{
action: 'Freeze / Unfreeze',
actionFunction: floatingObject.freezeToggle,
actionStatus: floatingObject.getFreezeStatus,
currentStatus: true,
label: undefined,
visible: false,
iconPathOn: 'broken-link',
iconPathOff: 'targeting',
rawRadius: 8,
targetRadius: 0,
currentRadius: 0,
angle: 135
},
{
action: 'Download Workspace',
actionFunction: payload.onMenuItemClick,
label: 'Download',
visible: false,
iconPathOn: 'upload',
iconPathOff: 'upload',
rawRadius: 8,
targetRadius: 0,
currentRadius: 0,
angle: 0
}]
break
}
case 'Trading System': {
floatingObject.isPinned = true
floatingObject.positionLocked = true
@@ -140,6 +186,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Trading System',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete Trading System',
visible: false,
@@ -222,6 +269,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Parameters',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete Parameters',
visible: false,
@@ -290,6 +338,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Base Asset',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete Base Asset',
visible: false,
@@ -371,6 +420,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Strategy',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Strategy',
visible: false,
@@ -452,6 +502,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Trigger Stage',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Stage',
visible: false,
@@ -520,6 +571,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Open Stage',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Stage',
visible: false,
@@ -588,6 +640,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Manage Stage',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Stage',
visible: false,
@@ -644,6 +697,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Close Stage',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Stage',
visible: false,
@@ -700,6 +754,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Position Size',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete Trading System',
visible: false,
@@ -782,6 +837,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Event',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Event',
visible: false,
@@ -851,6 +907,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Event',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Event',
visible: false,
@@ -920,6 +977,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Event',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Event',
visible: false,
@@ -988,6 +1046,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Initial Definition',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Definition',
visible: false,
@@ -1057,6 +1116,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Managed Item',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Item',
visible: false,
@@ -1126,6 +1186,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Managed Item',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Item',
visible: false,
@@ -1208,6 +1269,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Phase',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Phase',
visible: false,
@@ -1282,6 +1344,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Formula',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Formula',
visible: false,
@@ -1351,6 +1414,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Event',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Event',
visible: false,
@@ -1420,6 +1484,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Situation',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Situation',
visible: false,
@@ -1489,6 +1554,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Condition',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Condition',
visible: false,
@@ -1563,6 +1629,7 @@ function newStrategyPartConstructor () {
},
{
action: 'Delete Code',
askConfirmation: true,
actionFunction: payload.onMenuItemClick,
label: 'Delete This Code',
visible: false,
@@ -1600,6 +1667,10 @@ function newStrategyPartConstructor () {
const INITIAL_FRICTION = 0.99
switch (payload.node.type) {
case 'Workspace': {
level_0()
break
}
case 'Trading System': {
level_0()
break
+4
View File
@@ -48,6 +48,10 @@ function newStrategyPartTitle () {
thisObject.payload = payload
switch (payload.node.type) {
case 'Workspace': {
thisObject.allwaysVisible = true
break
}
case 'Trading System': {
thisObject.allwaysVisible = true
break
+1
View File
@@ -40,6 +40,7 @@ function newStrategySpace () {
function buildIconByPartTypeMap () {
const relationshipArray = [
['Workspace', 'design-tool'],
['Trading System', 'analysis'],
['Parameters', 'settings'],
['Base Asset', 'sitemap'],
+5 -6
View File
@@ -47,12 +47,12 @@ function newStrategizerGateway () {
}
user = JSON.parse(user)
let fbSlug = 'simulator' + '-' + 'bot' + '-' + user.alias.replace('.','')
let fbSlug = 'simulator' + '-' + 'bot' + '-' + user.alias.replace('.', '')
/* See if we need to update or create a new record at the strategizer */
let tradingSystem = canvas.strategySpace.workspace.getProtocolTradingSystem()
let idAtStrategizer = canvas.strategySpace.workspace.idAtStrategizer
let idAtStrategizer = window.localStorage.getItem(MODULE_NAME)
if (idAtStrategizer === undefined) {
let response = await axios({
@@ -85,7 +85,7 @@ function newStrategizerGateway () {
console.log('Error getting events: ' + JSON.stringify(response.data.errors))
throw 'Error getting events: ' + JSON.stringify(response.data.errors)
} else {
canvas.strategySpace.workspace.idAtStrategizer = response.data.data.strategizer_CreateTradingSystem.id
window.localStorage.setItem(MODULE_NAME, response.data.data.strategizer_CreateTradingSystem.id)
}
} else {
const graphQLServer = await axios({
@@ -132,7 +132,7 @@ function newStrategizerGateway () {
}
user = JSON.parse(user)
let fbSlug = 'simulator' + '-' + 'bot' + '-' + user.alias.replace('.','')
let fbSlug = 'simulator' + '-' + 'bot' + '-' + user.alias.replace('.', '')
let response = await axios({
url: window.canvasApp.graphQL.masterAppApiUrl,
@@ -166,9 +166,8 @@ function newStrategizerGateway () {
return false
}
} else {
window.localStorage.setItem('userStrategies', JSON.stringify(response.data.data.strategizer_TradingSystemByFb.data))
thisObject.strategizerData = JSON.parse(JSON.stringify(response.data.data.strategizer_TradingSystemByFb.data))
canvas.strategySpace.workspace.idAtStrategizer = response.data.data.strategizer_TradingSystemByFb.id
window.localStorage.setItem(MODULE_NAME, response.data.data.strategizer_TradingSystemByFb.id)
return true
}
} catch (err) {
@@ -1,5 +1,6 @@
function newNodeDeleter () {
thisObject = {
deleteWorkspace: deleteWorkspace,
deleteTradingSystem: deleteTradingSystem,
deleteParameters: deleteParameters,
deleteBaseAsset: deleteBaseAsset,
@@ -25,19 +26,104 @@ function newNodeDeleter () {
canvas.floatingSpace.strategyPartConstructor.destroyStrategyPart(node.payload)
}
function deleteTradingSystem (node, rootNodes) {
/* Can not delete if it is the last one */
let counter = 0
for (let i = 0; i < rootNodes.length; i++) {
let rootNode = rootNodes[i]
if (rootNode.type === node.type) {
counter++
function deleteWorkspace (node, rootNodes) {
while (node.rootNodes.length > 0) {
let rootNode = node.rootNodes[0]
switch (rootNode.type) {
case 'Trading System': {
deleteTradingSystem(rootNode, rootNodes, true)
break
}
case 'Parameters': {
deleteParameters(rootNode, rootNodes)
break
}
case 'Base Asset': {
deleteBaseAsset(rootNode, rootNodes)
break
}
case 'Strategy': {
deleteStrategy(rootNode, rootNodes)
break
}
case 'Trigger Stage': {
deleteTriggerStage(rootNode, rootNodes)
break
}
case 'Open Stage': {
deleteOpenStage(rootNode, rootNodes)
break
}
case 'Manage Stage': {
deleteManageStage(rootNode, rootNodes)
break
}
case 'Close Stage': {
deleteCloseStage(rootNode, rootNodes)
break
}
case 'Position Size': {
deletePositionSize(rootNode, rootNodes)
break
}
case 'Initial Definition': {
deleteInitialDefinition(rootNode, rootNodes)
break
}
case 'Event': {
deleteEvent(rootNode, rootNodes)
break
}
case 'Managed Item': {
deleteManagedItem(rootNode, rootNodes)
break
}
case 'Phase': {
deletePhase(rootNode, rootNodes)
break
}
case 'Formula': {
deleteFormula(rootNode, rootNodes)
break
}
case 'Situation': {
deleteSituation(rootNode, rootNodes)
break
}
case 'Condition': {
deleteCondition(rootNode, rootNodes)
break
}
case 'Code': {
deleteCode(rootNode, rootNodes)
break
}
default:
}
}
if (counter <= 1) { return }
completeDeletion(node, rootNodes)
destroyPart(node)
cleanNode(node)
}
function deleteTradingSystem (node, rootNodes, forced) {
if (forced !== true) {
/* Can not delete if it is the last one */
let counter = 0
for (let i = 0; i < rootNodes.length; i++) {
let rootNode = rootNodes[i]
if (rootNode.type === node.type) {
counter++
}
}
if (counter <= 1) { return }
}
if (node.payload.uiObject.isRunning === true) {
strategyPart.setNotRunningStatus()
node.payload.uiObject.setNotRunningStatus()
}
while (node.strategies.length > 0) {
@@ -235,6 +235,11 @@ function newPartsFromNodes () {
}
return
}
case 'Workspace': {
let workspace = node
createPart('Workspace', workspace.name, workspace, parentNode, chainParent, 'Workspace')
return
}
}
}
@@ -573,6 +578,12 @@ function newPartsFromNodes () {
x: spawnPosition.x,
y: spawnPosition.y
}
if (partType === 'Workspace' || partType === 'Trading System') {
payload.position = {
x: spawnPosition.x,
y: spawnPosition.y
}
}
} else {
payload.targetPosition = {
x: chainParent.payload.position.x,
@@ -1,10 +1,10 @@
function newWorkspaceNode () {
function newStringifyNode () {
thisObject = {
getWorkspaceNode: getWorkspaceNode
prepareForStringify: prepareForStringify
}
return thisObject
function getWorkspaceNode (node) {
function prepareForStringify (node) {
if (node === undefined) { return }
switch (node.type) {
case 'Code':
@@ -26,7 +26,7 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
code: getWorkspaceNode(node.code),
code: prepareForStringify(node.code),
savedPayload: getSavedPayload(node)
}
return condition
@@ -42,7 +42,7 @@ function newWorkspaceNode () {
}
for (let m = 0; m < node.conditions.length; m++) {
let condition = getWorkspaceNode(node.conditions[m])
let condition = prepareForStringify(node.conditions[m])
situation.conditions.push(condition)
}
return situation
@@ -70,7 +70,7 @@ function newWorkspaceNode () {
savedPayload: getSavedPayload(node)
}
for (let m = 0; m < node.situations.length; m++) {
let situation = getWorkspaceNode(node.situations[m])
let situation = prepareForStringify(node.situations[m])
event.situations.push(situation)
}
return event
@@ -81,8 +81,8 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
formula: getWorkspaceNode(node.formula),
nextPhaseEvent: getWorkspaceNode(node.nextPhaseEvent),
formula: prepareForStringify(node.formula),
nextPhaseEvent: prepareForStringify(node.nextPhaseEvent),
savedPayload: getSavedPayload(node)
}
return phase
@@ -99,7 +99,7 @@ function newWorkspaceNode () {
}
for (let m = 0; m < node.phases.length; m++) {
let phase = getWorkspaceNode(node.phases[m])
let phase = prepareForStringify(node.phases[m])
stop.phases.push(phase)
}
return stop
@@ -116,7 +116,7 @@ function newWorkspaceNode () {
}
for (let m = 0; m < node.phases.length; m++) {
let phase = getWorkspaceNode(node.phases[m])
let phase = prepareForStringify(node.phases[m])
takeProfit.phases.push(phase)
}
return takeProfit
@@ -132,7 +132,7 @@ function newWorkspaceNode () {
}
for (let m = 0; m < node.situations.length; m++) {
let situation = getWorkspaceNode(node.situations[m])
let situation = prepareForStringify(node.situations[m])
event.situations.push(situation)
}
return event
@@ -148,7 +148,7 @@ function newWorkspaceNode () {
}
for (let m = 0; m < node.situations.length; m++) {
let situation = getWorkspaceNode(node.situations[m])
let situation = prepareForStringify(node.situations[m])
event.situations.push(situation)
}
return event
@@ -164,7 +164,7 @@ function newWorkspaceNode () {
}
for (let m = 0; m < node.situations.length; m++) {
let situation = getWorkspaceNode(node.situations[m])
let situation = prepareForStringify(node.situations[m])
event.situations.push(situation)
}
return event
@@ -175,8 +175,8 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
stopLoss: getWorkspaceNode(node.stopLoss),
takeProfit: getWorkspaceNode(node.takeProfit),
stopLoss: prepareForStringify(node.stopLoss),
takeProfit: prepareForStringify(node.takeProfit),
savedPayload: getSavedPayload(node)
}
return object
@@ -187,7 +187,7 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
formula: getWorkspaceNode(node.formula),
formula: prepareForStringify(node.formula),
savedPayload: getSavedPayload(node)
}
return object
@@ -198,10 +198,10 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
triggerOn: getWorkspaceNode(node.triggerOn),
triggerOff: getWorkspaceNode(node.triggerOff),
takePosition: getWorkspaceNode(node.takePosition),
positionSize: getWorkspaceNode(node.positionSize),
triggerOn: prepareForStringify(node.triggerOn),
triggerOff: prepareForStringify(node.triggerOff),
takePosition: prepareForStringify(node.takePosition),
positionSize: prepareForStringify(node.positionSize),
savedPayload: getSavedPayload(node)
}
return stage
@@ -212,7 +212,7 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
initialDefinition: getWorkspaceNode(node.initialDefinition),
initialDefinition: prepareForStringify(node.initialDefinition),
savedPayload: getSavedPayload(node)
}
return stage
@@ -223,8 +223,8 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
stopLoss: getWorkspaceNode(node.stopLoss),
takeProfit: getWorkspaceNode(node.takeProfit),
stopLoss: prepareForStringify(node.stopLoss),
takeProfit: prepareForStringify(node.takeProfit),
savedPayload: getSavedPayload(node)
}
return stage
@@ -245,10 +245,10 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
triggerStage: getWorkspaceNode(node.triggerStage),
openStage: getWorkspaceNode(node.openStage),
manageStage: getWorkspaceNode(node.manageStage),
closeStage: getWorkspaceNode(node.closeStage),
triggerStage: prepareForStringify(node.triggerStage),
openStage: prepareForStringify(node.openStage),
manageStage: prepareForStringify(node.manageStage),
closeStage: prepareForStringify(node.closeStage),
savedPayload: getSavedPayload(node)
}
return strategy
@@ -259,7 +259,7 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
formula: getWorkspaceNode(node.formula),
formula: prepareForStringify(node.formula),
savedPayload: getSavedPayload(node)
}
return object
@@ -270,7 +270,7 @@ function newWorkspaceNode () {
type: node.type,
subType: node.subType,
name: node.name,
baseAsset: getWorkspaceNode(node.baseAsset),
baseAsset: prepareForStringify(node.baseAsset),
savedPayload: getSavedPayload(node)
}
return object
@@ -282,12 +282,12 @@ function newWorkspaceNode () {
subType: node.subType,
name: node.name,
strategies: [],
parameters: getWorkspaceNode(node.parameters),
parameters: prepareForStringify(node.parameters),
savedPayload: getSavedPayload(node)
}
for (let m = 0; m < node.strategies.length; m++) {
let strategy = getWorkspaceNode(node.strategies[m])
let strategy = prepareForStringify(node.strategies[m])
tradingSystem.strategies.push(strategy)
}
return tradingSystem
+89 -56
View File
@@ -5,7 +5,6 @@ function newWorkspace () {
let thisObject = {
tradingSystem: undefined,
container: undefined,
idAtStrategizer: undefined,
onMenuItemClick: onMenuItemClick,
getProtocolTradingSystem: getProtocolTradingSystem,
physics: physics,
@@ -34,13 +33,14 @@ function newWorkspace () {
y: canvas.floatingSpace.container.frame.height / 2
}
let rootNodes = []
let workspaceNode = {}
workspaceNode.rootNodes = []
functionLibraryAttachDetach = newAttachDetach()
functionLibraryNodeDeleter = newNodeDeleter()
functionLibraryPartsFromNodes = newPartsFromNodes()
functionLibraryProtocolNode = newProtocolNode()
functionLibraryWorkspaceNodes = newWorkspaceNode()
functionLibraryWorkspaceNodes = newStringifyNode()
let isInitialized = false
return thisObject
@@ -52,22 +52,24 @@ function newWorkspace () {
}
async function initialize () {
functionLibraryAttachDetach = newAttachDetach()
functionLibraryNodeDeleter = newNodeDeleter()
functionLibraryPartsFromNodes = newPartsFromNodes()
functionLibraryProtocolNode = newProtocolNode()
functionLibraryWorkspaceNodes = newWorkspaceNode()
let user = window.localStorage.getItem(LOGGED_IN_USER_LOCAL_STORAGE_KEY)
if (user === null) {
return
}
user = JSON.parse(user)
let savedWorkspace = window.localStorage.getItem('workspace')
let savedWorkspace = window.localStorage.getItem(user.alias + '.' + 'workspace')
if (savedWorkspace === null) {
workspaceNode.type = 'Workspace'
workspaceNode.name = 'My Workspace'
functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined)
spawnPosition.y = spawnPosition.y + 250
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]
workspaceNode = JSON.parse(savedWorkspace)
functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined)
for (let i = 0; i < workspaceNode.rootNodes.length; i++) {
let rootNode = workspaceNode.rootNodes[i]
functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined)
}
isInitialized = true
@@ -78,7 +80,7 @@ function newWorkspace () {
let result = await canvas.strategySpace.strategizerGateway.loadFromStrategyzer()
if (result === true) {
thisObject.tradingSystem = canvas.strategySpace.strategizerGateway.strategizerData
rootNodes.push(thisObject.tradingSystem)
workspaceNode.rootNodes.push(thisObject.tradingSystem)
functionLibraryPartsFromNodes.createPartFromNode(thisObject.tradingSystem, undefined, undefined)
thisObject.tradingSystem.payload.uiObject.setRunningStatus()
} else {
@@ -87,7 +89,7 @@ function newWorkspace () {
type: 'Trading System',
strategies: []
}
rootNodes.push(thisObject.tradingSystem)
workspaceNode.rootNodes.push(thisObject.tradingSystem)
functionLibraryPartsFromNodes.createPartFromNode(thisObject.tradingSystem, undefined, undefined)
thisObject.tradingSystem.payload.uiObject.setRunningStatus()
}
@@ -103,28 +105,39 @@ function newWorkspace () {
}
function detachNode (node) {
functionLibraryAttachDetach.detachNode(node, rootNodes)
functionLibraryAttachDetach.detachNode(node, workspaceNode.rootNodes)
}
function attachNode (node, attachToNode) {
functionLibraryAttachDetach.attachNode(node, attachToNode, rootNodes)
functionLibraryAttachDetach.attachNode(node, attachToNode, workspaceNode.rootNodes)
}
function physics () {
if (isInitialized !== true) { return }
/* Here we will save all the workspace related objects into the local storage */
let user = window.localStorage.getItem(LOGGED_IN_USER_LOCAL_STORAGE_KEY)
if (user === null) {
return
}
user = JSON.parse(user)
let textToSave = stringifyWorkspace()
window.localStorage.setItem(user.alias + '.' + 'workspace', textToSave)
}
function stringifyWorkspace () {
let stringifyReadyNodes = []
for (let i = 0; i < rootNodes.length; i++) {
let rootNode = rootNodes[i]
let workspaceNode = functionLibraryWorkspaceNodes.getWorkspaceNode(rootNode)
stringifyReadyNodes.push(workspaceNode)
for (let i = 0; i < workspaceNode.rootNodes.length; i++) {
let rootNode = workspaceNode.rootNodes[i]
let workspace = functionLibraryWorkspaceNodes.prepareForStringify(rootNode)
stringifyReadyNodes.push(workspace)
}
let workspace = {
idAtStrategizer: thisObject.idAtStrategizer,
type: 'Workspace',
name: workspaceNode.name,
rootNodes: stringifyReadyNodes
}
let textToSave = JSON.stringify(workspace)
window.localStorage.setItem('workspace', textToSave)
return JSON.stringify(workspace)
}
function spawn (nodeText, point) {
@@ -132,14 +145,33 @@ function newWorkspace () {
spawnPosition.x = point.x
spawnPosition.y = point.y
let dirtyNode = JSON.parse(nodeText)
let rootNode = functionLibraryProtocolNode.getProtocolNode(dirtyNode)
rootNodes.push(rootNode)
functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined)
let droppedNode = JSON.parse(nodeText)
if (droppedNode.type === 'Workspace') {
functionLibraryNodeDeleter.deleteWorkspace(workspaceNode, workspaceNode.rootNodes)
workspaceNode = droppedNode
functionLibraryPartsFromNodes.createPartFromNode(workspaceNode, undefined, undefined)
for (let i = 0; i < workspaceNode.rootNodes.length; i++) {
let rootNode = workspaceNode.rootNodes[i]
functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined)
}
} else {
let rootNode = functionLibraryProtocolNode.getProtocolNode(droppedNode)
workspaceNode.rootNodes.push(rootNode)
functionLibraryPartsFromNodes.createPartFromNode(rootNode, undefined, undefined)
}
}
async function onMenuItemClick (payload, action) {
switch (action) {
case 'Download Workspace':
{
let text = stringifyWorkspace()
let fileName = payload.node.type + ' - ' + payload.node.name + '.json'
download(fileName, text)
}
break
case 'Save Trading System':
{
let result = await canvas.strategySpace.strategizerGateway.saveToStrategyzer()
@@ -151,16 +183,17 @@ function newWorkspace () {
break
case 'Download':
let text = JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node))
let nodeName = payload.node.name
if (nodeName === undefined) {
nodeName = ''
} else {
nodeName = '.' + nodeName
{
let text = JSON.stringify(functionLibraryProtocolNode.getProtocolNode(payload.node))
let nodeName = payload.node.name
if (nodeName === undefined) {
nodeName = ''
} else {
nodeName = '.' + nodeName
}
let fileName = payload.node.type + ' - ' + nodeName + '.json'
download(fileName, text)
}
let fileName = payload.node.type + nodeName + '.json'
download(fileName, text)
break
@@ -235,71 +268,71 @@ function newWorkspace () {
}
break
case 'Delete Trading System': {
functionLibraryNodeDeleter.deleteTradingSystem(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteTradingSystem(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Parameters': {
functionLibraryNodeDeleter.deleteParameters(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteParameters(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Base Asset': {
functionLibraryNodeDeleter.deleteBaseAsset(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteBaseAsset(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Strategy': {
functionLibraryNodeDeleter.deleteStrategy(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteStrategy(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Trigger Stage': {
functionLibraryNodeDeleter.deleteTriggerStage(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteTriggerStage(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Open Stage': {
functionLibraryNodeDeleter.deleteOpenStage(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteOpenStage(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Manage Stage': {
functionLibraryNodeDeleter.deleteManageStage(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteManageStage(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Close Stage': {
functionLibraryNodeDeleter.deleteCloseStage(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteCloseStage(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Position Size': {
functionLibraryNodeDeleter.deletePositionSize(payload.node, rootNodes)
functionLibraryNodeDeleter.deletePositionSize(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Initial Definition': {
functionLibraryNodeDeleter.deleteInitialDefinition(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteInitialDefinition(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Event': {
functionLibraryNodeDeleter.deleteEvent(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteEvent(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Managed Item': {
functionLibraryNodeDeleter.deleteManagedItem(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteManagedItem(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Phase': {
functionLibraryNodeDeleter.deletePhase(payload.node, rootNodes)
functionLibraryNodeDeleter.deletePhase(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Formula': {
functionLibraryNodeDeleter.deleteFormula(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteFormula(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Situation': {
functionLibraryNodeDeleter.deleteSituation(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteSituation(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Condition': {
functionLibraryNodeDeleter.deleteCondition(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteCondition(payload.node, workspaceNode.rootNodes)
break
}
case 'Delete Code': {
functionLibraryNodeDeleter.deleteCode(payload.node, rootNodes)
functionLibraryNodeDeleter.deleteCode(payload.node, workspaceNode.rootNodes)
break
}
default: