Bugs Fixed deleting node from workspace and adding hirierchies
This commit is contained in:
1 parent
48ad0047e1
commit
ff4ce84240
7 files changed
+228
-127
No files matched your search
@@ -570,7 +570,7 @@ exports.newHttpInterface = function newHttpInterface(WEB_SERVER, DATA_FILE_SERVE
|
||||
|
||||
function onDirRead(err, fileList) {
|
||||
if (err) {
|
||||
if (CONSOLE_ERROR_LOG === true) { console.log('[WARN] Error reading a directory content. filePath = ' + dirPath) }
|
||||
if (CONSOLE_ERROR_LOG === true) { console.log('[WARN] Could not read this directory content. filePath = ' + dirPath) }
|
||||
respondWithContent(JSON.stringify(global.DEFAULT_FAIL_RESPONSE), httpResponse)
|
||||
return
|
||||
} else {
|
||||
|
||||
@@ -41,7 +41,33 @@
|
||||
"addLeftIcons": true,
|
||||
"isPinned": true,
|
||||
"positionLocked": true,
|
||||
"icon": "ethereum"
|
||||
"icon": "ethereum",
|
||||
"properties": [
|
||||
{
|
||||
"name": "projectDefinition",
|
||||
"type": "node",
|
||||
"childType": "Project Definition",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "spaces",
|
||||
"type": "node",
|
||||
"childType": "Spaces",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "mines",
|
||||
"type": "node",
|
||||
"childType": "Mines",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "otherHierarchies",
|
||||
"type": "node",
|
||||
"childType": "Other Hierarchies",
|
||||
"autoAdd": true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Ethereum Wallet",
|
||||
|
||||
@@ -65,50 +65,52 @@ function newSuperalgosFunctionLibraryNodeDeleter() {
|
||||
}
|
||||
|
||||
/* Remove node from parent */
|
||||
let removedFromParent = false
|
||||
if (node.payload !== undefined) {
|
||||
if (node.payload.parentNode !== undefined) {
|
||||
let parentNodeDefinition = getNodeDefinition(node.payload.parentNode)
|
||||
if (parentNodeDefinition !== undefined) {
|
||||
if (parentNodeDefinition.properties !== undefined) {
|
||||
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
||||
let property = parentNodeDefinition.properties[i]
|
||||
if (nodeDefinition.propertyNameAtParent === property.name) {
|
||||
switch (property.type) {
|
||||
case 'node': {
|
||||
node.payload.parentNode[property.name] = undefined
|
||||
removedFromParent = true
|
||||
}
|
||||
break
|
||||
case 'array': {
|
||||
let nodePropertyArray = node.payload.parentNode[property.name]
|
||||
if (nodePropertyArray !== undefined) {
|
||||
for (let j = 0; j < nodePropertyArray.length; j++) {
|
||||
let arrayItem = nodePropertyArray[j]
|
||||
if (arrayItem.id === node.id) {
|
||||
/* If this object is chained to the ones of the same type we need to give the next in the chain the reference to the current chain parent */
|
||||
if (nodeDefinition.chainedToSameType === true) {
|
||||
if (j < nodePropertyArray.length - 1) {
|
||||
let nextArrayItem = nodePropertyArray[j + 1]
|
||||
nextArrayItem.payload.chainParent = node.payload.chainParent
|
||||
if (nodeDefinition.propertyNameAtParent !== undefined) {
|
||||
let removedFromParent = false
|
||||
if (node.payload !== undefined) {
|
||||
if (node.payload.parentNode !== undefined) {
|
||||
let parentNodeDefinition = getNodeDefinition(node.payload.parentNode)
|
||||
if (parentNodeDefinition !== undefined) {
|
||||
if (parentNodeDefinition.properties !== undefined) {
|
||||
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
||||
let property = parentNodeDefinition.properties[i]
|
||||
if (nodeDefinition.propertyNameAtParent === property.name) {
|
||||
switch (property.type) {
|
||||
case 'node': {
|
||||
node.payload.parentNode[property.name] = undefined
|
||||
removedFromParent = true
|
||||
}
|
||||
break
|
||||
case 'array': {
|
||||
let nodePropertyArray = node.payload.parentNode[property.name]
|
||||
if (nodePropertyArray !== undefined) {
|
||||
for (let j = 0; j < nodePropertyArray.length; j++) {
|
||||
let arrayItem = nodePropertyArray[j]
|
||||
if (arrayItem.id === node.id) {
|
||||
/* If this object is chained to the ones of the same type we need to give the next in the chain the reference to the current chain parent */
|
||||
if (nodeDefinition.chainedToSameType === true) {
|
||||
if (j < nodePropertyArray.length - 1) {
|
||||
let nextArrayItem = nodePropertyArray[j + 1]
|
||||
nextArrayItem.payload.chainParent = node.payload.chainParent
|
||||
}
|
||||
}
|
||||
|
||||
nodePropertyArray.splice(j, 1)
|
||||
removedFromParent = true
|
||||
}
|
||||
|
||||
nodePropertyArray.splice(j, 1)
|
||||
removedFromParent = true
|
||||
}
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (removedFromParent === false) {
|
||||
console.log('[ERROR] Deleting Node: ' + node.type + ' ' + node.name + '. This node could not be deleted from its parent node (' + node.payload.parentNode.type + ') because its configured propertyNameAtParent (' + nodeDefinition.propertyNameAtParent + ') does not match any of the properties of its parent.')
|
||||
return false
|
||||
if (removedFromParent === false) {
|
||||
console.log('[ERROR] Deleting Node: ' + node.type + ' ' + node.name + '. This node could not be deleted from its parent node (' + node.payload.parentNode.type + ') because its configured propertyNameAtParent (' + nodeDefinition.propertyNameAtParent + ') does not match any of the properties of its parent.')
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -364,24 +364,38 @@ function newSuperalgosFunctionLibraryUiObjectsFromNodes() {
|
||||
}
|
||||
}
|
||||
|
||||
let chainParent = parentNode
|
||||
if (nodeDefinition.isHierarchyHead === true || nodeDefinition.isProjectHead) {
|
||||
rootNodes.push(object)
|
||||
initializeArrayProperties()
|
||||
applyInitialValues()
|
||||
createUiObject(true, object.type, object.name, object, parentNode, undefined)
|
||||
autoAddChildren()
|
||||
return object
|
||||
} else {
|
||||
checkChainToSelfTypeCollection()
|
||||
initializeArrayProperties()
|
||||
applyInitialValues()
|
||||
connectToParent()
|
||||
createUiObject(true, object.type, object.name, object, parentNode, chainParent)
|
||||
autoAddChildren()
|
||||
return object
|
||||
}
|
||||
|
||||
/* For the cases where an node is not chained to its parent but to the one at the parent before it at its collection */
|
||||
let chainParent = parentNode
|
||||
if (nodeDefinition.chainedToSameType === true) {
|
||||
if (parentNodeDefinition.properties !== undefined) {
|
||||
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
||||
let property = parentNodeDefinition.properties[i]
|
||||
if (property.childType === type) {
|
||||
if (property.type === 'array') {
|
||||
if (parentNode[property.name] !== undefined) {
|
||||
if (parentNode[property.name].length > 0) {
|
||||
let nodeChildren = parentNode[property.name]
|
||||
chainParent = nodeChildren[nodeChildren.length - 1]
|
||||
function checkChainToSelfTypeCollection() {
|
||||
/* For the cases where a node is not chained to its parent but to the one at the parent before it at its own collection */
|
||||
|
||||
if (nodeDefinition.chainedToSameType === true) {
|
||||
if (parentNodeDefinition.properties !== undefined) {
|
||||
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
||||
let property = parentNodeDefinition.properties[i]
|
||||
if (property.childType === type) {
|
||||
if (property.type === 'array') {
|
||||
if (parentNode[property.name] !== undefined) {
|
||||
if (parentNode[property.name].length > 0) {
|
||||
let nodeChildren = parentNode[property.name]
|
||||
chainParent = nodeChildren[nodeChildren.length - 1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -390,51 +404,88 @@ function newSuperalgosFunctionLibraryUiObjectsFromNodes() {
|
||||
}
|
||||
}
|
||||
|
||||
/* 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] = []
|
||||
function initializeArrayProperties() {
|
||||
/* 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.initialValues !== undefined) {
|
||||
if (nodeDefinition.initialValues.code !== undefined) {
|
||||
object.code = nodeDefinition.initialValues.code
|
||||
}
|
||||
if (nodeDefinition.initialValues.config !== undefined) {
|
||||
object.config = nodeDefinition.initialValues.config
|
||||
function applyInitialValues() {
|
||||
if (nodeDefinition.initialValues !== undefined) {
|
||||
if (nodeDefinition.initialValues.code !== undefined) {
|
||||
object.code = nodeDefinition.initialValues.code
|
||||
}
|
||||
if (nodeDefinition.initialValues.config !== undefined) {
|
||||
object.config = nodeDefinition.initialValues.config
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Connect to Parent */
|
||||
if (parentNodeDefinition.properties !== undefined) {
|
||||
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
|
||||
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
||||
let property = parentNodeDefinition.properties[i]
|
||||
if (property.childType === type) {
|
||||
function connectToParent() {
|
||||
/* Connect to Parent */
|
||||
if (parentNodeDefinition.properties !== undefined) {
|
||||
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
|
||||
for (let i = 0; i < parentNodeDefinition.properties.length; i++) {
|
||||
let property = parentNodeDefinition.properties[i]
|
||||
if (property.childType === type) {
|
||||
switch (property.type) {
|
||||
case 'node': {
|
||||
if (property.name !== previousPropertyName) {
|
||||
parentNode[property.name] = object
|
||||
previousPropertyName = property.name
|
||||
}
|
||||
}
|
||||
break
|
||||
case 'array': {
|
||||
if (parentNode[property.name] === undefined) {
|
||||
parentNode[property.name] = []
|
||||
}
|
||||
if (property.maxItems !== undefined) {
|
||||
if (parentNode[property.name].length < property.maxItems) {
|
||||
parentNode[property.name].push(object)
|
||||
} else {
|
||||
return // Object can not be created.
|
||||
}
|
||||
} else {
|
||||
parentNode[property.name].push(object)
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function autoAddChildren() {
|
||||
/* Auto Add more Children */
|
||||
if (nodeDefinition.properties !== undefined) {
|
||||
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
|
||||
for (let i = 0; i < nodeDefinition.properties.length; i++) {
|
||||
let property = nodeDefinition.properties[i]
|
||||
|
||||
switch (property.type) {
|
||||
case 'node': {
|
||||
if (property.name !== previousPropertyName) {
|
||||
parentNode[property.name] = object
|
||||
previousPropertyName = property.name
|
||||
if (property.autoAdd === true) {
|
||||
addUIObject(object, property.childType)
|
||||
previousPropertyName = property.name
|
||||
}
|
||||
}
|
||||
}
|
||||
break
|
||||
case 'array': {
|
||||
if (parentNode[property.name] === undefined) {
|
||||
parentNode[property.name] = []
|
||||
}
|
||||
if (property.maxItems !== undefined) {
|
||||
if (parentNode[property.name].length < property.maxItems) {
|
||||
parentNode[property.name].push(object)
|
||||
} else {
|
||||
return // Object can not be created.
|
||||
if (property.autoAdd === true) {
|
||||
if (object[property.name] === undefined) {
|
||||
object[property.name] = []
|
||||
}
|
||||
} else {
|
||||
parentNode[property.name].push(object)
|
||||
addUIObject(object, property.childType)
|
||||
}
|
||||
}
|
||||
break
|
||||
@@ -442,39 +493,6 @@ function newSuperalgosFunctionLibraryUiObjectsFromNodes() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
createUiObject(true, object.type, object.name, object, parentNode, chainParent)
|
||||
|
||||
/* Auto Add more Children */
|
||||
if (nodeDefinition.properties !== undefined) {
|
||||
let previousPropertyName // Since there are cases where there are many properties with the same name,because they can hold nodes of different types but only one at the time, we have to avoind counting each property of those as individual children.
|
||||
for (let i = 0; i < nodeDefinition.properties.length; i++) {
|
||||
let property = nodeDefinition.properties[i]
|
||||
|
||||
switch (property.type) {
|
||||
case 'node': {
|
||||
if (property.name !== previousPropertyName) {
|
||||
if (property.autoAdd === true) {
|
||||
addUIObject(object, property.childType)
|
||||
previousPropertyName = property.name
|
||||
}
|
||||
}
|
||||
}
|
||||
break
|
||||
case 'array': {
|
||||
if (property.autoAdd === true) {
|
||||
if (object[property.name] === undefined) {
|
||||
object[property.name] = []
|
||||
}
|
||||
addUIObject(object, property.childType)
|
||||
}
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return object
|
||||
}
|
||||
|
||||
function addMissingChildren(node, rootNodes) {
|
||||
|
||||
@@ -25,6 +25,7 @@ function newSuperalgosFunctionLibraryWorkspaceFunctions() {
|
||||
if (alreadyExist === false) {
|
||||
let child = UI.projects.superalgos.functionLibraries.uiObjectsFromNodes.addUIObject(node, project + ' Project', rootNodes, project)
|
||||
child.project = project
|
||||
child.projectDefinition.name = project
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,12 @@
|
||||
"positionLocked": true,
|
||||
"icon": "superalgos",
|
||||
"properties": [
|
||||
{
|
||||
"name": "projectDefinition",
|
||||
"type": "node",
|
||||
"childType": "Project Definition",
|
||||
"autoAdd": true
|
||||
},
|
||||
{
|
||||
"name": "spaces",
|
||||
"type": "node",
|
||||
@@ -45,6 +51,26 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "Project Definition",
|
||||
"menuItems": [
|
||||
{
|
||||
"action": "Delete UI Object",
|
||||
"askConfirmation": true,
|
||||
"confirmationLabel": "Confirm to Delete",
|
||||
"actionFunction": "payload.executeAction",
|
||||
"label": "Delete",
|
||||
"iconPathOn": "delete",
|
||||
"iconPathOff": "delete"
|
||||
}
|
||||
],
|
||||
"alternativeIcons": "Use Parent",
|
||||
"isTitleAllwaysVisible": false,
|
||||
"addLeftIcons": true,
|
||||
"isPinned": false,
|
||||
"level": 2,
|
||||
"propertyNameAtParent": "projectDefinition"
|
||||
},
|
||||
{
|
||||
"type": "Spaces",
|
||||
"menuItems": [
|
||||
|
||||
@@ -1166,8 +1166,27 @@ function newUiObject() {
|
||||
function iconPhysics() {
|
||||
icon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndType(thisObject.payload.node.project, thisObject.payload.node.type)
|
||||
let nodeDefinition = getNodeDefinition(thisObject.payload.node)
|
||||
|
||||
/*
|
||||
If we want this object to have an alternative icon (defined on a list of possible icons) but
|
||||
this definition does not belong to the current node but to a relative of it, then
|
||||
the property to use is alternativeIcons with a value of a string defining the nodePath to the
|
||||
node that actually has the icon list.
|
||||
|
||||
On the other hand, if this icon has the icon list definition, then the value of alternativeIcons
|
||||
shoudl be an array of the possible icons. Then to pick one icon from that list we will check
|
||||
the config.condeName of the node to see with which icon on the list matches.
|
||||
|
||||
Finally, if the node we are pointing to does not have a config or does not have a list of
|
||||
alternativeIcons, we will just use that node's icon for the current node.
|
||||
*/
|
||||
if (nodeDefinition.alternativeIcons !== undefined) {
|
||||
let nodeToUse = thisObject.payload.node
|
||||
if (nodeDefinition.alternativeIcons === 'Use Parent') {
|
||||
if (thisObject.payload.node.payload.parentNode !== undefined) {
|
||||
nodeToUse = thisObject.payload.node.payload.parentNode
|
||||
}
|
||||
}
|
||||
if (nodeDefinition.alternativeIcons === 'Use Reference Parent') {
|
||||
if (thisObject.payload.node.payload.referenceParent !== undefined) {
|
||||
nodeToUse = thisObject.payload.node.payload.referenceParent
|
||||
@@ -1184,22 +1203,31 @@ function newUiObject() {
|
||||
}
|
||||
nodeDefinition = getNodeDefinition(nodeToUse)
|
||||
let config = nodeToUse.config
|
||||
try {
|
||||
config = JSON.parse(config)
|
||||
let alternativeIcon
|
||||
let iconName
|
||||
for (let i = 0; i < nodeDefinition.alternativeIcons.length; i++) {
|
||||
alternativeIcon = nodeDefinition.alternativeIcons[i]
|
||||
if (alternativeIcon.codeName === config.codeName) {
|
||||
iconName = alternativeIcon.iconName
|
||||
if (config !== undefined && (Array.isArray(nodeDefinition.alternativeIcons) === true)) {
|
||||
try {
|
||||
config = JSON.parse(config)
|
||||
let alternativeIcon
|
||||
let iconName
|
||||
for (let i = 0; i < nodeDefinition.alternativeIcons.length; i++) {
|
||||
alternativeIcon = nodeDefinition.alternativeIcons[i]
|
||||
if (alternativeIcon.codeName === config.codeName) {
|
||||
iconName = alternativeIcon.iconName
|
||||
}
|
||||
}
|
||||
let newIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName(nodeToUse.project, iconName)
|
||||
if (newIcon !== undefined) {
|
||||
icon = newIcon
|
||||
}
|
||||
} catch (err) {
|
||||
nodeToUse.payload.uiObject.setErrorMessage('The config is not well formatted as a JSON object.')
|
||||
}
|
||||
} else {
|
||||
if (nodeDefinition.icon !== undefined) {
|
||||
let newIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName(nodeToUse.project, nodeDefinition.icon)
|
||||
if (newIcon !== undefined) {
|
||||
icon = newIcon
|
||||
}
|
||||
}
|
||||
let newIcon = UI.projects.superalgos.spaces.designSpace.getIconByProjectAndName('Superalgos', iconName)
|
||||
if (newIcon !== undefined) {
|
||||
icon = newIcon
|
||||
}
|
||||
} catch (err) {
|
||||
// Nothing to do if JSON is baddly formated.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1625,8 +1653,8 @@ function newUiObject() {
|
||||
}
|
||||
|
||||
if (UI.projects.superalgos.spaces.floatingSpace.inMapMode === true) {
|
||||
labelPoint.x = position.x - getTextWidth(label) / 2,
|
||||
labelPoint.y = position.y + 50 / 2 + lineSeparator * 2
|
||||
labelPoint.x = position.x - getTextWidth(label) / 2,
|
||||
labelPoint.y = position.y + 50 / 2 + lineSeparator * 2
|
||||
}
|
||||
printMessage(label)
|
||||
|
||||
|
||||
Reference in new issue
Block a user