UNPKG

create-gojs-kit

Version:

A CLI for downloading GoJS samples, extensions, and docs

321 lines (279 loc) 13.7 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"/> <meta name="description" content="Show the visual elements of a simple diagram as a nested grouping diagram -- each Group is data bound to an element of the other Diagram." /> <meta itemprop="description" content="Show the visual elements of a simple diagram as a nested grouping diagram -- each Group is data bound to an element of the other Diagram." /> <meta property="og:description" content="Show the visual elements of a simple diagram as a nested grouping diagram -- each Group is data bound to an element of the other Diagram." /> <meta name="twitter:description" content="Show the visual elements of a simple diagram as a nested grouping diagram -- each Group is data bound to an element of the other Diagram." /> <link rel="preconnect" href="https://rsms.me/"> <link rel="stylesheet" href="../assets/css/style.css"> <!-- Copyright 1998-2025 by Northwoods Software Corporation. --> <meta itemprop="name" content="Visual Tree using Groups" /> <meta property="og:title" content="Visual Tree using Groups" /> <meta name="twitter:title" content="Visual Tree using Groups" /> <meta property="og:image" content="https://gojs.net/latest/assets/images/screenshots/visualtreegrouping.png" /> <meta itemprop="image" content="https://gojs.net/latest/assets/images/screenshots/visualtreegrouping.png" /> <meta name="twitter:image" content="https://gojs.net/latest/assets/images/screenshots/visualtreegrouping.png" /> <meta property="og:url" content="https://gojs.net/latest/samples/visualTreeGrouping.html" /> <meta property="twitter:url" content="https://gojs.net/latest/samples/visualTreeGrouping.html" /> <meta name="twitter:card" content="summary_large_image" /> <meta property="og:type" content="website" /> <meta property="twitter:domain" content="gojs.net" /> <title> Visual Tree using Groups | GoJS Diagramming Library </title> </head> <body> <!-- This top nav is not part of the sample code --> <nav id="navTop" class=" w-full h-[var(--topnav-h)] z-30 bg-white border-b border-b-gray-200"> <div class="max-w-screen-xl mx-auto flex flex-wrap items-start justify-between px-4"> <a class="text-white bg-nwoods-primary font-bold !leading-[calc(var(--topnav-h)_-_1px)] my-0 px-2 text-4xl lg:text-5xl logo" href="../"> GoJS </a> <div class="relative"> <button id="topnavButton" class="h-[calc(var(--topnav-h)_-_1px)] px-2 m-0 text-gray-900 bg-inherit shadow-none md:hidden hover:!bg-inherit hover:!text-nwoods-accent hover:!shadow-none" aria-label="Navigation"> <svg class="h-7 w-7 block" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"> <path d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" stroke-linecap="round" stroke-linejoin="round"/> </svg> </button> <div id="topnavList" class="hidden md:block"> <div class="absolute right-0 z-30 flex flex-col items-end rounded border border-gray-200 p-4 pl-12 shadow bg-white text-gray-900 font-semibold md:flex-row md:space-x-4 md:items-start md:border-0 md:p-0 md:shadow-none md:bg-inherit"> <a href="../learn/">Learn</a> <a href="../samples/">Samples</a> <a href="../intro/">Intro</a> <a href="../api/">API</a> <a href="../download.html">Download</a> <a href="https://forum.nwoods.com/c/gojs/11" target="_blank" rel="noopener">Forum</a> <a id="tc" href="https://nwoods.com/contact.html" target="_blank" rel="noopener" onclick="getOutboundLink('https://nwoods.com/contact.html', 'contact');">Contact</a> <a id="tb" href="https://nwoods.com/sales/index.html" target="_blank" rel="noopener" onclick="getOutboundLink('https://nwoods.com/sales/index.html', 'buy');">Buy</a> </div> </div> </div> </div> </nav> <script> window.addEventListener("DOMContentLoaded", function () { // topnav var topButton = document.getElementById("topnavButton"); var topnavList = document.getElementById("topnavList"); if (topButton && topnavList) { topButton.addEventListener("click", function (e) { topnavList .classList .toggle("hidden"); e.stopPropagation(); }); document.addEventListener("click", function (e) { // if the clicked element isn't the list, close the list if (!topnavList.classList.contains("hidden") && !e.target.closest("#topnavList")) { topButton.click(); } }); // set active <a> element var url = window .location .href .toLowerCase(); var aTags = topnavList.getElementsByTagName('a'); for (var i = 0; i < aTags.length; i++) { var lowerhref = aTags[i] .href .toLowerCase(); if (lowerhref.endsWith('.html')) lowerhref = lowerhref.slice(0, -5); if (url.startsWith(lowerhref)) { aTags[i] .classList .add('active'); break; } } } }); </script> <div class="flex flex-col prose"> <div class="w-full max-w-screen-xl mx-auto"> <!-- * * * * * * * * * * * * * --> <!-- Start of GoJS sample code --> <script src="https://cdn.jsdelivr.net/npm/gojs@3.1.0"></script> <div id="allSampleContent" class="p-4 w-full"> <script id="code"> function init() { myDiagram = new go.Diagram('myDiagramDiv', { 'undoManager.isEnabled': true }); // define the "sample" Node template myDiagram.nodeTemplate = new go.Node('Auto') .add( new go.Shape('RoundedRectangle', { // define the node's outer shape fill: 'rgb(150, 60, 60)', stroke: 'rgb(235, 194, 117)', strokeWidth: 2 }) .bind('fill', 'color') .bind('stroke'), new go.TextBlock({ margin: 7 }) // define the node's text .bind('text') .bind('stroke') ); myDiagram.linkTemplate = new go.Link({ toShortLength: 2 }) .add( new go.Shape({ stroke: "rgb(150, 60, 60)", strokeWidth: 2 }), // the link shape new go.Shape({ // the arrowhead toArrow: "OpenTriangle", stroke: "rgb(150, 60, 60)", strokeWidth: 2 }) ); myDiagram.model = new go.GraphLinksModel( [ { key: 1, text: 'Alpha', color: 'rgba(243, 153, 73, 0.2)', stroke: 'rgb(150, 60, 60)'}, { key: 2, text: 'Beta', color: 'rgba(243, 153, 73, 0.2)', stroke: 'rgb(243, 153, 73)'} ], [{ from: 1, to: 2 }] ); // Now we can initialize a Diagram that looks at the visual tree that constitutes the Diagram above. myVisualTree = new go.Diagram('myVisualTree', { isReadOnly: true, // do not allow users to modify or select in this view allowSelect: false, layout: new go.TreeLayout({ nodeSpacing: 5 }) // automatically laid out as a tree }); // use Groups, not regular Nodes or Links, to show relationship of GraphObjects in myDiagram myVisualTree.groupTemplate = new go.Group('Auto', { layout: new go.GridLayout({ wrappingColumn: 2, alignment: go.GridAlignment.Position, cellSize: new go.Size(1, 1) }) }) .add( new go.Shape({ fill: "rgba(243, 153, 73, 0.2)", stroke: "rgb(150, 60, 60)", strokeWidth: 2 }), new go.Panel('Spot') .add( new go.Placeholder({ padding: new go.Margin(15, 5, 5, 5) }), new go.TextBlock({ font: 'bold 13px monospace', stroke: 'rgb(150, 60, 60)', margin: 5, alignment: go.Spot.Top, alignmentFocus: go.Spot.Top }) // bind the text to the Diagram/Layer/Part/GraphObject converted to a string .bind('text', '', x => x.toString()) ) ); drawVisualTree(); } function drawVisualTree() { var visualNodeDataArray = []; // recursively walk the visual tree, collecting objects as we go function traverseVisualTree(obj, parent) { obj.vtkey = visualNodeDataArray.length; visualNodeDataArray.push(obj); if (parent) { obj.parentKey = parent.vtkey; } if (obj instanceof go.Diagram) { var lit = obj.layers; while (lit.next()) traverseVisualTree(lit.value, obj); } else if (obj instanceof go.Layer) { var pit = obj.parts; while (pit.next()) traverseVisualTree(pit.value, obj); } else if (obj instanceof go.Panel) { var eit = obj.elements; while (eit.next()) traverseVisualTree(eit.value, obj); } } traverseVisualTree(myDiagram, null); myVisualTree.model = new go.GraphLinksModel({ nodeKeyProperty: 'vtkey', nodeGroupKeyProperty: 'parentKey', // always return true so that all node data is represented by groups nodeIsGroupProperty: data => true, nodeDataArray: visualNodeDataArray }); } window.addEventListener('DOMContentLoaded', init); </script> <div id="sample"> <b>myDiagram</b>, the diagram being inspected:<br /> <div id="myDiagramDiv" style="border: 1px solid black; width: 300px; height: 200px"></div> <br /> <button onclick="drawVisualTree()">Draw Visual Tree</button> <br /> <br /> <b>myVisualTree</b>, showing the Layers, Nodes and Links that are in <b>myDiagram</b> above:<br /> <div id="myVisualTree" style="border: 1px solid black; width: 100%; height: 400px"></div> <p> You can also try selecting, copying, and deleting parts in <b>myDiagram</b> and then click on "Draw Visual Tree" again to see how the visual tree in <b>myDiagram</b> changes. </p> <p>See also the <a href="visualTree.html">Visual Tree</a> sample, to show the same visual tree using nodes and links in a traditional tree structure.</p> </div> </div> <!-- * * * * * * * * * * * * * --> <!-- End of GoJS sample code --> </div> <div id="allTagDescriptions" class="p-4 w-full max-w-screen-xl mx-auto"> <hr/> <h3 class="text-xl">GoJS Features in this sample</h3> <!-- blacklist tags that do not correspond to a specific GoJS feature --> <h4>Grid Layouts</h4> <p> This predefined layout is used for placing Nodes in a grid-like arrangement. Nodes can be ordered, spaced apart, and wrapped as needed. This Layout ignores any Links connecting the nodes being laid out. More information can be found in the <a href="../intro/layouts.html#GridLayout">GoJS Intro</a>. </p> <p> <a href="../samples/index.html#gridlayout">Related samples</a> </p> <hr> <!-- blacklist tags that do not correspond to a specific GoJS feature --> <h4>Tree Layout</h4> <p> This predefined layout is used for placing Nodes of a tree-structured graph in layers (rows or columns). For discussion and examples of the most commonly used properties of the <a href="../api/symbols/TreeLayout.html">TreeLayout</a>, see the <a href="../intro/trees.html">Trees</a> page in the Introduction. More information can be found in the <a href="../intro/layouts.html#TreeLayout">GoJS Intro</a>. </p> <p> <a href="../samples/index.html#treelayout">Related samples</a> </p> <hr> <!-- blacklist tags that do not correspond to a specific GoJS feature --> <h4>Groups</h4> <p> The <a href="../api/symbols/Group.html" target="api">Group</a> class is used to treat a collection of <a href="../api/symbols/Node.html" target="api">Node</a>s and <a href="../api/symbols/Link.html" target="api">Link</a>s as if they were a single <a href="../api/symbols/Node.html" target="api">Node</a>. Those nodes and links are members of the group; together they constitute a subgraph. </p> <p> A subgraph is <em>not</em> another <a href="../api/symbols/Diagram.html" target="api">Diagram</a>, so there is no separate HTML Div element for the subgraph of a group. All of the <a href="../api/symbols/Part.html" target="api">Part</a>s that are members of a <a href="../api/symbols/Group.html" target="api">Group</a> belong to the same Diagram as the Group. There can be links between member nodes and nodes outside of the group as well as links between the group itself and other nodes. There can even be links between member nodes and the containing group itself. </p> <p> More information can be found in the <a href="../intro/groups.html">GoJS Intro</a>. </p> <p> <a href="../samples/index.html#groups">Related samples</a> </p> <hr> </div> </div> </body> <!-- This script is part of the gojs.net website, and is not needed to run the sample --> <script src="../assets/js/goSamples.js"></script> </html>