Super Actions Implemented

This commit is contained in:
Luis Fernando Molina committed 2020-02-21 13:52:14 +01:00
1 parent 4cc57408ee
commit 882cdb7df2
22 files changed
+498 -23

No files matched your search

+6 -4
View File
@@ -922,10 +922,12 @@ function newCanvas () {
function checkDrag (event) {
try {
if (containerDragStarted === true || floatingObjectDragStarted === true || viewPortBeingDragged === true) {
thisObject.mouse.event = event
thisObject.mouse.position.x = event.pageX
thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN
thisObject.mouse.action = 'dragging'
if (event !== undefined) {
thisObject.mouse.event = event
thisObject.mouse.position.x = event.pageX
thisObject.mouse.position.y = event.pageY - CURRENT_TOP_MARGIN
thisObject.mouse.action = 'dragging'
}
browserCanvas.style.cursor = 'grabbing'
thisObject.eventHandler.raiseEvent('Dragging', undefined)
@@ -7,6 +7,7 @@ function newChainAttachDetach () {
return thisObject
function chainDetachNode (node, rootNodes) {
if (node.payload.parentNode === undefined) { return }
switch (node.type) {
case 'Phase': {
let payload = node.payload
@@ -20,5 +20,8 @@ function newReferenceAttachDetach () {
function completeDetachment (node) {
node.payload.referenceParent = undefined
if (node.savedPayload !== undefined) {
node.savedPayload.referenceParent = undefined
}
}
}
@@ -0,0 +1,57 @@
function newSuperScriptsFunctions () {
thisObject = {
runSuperScript: runSuperScript
}
return thisObject
function runSuperScript (node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes) {
try {
let clone = functionLibraryNodeCloning.getNodeClone
let executionResult = true
function setup (templateClone, target) {
spawnPosition.x = target.payload.position.x
spawnPosition.y = target.payload.position.y
functionLibraryUiObjectsFromNodes.createUiObjectFromNode(templateClone, target, target)
}
/* Validations */
if (executionResult === true && node.payload.parentNode === undefined) {
node.payload.uiObject.setErrorMessage('Super Action node needs a Parent Node.')
executionResult = false
}
if (executionResult === true && node.payload.referenceParent === undefined) {
node.payload.uiObject.setErrorMessage('Super Action node needs to reference a Master Script Node.')
executionResult = false
}
if (executionResult === true && node.payload.referenceParent.javascriptCode === undefined) {
node.payload.uiObject.setErrorMessage('Master Script Node needs to have a child Javascript Code Node.')
executionResult = false
}
let superAction = node
let masterScript = node.payload.referenceParent
eval(masterScript.javascriptCode.code)
let masterScriptInstance = newNewMasterScriptInstance()
if (executionResult === true) {
executionResult = masterScriptInstance.runValidations(superAction, masterScript)
}
if (executionResult === true) {
executionResult = masterScriptInstance.runScript(superAction, masterScript)
}
if (executionResult === true) {
superAction.payload.uiObject.setValue('Execution Completed Successfully')
} else {
superAction.payload.uiObject.setValue('Execution Failed')
}
} catch (err) {
superAction.payload.uiObject.setErrorMessage(err.message)
superAction.payload.uiObject.setValue('Execution Failed')
}
}
}
@@ -189,6 +189,16 @@ function newUiObjectsFromNodes () {
}
}
/* Create Empty Arrays for properties of type Array */
if (nodeDefinition.properties !== undefined) {
for (let i = 0; i < nodeDefinition.properties.length; i++) {
let property = nodeDefinition.properties[i]
if (property.type === 'array') {
object[property.name] = []
}
}
}
if (nodeDefinition !== undefined) {
if (nodeDefinition.initialValues !== undefined) {
if (nodeDefinition.initialValues.code !== undefined) {
@@ -56,6 +56,7 @@ function newWorkspace () {
let functionLibrarySessionFunctions = newSessionFunctions()
let functionLibraryShortcutKeys = newShortcutKeys()
let functionLibraryOnFocus = newOnFocus()
let functionLibrarySuperScripts = newSuperScriptsFunctions()
thisObject.nodeChildren = newNodeChildren()
@@ -366,6 +367,21 @@ function newWorkspace () {
functionLibrarySessionFunctions.stopSession(payload.node, functionLibraryProtocolNode, callBackFunction)
}
break
case 'Run Super Action':
{
functionLibrarySuperScripts.runSuperScript(payload.node, functionLibraryNodeCloning, functionLibraryUiObjectsFromNodes)
}
break
case 'Remove Parent':
{
chainDetachNode(payload.node)
}
break
case 'Remove Reference':
{
referenceDetachNode(payload.node)
}
break
}
}
}
+4 -3
View File
@@ -150,15 +150,15 @@ function newCircularMenuItem () {
if (thisObject.type === 'Icon Only') {
switch (thisObject.ring) {
case 1: {
radiusGrowthFactor = 5
radiusGrowthFactor = 6
break
}
case 2: {
radiusGrowthFactor = 3.5
radiusGrowthFactor = 4.5
break
}
case 3: {
radiusGrowthFactor = 2
radiusGrowthFactor = 3
break
}
}
@@ -275,6 +275,7 @@ function newCircularMenuItem () {
/* A Click during confirmation executes the pre-defined action. */
if (temporaryStatus === STATUS_WAITING_CONFIRMATION || temporaryStatus === STATUS_PRIMARY_WORK_DONE) {
executeAction()
setStatus(thisObject.workDoneLabel, UI_COLOR.PATINATED_TURQUOISE, 100, STATUS_SECONDARY_WORK_DONE)
return
}
}
@@ -246,6 +246,34 @@ function newUiObjectConstructor () {
}
)
}
menuItemsInitialValues.push(
{
action: 'Remove Parent',
actionFunction: floatingObject.payload.onMenuItemClick,
label: undefined,
visible: true,
iconPathOn: 'detach',
iconPathOff: 'detach',
rawRadius: 8,
targetRadius: 0,
currentRadius: 0,
ring: 3
}
)
menuItemsInitialValues.push(
{
action: 'Remove Reference',
actionFunction: floatingObject.payload.onMenuItemClick,
label: undefined,
visible: true,
iconPathOn: 'delink',
iconPathOff: 'delink',
rawRadius: 8,
targetRadius: 0,
currentRadius: 0,
ring: 3
}
)
}
function getMenuItemsInitialValues (uiObject, floatingObject, payload) {
+5
View File
@@ -141,6 +141,11 @@ function newUiObjectTitle () {
}
}
/* The name becomes the title. */
if (thisObject.payload.node.name !== undefined) {
thisObject.payload.title = thisObject.payload.node.name
}
let title = trimTitle(thisObject.payload.title)
/* Here we set the dimensions and position of this object */
+10 -1
View File
@@ -265,7 +265,16 @@ function newDesignSpace () {
'key-down',
'key-left',
'key-right',
'key-up'
'key-up',
'master-script',
'scripts-library',
'super-action',
'super-scripts',
'template-script',
'template-structure',
'template-target',
'delink',
'detach'
]
for (let i = 0; i < iconsNames.length; i++) {
+319 -8
View File
@@ -280,7 +280,7 @@
"code": "// Type you code here"
},
"chainAttachesTo": {
"compatibleTypes": "->Condition->Procedure Initialization->Procedure Loop->Plotter Module->Plotter Panel->"
"compatibleTypes": "->Condition->Procedure Initialization->Procedure Loop->Plotter Module->Plotter Panel->Master Script->"
},
"menuItems": [
{
@@ -728,6 +728,12 @@
"relatedUiObject": "Charting Space",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"label": "Add Super Scripts",
"relatedUiObject": "Super Scripts",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Share Workspace",
"label": "Share",
@@ -825,6 +831,298 @@
],
"propertyNameAtParent": "conditions"
},
{
"type": "Super Scripts",
"menuItems": [
{
"action": "Add UI Object",
"label": "Add Scripts Library",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "scriptsLibrary",
"relatedUiObject": "Scripts Library",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete Super Scripts",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"isTitleAllwaysVisible": false,
"isHierarchyHead": true,
"addLeftIcons": true,
"level": 1,
"icon": "super-scripts",
"properties": [
{
"name": "scriptsLibrary",
"type": "node",
"childType": "Scripts Library",
"autoAdd": true
}
]
},
{
"type": "Scripts Library",
"menuItems": [
{
"action": "Add UI Object",
"label": "Add Master Script",
"relatedUiObject": "Master Script",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete Scripts Library",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"propertyNameAtParent": "scriptsLibrary",
"isTitleAllwaysVisible": false,
"addLeftIcons": true,
"level": 1,
"chainAttachesTo": {
"compatibleTypes": "->Super Scripts->"
},
"icon": "scripts-library",
"properties": [
{
"name": "masterScripts",
"type": "array",
"childType": "Master Script",
"autoAdd": true
}
]
},
{
"type": "Master Script",
"menuItems": [
{
"action": "Add UI Object",
"label": "Add Template Script",
"relatedUiObject": "Template Script",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"label": "Add Javascript Code",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "javascriptCode",
"relatedUiObject": "Javascript Code",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete Master Script",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"propertyNameAtParent": "masterScripts",
"isTitleAllwaysVisible": true,
"addLeftIcons": true,
"level": 2,
"chainAttachesTo": {
"compatibleTypes": "->Scripts Library->"
},
"icon": "master-script",
"properties": [
{
"name": "templateScripts",
"type": "array",
"childType": "Template Script"
},
{
"name": "javascriptCode",
"type": "node",
"childType": "Javascript Code",
"autoAdd": true
}
]
},
{
"type": "Template Script",
"menuItems": [
{
"action": "Add UI Object",
"label": "Add Template Structure",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "templateStructure",
"relatedUiObject": "Template Structure",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"label": "Add Template Target",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "templateTarget",
"relatedUiObject": "Template Target",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"label": "Add Javascript Code",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "javascriptCode",
"relatedUiObject": "Javascript Code",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete Template Script",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"propertyNameAtParent": "templateScripts",
"isTitleAllwaysVisible": true,
"addLeftIcons": true,
"level": 3,
"chainAttachesTo": {
"compatibleTypes": "->Master Script->"
},
"icon": "template-script",
"properties": [
{
"name": "templateStructure",
"type": "node",
"childType": "Template Structure",
"autoAdd": true
},
{
"name": "templateTarget",
"type": "node",
"childType": "Template Target",
"autoAdd": true
},
{
"name": "javascriptCode",
"type": "node",
"childType": "Javascript Code",
"autoAdd": true
}
]
},
{
"type": "Template Structure",
"menuItems": [
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete Template Structure",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"propertyNameAtParent": "templateStructure",
"isTitleAllwaysVisible": false,
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Template Script->"
},
"icon": "template-structure",
"properties": [
{
"name": "taskManagers",
"type": "node",
"childType": "Task Manager"
},
{
"name": "singleMarketData",
"type": "node",
"childType": "Single Market Data"
},
{
"name": "sessionReferences",
"type": "node",
"childType": "Session Reference"
},
{
"name": "timeMachines",
"type": "node",
"childType": "Time Machine"
}
]
},
{
"type": "Template Target",
"menuItems": [
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete Template Target",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"propertyNameAtParent": "templateTarget",
"isTitleAllwaysVisible": false,
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Template Script->"
},
"referenceAttachesTo": {
"compatibleTypes": "->Dashboard->Session Independent Data->Session Based Data->Data Mining->Testing Environment->Production Environment->"
},
"icon": "template-target",
"properties": []
},
{
"type": "Super Action",
"menuItems": [
{
"action": "Run Super Action",
"label": "Run",
"askConfirmation": true,
"confirmationLabel": "Confirm to Run",
"workDoneLabel": "Super Action Executed",
"iconPathOn": "paper-plane",
"iconPathOff": "paper-plane",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Delete UI Object",
"askConfirmation": true,
"confirmationLabel": "Confirm to Delete",
"label": "Delete Super Action",
"iconPathOn": "delete",
"iconPathOff": "delete",
"actionFunction": "payload.onMenuItemClick"
}
],
"propertyNameAtParent": "superActions",
"isTitleAllwaysVisible": true,
"addLeftIcons": true,
"level": 4,
"chainAttachesTo": {
"compatibleTypes": "->Market->"
},
"referenceAttachesTo": {
"compatibleTypes": "->Master Script->"
},
"icon": "super-action",
"properties": []
},
{
"type": "Network",
"menuItems": [
@@ -974,7 +1272,7 @@
"addLeftIcons": true,
"level": 1,
"chainAttachesTo": {
"compatibleTypes": "->Data Mining->Testing Environment->Production Environment->"
"compatibleTypes": "->Data Mining->Testing Environment->Production Environment->Template Structure->"
},
"icon": "task-manager",
"properties": [
@@ -4495,6 +4793,12 @@
"relatedUiObject": "Market Quoted Asset",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Add UI Object",
"label": "Add Super Action",
"relatedUiObject": "Super Action",
"actionFunction": "payload.onMenuItemClick"
},
{
"action": "Config Market",
"actionFunction": "uiObject.configEditor.activate",
@@ -4524,6 +4828,11 @@
"type": "node",
"childType": "Market Quoted Asset",
"autoAdd": true
},
{
"name": "superActions",
"type": "array",
"childType": "Super Action"
}
],
"addLeftIcons": true,
@@ -4912,7 +5221,7 @@
"isTitleAllwaysVisible": true,
"icon": "time-machine",
"chainAttachesTo": {
"compatibleTypes": "->Dashboard->"
"compatibleTypes": "->Dashboard->Template Structure->"
},
"propertyNameAtParent": "timeMachines",
"properties": [
@@ -5474,7 +5783,7 @@
"propertyNameAtParent": "sessionBasedData",
"properties": [
{
"name": "sessionReference",
"name": "sessionReferences",
"type": "array",
"childType": "Session Reference",
"autoAdd": true
@@ -5487,6 +5796,8 @@
{
"action": "Add UI Object",
"label": "Add Single Market Data",
"disableIfPropertyIsDefined": true,
"propertyToCheckFor": "singleMarketData",
"relatedUiObject": "Single Market Data",
"actionFunction": "payload.onMenuItemClick"
},
@@ -5512,13 +5823,13 @@
"compatibleTypes": "->Backtesting Session->Paper Trading Session->Fordward Testing Session->Live Trading Session->"
},
"chainAttachesTo": {
"compatibleTypes": "->Session Based Data->"
"compatibleTypes": "->Session Based Data->Template Structure->"
},
"propertyNameAtParent": "sessionReference",
"propertyNameAtParent": "sessionReferences",
"properties": [
{
"name": "singleMarketData",
"type": "array",
"type": "node",
"childType": "Single Market Data",
"autoAdd": true
}
@@ -5555,7 +5866,7 @@
"compatibleTypes": "->Market->"
},
"chainAttachesTo": {
"compatibleTypes": "->Session Independent Data->Session Reference->"
"compatibleTypes": "->Session Independent Data->Session Reference->Template Structure->"
},
"propertyNameAtParent": "singleMarketData",
"properties": [
@@ -34,7 +34,7 @@
container.initialize();
thisObject.container = container;
let coordinateSystem = newCoordinateSystem(); // Needed to be able to plot on the timeline, otherwise not.
let coordinateSystem
let timeFrame; // This will hold the current Time Frame the user is at.
let datetime; // This will hold the current Datetime the user is at.
@@ -58,6 +58,7 @@
let dimmensionsChangedEventSubscriptionId
let marketFilesUpdatedEventSubscriptionId
let dailyFilesUpdatedEventSubscriptionId
let scaleChangedEventSubscriptionId
return thisObject;
@@ -86,13 +87,15 @@
marketFile = undefined;
fileCursor = undefined;
finalizeCoordinateSystem()
coordinateSystem = undefined
} catch (err) {
if (ERROR_LOG === true) { logger.write("[ERROR] finalize -> err = " + err.stack); }
}
}
function initialize(pStorage, pDatetime, pTimeFrame, callBackFunction) {
function initialize(pStorage, pDatetime, pTimeFrame, pCoordinateSystem, callBackFunction) {
try {
@@ -105,6 +108,8 @@
datetime = pDatetime;
timeFrame = pTimeFrame;
coordinateSystem = pCoordinateSystem
initializeCoordinateSystem()
/* We need a Market File in order to calculate the Y scale, since this scale depends on actual data. */
@@ -141,6 +146,23 @@
}
}
function initializeCoordinateSystem() {
scaleChangedEventSubscriptionId = coordinateSystem.eventHandler.listenToEvent('Scale Changed', onScaleChanged)
}
function finalizeCoordinateSystem() {
coordinateSystem.eventHandler.stopListening(scaleChangedEventSubscriptionId)
}
function onScaleChanged() {
recalculate();
}
function onMouseOver(event) {
let userPosition = getDateFromPointAtBrowserCanvas(event, thisObject.container, coordinateSystem)
userPositionDate = userPosition.valueOf()
}
function getContainer(point) {
try {
@@ -230,6 +252,12 @@
}
function setCoordinateSystem(pCoordinateSystem) {
finalizeCoordinateSystem()
coordinateSystem = pCoordinateSystem
initializeCoordinateSystem()
}
function onDailyFileLoaded(event) {
try {
@@ -350,7 +378,10 @@
record.formulaErrors = dailyFile[1][i][7];
record.formulaValues = dailyFile[1][i][8];
if (record.begin >= farLeftDate.valueOf() && record.end <= farRightDate.valueOf()) {
if (
(record.begin >= farLeftDate.valueOf() && record.end <= farRightDate.valueOf()) &&
(record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x)
) {
conditions.push(record);
@@ -419,7 +450,10 @@
record.formulaErrors = marketFile[1][i][7];
record.formulaValues = marketFile[1][i][8];
if (record.begin >= leftDate.valueOf() && record.end <= rightDate.valueOf()) {
if (
(record.begin >= leftDate.valueOf() && record.end <= rightDate.valueOf()) &&
(record.begin >= coordinateSystem.min.x && record.end <= coordinateSystem.max.x)
) {
conditions.push(record);
@@ -444,9 +478,6 @@
try {
let userPosition = getUserPosition()
let userPositionDate = userPosition.point.x
thisObject.container.eventHandler.raiseEvent("Current Condition Record Changed", undefined);
let conditionRecord;
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+1
View File
@@ -53,6 +53,7 @@ function newAppLoader() {
'DesignSpace/Workspace/FunctionLibraries/SessionFunctions.js',
'DesignSpace/Workspace/FunctionLibraries/ShortcutKeys.js',
'DesignSpace/Workspace/FunctionLibraries/OnFocus.js',
'DesignSpace/Workspace/FunctionLibraries/SuperScripts.js',
'Utilities/RoundedCornersBackground.js',