Gojs Subnode Arrangement Direction


#1

Why are the nodes in the green box arranged vertically?

image

The code is as follows:

var gojs = go.GraphObject.make;
diagram =
gojs(go.Diagram, “workdaily-gojs”,
{
allowMove: false,
initialDocumentSpot: go.Spot.Center,
initialViewportSpot: go.Spot.Center,
layout:
gojs(go.TreeLayout,
{
treeStyle: go.TreeLayout.StyleLastParents,
angle: 90,
layerSpacing: 80,
alternateAngle: 0,
alternateAlignment: go.TreeLayout.AlignmentStart,
alternateNodeIndent: 20,
alternateNodeIndentPastParent: 1,
alternateNodeSpacing: 20,
alternateLayerSpacing: 40,
alternateLayerSpacingParentOverlap: 1,
alternatePortSpot: new go.Spot(0.001, 1, 20, 0),
alternateChildPortSpot: go.Spot.LeftCenter
})
});

    diagram.nodeTemplate =
      gojs(go.Node, "Auto", { contextMenu: gojs(go.Adornment) },
        gojs(go.Shape, "Rectangle",
          { name: "SHAPE", fill: "white", stroke: null }),
        gojs(go.Panel, "Table",
          { margin: 6, maxSize: new go.Size(200, NaN) },
          gojs(go.RowColumnDefinition,
            {
                column: 0,
                stretch: go.GraphObject.Horizontal,
                alignment: go.Spot.Center
            }),
         
          gojs(go.Picture,
            {
                row: 0, column: 0, margin: 2, rowSpan: 3,
                imageStretch: go.GraphObject.Uniform,
                alignment: go.Spot.Center,
               
              
               
            },
        
    new go.Binding("desiredSize", "id", function () { return new go.Size(50, 50) }),
    new go.Binding("source", "id", function (id) {
        return openinfo.orgwebs_url + '/?userphoto=' + id;
    })),
     
  
  gojs(go.TextBlock,
    {
        row: 0, column: 1,
        maxSize: new go.Size(160, NaN), margin: 2,
        font: "12px 'Microsoft Yahei'",
        stroke: "white",
        alignment: go.Spot.Left
    },
    new go.Binding("text", "name")),
  gojs(go.TextBlock,
    {
        row: 1, column: 1,
        maxSize: new go.Size(160, NaN), margin: 2,
        font: "12px 'Microsoft Yahei'",
        stroke: "white",
        alignment: go.Spot.Left
    },
    new go.Binding("text", "duty")),
  gojs(go.TextBlock,
    {
        row: 2, column: 1,
        maxSize: new go.Size(160, NaN), margin: 2,
        font: "12px 'Microsoft Yahei'",
        stroke: "white",
        alignment: go.Spot.Left
    },
    new go.Binding("text", "task")),
  gojs("TreeExpanderButton", {
      row: 0, column: 2, rowSpan: 3,
      width: 20,
      height: 20,
      alignment: go.Spot.Right,
      click: function (e, obj) {
          if (obj.part != null) {
              expandNode(obj.part);
                     
          }
      }
  })
        )
      );

    diagram.linkTemplate =
      gojs(go.Link, go.Link.Orthogonal,
        { corner: 5, selectable: false },
        gojs(go.Shape, { strokeWidth: 1, stroke: "#424242" }));

    overview =
      gojs(go.Overview, "workdaily-gojs-overview",
        { observed: diagram, contentAlignment: go.Spot.Center });

    var colors = {
        leader: '#AC193D',
        login: '#2672EC',
        subordinate: '#8C0095'
    };

    diagram.layout.commitNodes = function () {
        go.TreeLayout.prototype.commitNodes.call(diagram.layout);
        diagram.layout.network.vertexes.each(function (v) {
            if (v.node) {
                var color = colors[v.node.data.role];
                var shape = v.node.findObject("SHAPE");
                if (shape) {
                    shape.fill = gojs(go.Brush, "Linear", { 0: color, 1: color, start: go.Spot.Left, end: go.Spot.Right });
                }
            }
        });
    };

    var cxTool = diagram.toolManager.contextMenuTool;
    var cxElement = document.getElementById("workdaily-gojs-contextmenu");
    cxElement.addEventListener("contextmenu", function (e) {
        e.preventDefault();
        return false;
    }, false);
    cxElement.addEventListener("blur", function (e) {
        cxTool.stopTool();
        if (cxTool.canStart()) {
            diagram.currentTool = cxTool;
            cxTool.doMouseUp();
        }
    }, false);
    cxElement.tabIndex = "1";
    cxTool.showContextMenu = function (contextmenu, obj) {
        var _diagram = this.diagram;
        if (_diagram === null) return;
        if (contextmenu !== this.currentContextMenu) {
            this.hideContextMenu();
        }
        var display = false;
        if (obj.part.data.role == 'subordinate') {
            display = true;
        }
        if (display) {
            cxElement.style.display = "block";
            cxElement.setAttribute('data-uid', obj.part.data.id);
        }
        var mousePt = _diagram.lastInput.viewPoint;
        cxElement.style.left = mousePt.x + "px";
        cxElement.style.top = mousePt.y + 40 + "px";
        this.currentContextMenu = contextmenu;

        // gojs-view
        $('#workdaily .dv-gojs-task .workdaily-header .title').text('“' + obj.part.data.name + '”的任务')
    }
    cxTool.hideContextMenu = function () {
        if (this.currentContextMenu === null) return;
        cxElement.style.display = "none";
        cxElement.setAttribute('data-uid', '');
        this.currentContextMenu = null;
    } 

function expandNode(node) {

    diagram.startTransaction("CollapseExpandTree");
    if (!node.data.everExpanded) {
        diagram.model.setDataProperty(node.data, "everExpanded", true);
        appendNode(node);
    }
    if (node.isTreeExpanded) {
        diagram.commandHandler.collapseTree(node);
    } else {
        diagram.commandHandler.expandTree(node);
    }
    diagram.commitTransaction("CollapseExpandTree");
};
function appendNode(node) {
    showWaitOverlay('.dv-gojs');
    $.ajax({
        url: openinfo.root + 'workdaily/gojstreesubordinate',
        data: { uid: node.data.id },
        type: 'POST',
        dataType: 'json',
        success: function (ret) {
            if (ret.code == '00000') {
                var subordinate = ret.data;
             
                for (var i = 0; i < subordinate.length; i++) {
                    if (subordinate[i].sub) {
                        diagram.nodeTemplate.isTreeLeaf = false;
                    }
                    else {
                        diagram.nodeTemplate.isTreeLeaf = true;
                    }
                    diagram.model.addNodeData({
                        key: subordinate[i].id,
                        parent: node.data.key,
                        name: subordinate[i].name,
                        id: subordinate[i].id,
                        role: 'subordinate',
                        duty: '职务:',
                        task: '任务:' + subordinate[i].task || '0'

                    });
                    if (subordinate[i].sub) {
                        var _node = diagram.findNodeForKey(subordinate[i].id);
                        diagram.commandHandler.collapseTree(_node);
                    }
                }
               
            }
            else {
                swal('错误提示', ret.msg, 'error');
            }
            hideWaitOverlay();
        },
        error: function (xhr, msg, ex) {
            error(xhr, msg, ex);
            hideWaitOverlay();
        }
    });
};

#2

The TreeLayout is configured to layout the last parents’ children vertically, in order to reduce the breadth of the results.