forked from NorthwoodsSoftware/GoJS
-
Notifications
You must be signed in to change notification settings - Fork 1
/
changelog.html
973 lines (888 loc) · 38.9 KB
/
changelog.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
<!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="GoJS Change Log"/><link rel="stylesheet" href="./assets/css/style.css"/>
<!-- Copyright 1998-2023 by Northwoods Software Corporation. --> <title>GoJS Change Log</title>
<link rel="stylesheet" href="./assets/css/prism.css" />
</head>
<body>
<nav id="navTop" class="w-full z-30 top-0 text-white bg-nwoods-primary">
<div class="w-full container max-w-screen-lg mx-auto flex flex-wrap sm:flex-nowrap items-center justify-between mt-0 py-2">
<div class="md:pl-4">
<a class="text-white hover:text-white no-underline hover:no-underline
font-bold text-2xl lg:text-4xl rounded-lg hover:bg-nwoods-secondary " href=".">
<h1 class="my-0 p-1 ">GoJS</h1>
</a>
</div>
<button id="topnavButton" class="rounded-lg sm:hidden focus:outline-none focus:ring" aria-label="Navigation">
<svg fill="currentColor" viewBox="0 0 20 20" class="w-6 h-6">
<path id="topnavOpen" fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM9 15a1 1 0 011-1h6a1 1 0 110 2h-6a1 1 0 01-1-1z" clip-rule="evenodd"></path>
<path id="topnavClosed" class="hidden" fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
</svg>
</button>
<div id="topnavList" class="hidden sm:block items-center w-auto mt-0 text-white p-0 z-20">
<ul class="list-reset list-none font-semibold flex justify-end flex-wrap sm:flex-nowrap items-center px-0 pb-0">
<li class="p-1 sm:p-0"><a class="topnav-link" href="./learn/">Learn</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="./samples/">Samples</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="./intro/">Intro</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="./api/">API</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/products/register.html">Register</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="./download.html">Download</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="https://forum.nwoods.com/c/gojs/11">Forum</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/contact.html"
target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/contact.html', 'contact');">Contact</a></li>
<li class="p-1 sm:p-0"><a class="topnav-link" href="https://www.nwoods.com/sales/index.html"
target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy');">Buy</a></li>
</ul>
</div>
</div>
<hr class="border-b border-gray-600 opacity-50 my-0 py-0" />
</nav>
<div class="container max-w-5xl mx-auto mb-8">
<div class="pt-4 px-2 lg:px-4 pb-16 w-full overflow-hidden">
<h1>GoJS Change Log</h1>
<p id="ver"></p>
<p>
We maintain a <a href="https://github.com/NorthwoodsSoftware/GoJS">GitHub Repository</a>, which
you can star to follow version updates. We also notify of changes on
<a href="https://twitter.com/NorthwoodsGo">Twitter</a>.
</p>
<hr />
<h2 id="2.3">GoJS 2.3</h2>
<h3>New SVG Rendering Context</h3>
<p>
GoJS typically renders the Diagram to an HTML Canvas, and offers exporting the Diagram scene to
image formats and SVG. In GoJS 2.3, the library now supports rendering to a live SVG context in
addition to the default Canvas context. Visually there should be no changes, and performance will
be faster when using the default Canvas context, but the SVG context may be useful for
applications where DOM accessibility is paramount, either because users need to select and copy
text, or because screen readers need access to all text in the application.
</p>
<p>
The new SVG rendering context comes with <strong>significant</strong> changes and upgrades to the
GoJS SVG structure, including export SVG. For example, an object with a
<code>clip-path</code> would formerly point to a <code><clippath></code> via URL, and now
clipping paths are defined in-line. These changes make some <code>elementFinished</code> code in
<a>Diagram.makeSvg</a> potentially incompatible.
</p>
<p>
<a href="intro/SVGContext.html">Read more about the SVG Rendering Context here</a>
</p>
<h3>New Layered Digraph Layout Option for Better Performance</h3>
<p>
Version 2.3 adds <a>LayeredDigraphLayout.alignOption</a> as a potentially faster alternative to
<a>LayeredDigraphLayout.packOption</a>. When using this option, nodes are assigned coordinates
within their layers to produce straighter paths of nodes and small edge lengths.
</p>
<h3>General New Features in GoJS 2.3</h3>
<ul>
<li>
Added <a>PathFigure.isEvenOdd</a> - <a>PathFigure</a>s now support the "even-odd" fill rule.
This can be set with the new property <a>PathFigure.isEvenOdd</a> or when making SVG-like Path
syntax, with the fill rule <code>F0</code> (instead of the default <code>F</code> or
<code>F1</code>), eg <code>"F0 M 0 0 L 50 50 ..."</code>.
</li>
<li>Added <a>Size.inflate</a>.</li>
<li>
Bugfixes for shadow drawing in TableRows and TableColumns, and when Shapes have a background
set.
</li>
<li>Bugfixes for Table Panel separators when the Panel is scaled.</li>
<li>
Arguments passed to <a>Diagram.scroll</a> have been made consistent. Scrolling
<code>'left'</code> 150 pixels will scroll left, but scrolling <code>'left'</code> -150 pixels
will scroll right.
</li>
<li>
<a>GraphObject,build</a> now takes a third argument, which is passed to
<a>GraphObject,takeBuilderArgument</a>, if used.
</li>
<li><a>Point,intersectingLineSegments</a> now tests for collapsed lines.</li>
<li>
The PDF samples in <code>projects/pdf</code> now use SVG for rendering diagrams, instead of
raster images. This improves the quality of the pages and uses much less memory for large
diagrams.
</li>
</ul>
<hr />
<h4 id="2.3.7">Changes for 2.3.7</h4>
<ul>
<li>Improved SVG rendering of clipped <a>GraphObject</a>s.</li>
<li>Diagrams now explicitly sets CSS <code>letterSpacing</code> and <code>wordSpacing</code> values to <code>normal</code> on the Diagram's canvas or SVG container.</li>
</ul>
<h4 id="2.3.6">Changes for 2.3.6</h4>
<ul>
<li>Fixes for SVG rendering of clipped <a>Picture</a>s.</li>
</ul>
<h4 id="2.3.5">Changes for 2.3.5</h4>
<ul>
<li>Added <a>Panel.addRowDefinition</a> and <a>Panel.addColumnDefinition</a> as convenience methods for
<a>Panel.addRowColumnDefinition</a>
</li>
<li>Shape's <a>GraphObject.naturalBounds</a> now correctly considers <a>GraphObject.minSize</a> and
<a>GraphObject.maxSize</a>
</li>
<li>Scroll-wheel fix for legacy browsers and synthetic events.</li>
</ul>
<h4 id="2.3.4">Changes for 2.3.4</h4>
<ul>
<li>Fixed an animation issue with collapsed links incorrectly saving nested routes that were no longer valid.</li>
<li>Fixes for SVG rendering of Graduated Panels and clipping areas.</li>
<li>SVG renderer now sets the <code><svg></code> element CSS to <code>display: block</code> for Diagram size
consistency.</li>
<li>Fixed updating other links' JumpOver or JumpGap rendering when a link changes visibility.</li>
<li>
Elements of Spot Panels that have a <a>GraphObject.stretch</a> set and have a negative
<a>GraphObject.margin</a> value will expand beyond their stretch size by that margin value.
</li>
</ul>
<h4 id="2.3.3">Changes for 2.3.3</h4>
<ul>
<li>Added <code>init</code> optional argument to <a>RowColumnDefinition</a> constructor.</li>
<li>Added <a>Panel.addRowColumnDefinition</a></li>
<li>Fixed some Pointer events when using both a touch device and a mouse or trackpad.</li>
<li>Fixed Overview drawing when the scale is very small.</li>
<li>Fixed several rendering bugs when <a>Diagram.renderer</a> is "svg".</li>
<li>Inserted work-around for Chrome bug rendering grid when the debugger is open.</li>
</ul>
<h4 id="2.3.2">Changes for 2.3.2</h4>
<ul>
<li>Fixed updating the cursor when dragging after possibly auto-scrolling.</li>
<li>Fixed successive calls to <a>Diagram.makeSvg</a> creating potentially incomplete SVG.</li>
<li>
Fixed routing of particular Bezier links by <a>LayeredDigraphLayout</a> when using the new
<a>LayeredDigraphLayout.alignOption</a>
</li>
<li>
Changing <a>Diagram.div</a> from null to a DIV will no longer redo Diagram initialization if it
had been set to a DIV previously.
</li>
</ul>
<h4 id="2.3.1">Changes for 2.3.1</h4>
<ul>
<li>Fixed <a>Diagram.makeSvg</a> when a background option is specified.</li>
<li>Fixed successive calls to <a>Diagram.makeSvg</a> creating potentially blank SVG.</li>
</ul>
<hr class="pt-4 mb-8" />
<h2 id="2.2">GoJS 2.2</h2>
<p>
GoJS 2.2 introduces a number of properties and methods for convenience and to improve
customization. GoJS 2.2 also includes new methods for constructing objects, and enhances
<a href="intro/typings.html">TypeScript typings support</a>.
</p>
<p>
GoJS 2.2 also includes several performance enhancements when drawing large graphs, reduced memory
usage, and more efficient replacing or merging of item Arrays.
</p>
<p>
Some of the samples and written documentation have been upgraded to use more modern JavaScript:
<code>class</code>es, arrow functions, <code>const</code> and <code>let</code>, so the samples and
documentation might no longer be viewable using old browsers such as Internet Explorer 11 or some
old Android browsers. The library and the extensions continue to target ES5 (ES2012), so that apps
using the library can still work on IE11.
</p>
<h3>Method Chaining and New Ways to Build Objects</h3>
<p>
In GoJS 2.2 many methods that previously returned <code>void</code> now return the method's
instance, to promote method chaining. GoJS 2.2 also introduces several new methods or arguments to
allow type-checking of settings by compilers and in text editors.
</p>
Several existing methods now return their instance:
<ul>
<li>
<a>GraphObject.setProperties</a> and <a>Diagram.setProperties</a> - and their new synonyms
<a>GraphObject.attach</a> and <a>Diagram.attach</a>
</li>
<li><a>Panel.add</a></li>
<li><a>GraphObject.bind</a>, which also has new functionality via method overloads.</li>
<li><a>GraphObject.trigger</a> - to add <a>AnimationTrigger</a>s to a GraphObject</li>
<li>
<a>Diagram.addEventListener</a>, <a>Diagram.addChangedListener</a>,
<a>Diagram.addModelChangedListener</a>,
<a>Model.addChangedListener</a>
</li>
<li><a>Diagram.addLayer</a>, <a>Diagram.addLayerBefore</a>, <a>Diagram.addLayerAfter</a></li>
<li><a>Animation.add</a>, and <a>Animation.addTemporaryPart</a></li>
</ul>
GraphObject constructors now accept one or two optional arguments. The first is the value for a
common property, and the second is a JavaScript Object detailing properties to initialize. For
example, one can now write:
<ul>
<li><code>new go.TextBlock("Some Text", { margin: 5 })</code></li>
<li><code>new go.Picture("sourceURI.png", { width: 30, height: 30 })</code></li>
<li><code>new go.Shape("RoundedRectangle", { fill: "blue", stroke: "yellow" })</code></li>
<li><code>new go.Panel("Auto", { padding: 10, background: "green" })</code></li>
</ul>
<p>This means that one can now write code like:</p>
<pre class="lang-js"><code>// Create a Node and add a Shape and a TextBlock to it:
myDiagram.nodeTemplate =
new go.Node("Vertical")
.add(new go.Shape({ width: 40, height: 40, fill: "white" }) // default width & height & fill
.bind("width") // binds data.width to Shape.width
.bind("height")
.bind("fill", "color") // binds data.color to Shape.fill
.bind("figure", "fig")) // data.fig should be the registered name of a geometry figure generator
.add(new go.TextBlock("(no name)", // default string to display
{ isMultiline: false, editable: true })
.bind("text", "name", null, null)); // TwoWay Binding of TextBlock.text with data.name without converters
</code></pre>
<p>
New methods <a>GraphObject.set</a> and <a>Diagram.set</a> return their instance. When using
TypeScript definitions, the compiler checks these calls for GraphObject and Diagram property
existence and value types.
</p>
<p>
New method <a>GraphObject.apply</a> can be used to define common functions that provide settings
and bindings. Such customizations can then be applied to a GraphObject that you are initializing
by calling <a>GraphObject.apply</a>
with that function.
</p>
<p>
Together, these changes remove the need to use <a>GraphObject,make</a> when concisely defining
Diagrams and templates. For a complete example, this code:
</p>
<pre class="lang-js"><code>const $ = go.GraphObject.make;
const myDiagram = $(go.Diagram, "myDiagramDiv",
{
"undoManager.isEnabled": true
});
myDiagram.nodeTemplate =
$(go.Node, "Auto",
$(go.Shape, "RoundedRectangle",
{ strokeWidth: 0, fill: "white" },
new go.Binding("fill", "color")),
$(go.TextBlock,
{ margin: 8, font: "bold 14px sans-serif", stroke: '#333' },
new go.Binding("text", "key"))
);
</code></pre>
<p>Can now be written as:</p>
<pre class="lang-js"><code>const myDiagram = new go.Diagram("myDiagramDiv",
{
"undoManager.isEnabled": true
});
myDiagram.nodeTemplate =
new go.Node("Auto")
.add(new go.Shape("RoundedRectangle", { strokeWidth: 0, fill: "white" })
.bind("fill", "color"))
.add(new go.TextBlock({ margin: 8, font: "bold 14px sans-serif", stroke: '#333' })
.bind("text", "key"));
</code></pre>
<p>
For more information and examples, see the
<a href="intro/buildingObjects.html">intro page on Building Objects</a>.
</p>
<h3>General New Features in GoJS 2.2</h3>
<ul>
<li>
Spot Panels now support <a>Panel.alignmentFocusName</a> on the main element. This can be useful
for creating Spot panels with multiple item arrays that align to the same main element. There is
an example of this property in the
<a href="intro/panels.html#AligningSubElementsSpotPanels">Spot Panel section of the Panel intro page</a>.
</li>
<li>
The <a>Diagram.autoScrollInterval</a> property controls the milliseconds between autoscroll
events.
</li>
<li>
The <a>Diagram.delayInitialization</a>'s argument function is now a passed a reference to the
Diagram.
</li>
<li>
The <a>Overview.drawsGrid</a> and <a>Overview.updateDelay</a> properties control drawing by an
Overview.
</li>
<li>
The <a>CommandHandler.isZoomToFitRestoreEnabled</a> property controls whether the
<a>CommandHandler.zoomToFit</a>
command ever restores the previous Diagram scale and position.
</li>
<li>
The <a>DraggingTool.copyCursor</a>, <a>DraggingTool.moveCursor</a>, and
<a>DraggingTool.nodropCursor</a> properties modify the cursors during a drag.
</li>
<li>The <a>LinkingBaseTool.linkingCursor</a> property modifies the cursor during linking.</li>
<li>
The <a>GraphObject.findBindingPanel</a> method walks up the visual tree to return the first
Panel whose <a>Panel.data</a> is bound to data. Used in the
<a href="extensions/Hyperlink.html" target="_blank">Hyperlink</a> sample.
</li>
<li>
The <a>Panel.copyTemplate</a> method makes a deep copy of a Panel, including its Bindings, to
allow use of the result in templates. This is used in
<a href="/extras/linkLabelsInFront.html" target="_blank">LinkLabels In Front</a> sample.
</li>
<li>
The <a>TextBlock.formatting</a> property controls the policy of trimming whitespace on TextBlock
text. This can be useful when text strings are preformatted.
</li>
<li>
The <a>TextBlock.lineHeight</a> read-only property provides better information about how the
text is being measured and rendered.
</li>
<li>
The <a>TextBlock.spacingAbove</a> and <a>TextBlock.spacingBelow</a> properties better control
the measuring and rendering in addition to the <a>TextBlock.lineHeight</a>.
</li>
<li>
The <a>Node.findExternalTreeLinksConnected</a> method returns a collection of Links that connect
with this Node or any in its subtree, excluding any isTreeLink Links. This is the
tree-equivalent of <a>Group.findExternalLinksConnected</a> for Groups/subgraphs.
</li>
<li>
The <a>Node.findVisibleNode</a> method walks up the chain of <a>Node.containingGroup</a>s to
find the first node that is visible. This can be overridden to change behavior, as it is in
<a href="samples/treeMapper.html" target="_blank">Tree Mapper</a> sample.
</li>
<li>
The <a>PanelLayout.remeasureObject</a> method forces a specific GraphObject (but none of its
containing panels) to remeasure. This can be useful implementing custom layouts.
</li>
<li>
The <a>DraggingTool</a> now optimizes transactions to reduce memory usage by only saving the
first and last drag changes. This can be changed by overriding
<a>DraggingTool.stopTransaction</a>.
</li>
<li>
The <a>Binding</a> constructor now accepts a back-converter as an argument. A null or function
argument value as the fourth argument will automatically call <a>Binding.makeTwoWay</a>> for
you. Not supplying the fourth argument or passing it undefined will leave the Binding OneWay, as
it has in the past.
</li>
<li>The <a>RadialLayout</a> extension by default spreads the children better.</li>
<li>The <a>TextEditingTool</a> now stops any default animation when the tool is activated.</li>
<li>
The <a>TextEditingTool</a> now respects the vertical alignment when a TextBlock is taller than
its text.
</li>
<li>
<a>InputEvent.bubbles</a> allows events to bubble beyond the Diagram div. This can be useful in
<a>CommandHandler</a> and <a>Tool</a> method overrides.
</li>
<li>
<em>For some testing environments:</em> <a>Diagram,isUsingDOM</a> and <a>Diagram,useDOM</a>
can query and control the GoJS library's expectation of a DOM existing.
</li>
<li>
Fixed a regression from 2.1.29 where some links may update their geometries outside of a
transaction.
</li>
<li>
<em>Potentially incompatible:</em> Touch and Mouse events have been replaced internally with
Pointer events. The GoJS API has not changed, nor has its behavior, as long as the browser is
not so old that it does not implement pointer events.
</li>
</ul>
<h3>Easier Manipulation and Customization of Geometries</h3>
<p>
GoJS 2.2 contains new methods to simplify geometric calculations and more easily customize
geometries.
</p>
<ul>
<li>
<a>Point,intersectingLineSegments</a> is a static function that returns true if two finite
straight line segments intersect each other.
</li>
<li>
<a>Rect,intersectsLineSegment</a> is a static function that returns true if a rectangular area
is intersected by a finite straight line segment.
</li>
<li>
<a>Point,compareWithLineSegment</a> is a static function that compares a point with a finite
straight line segment, given x,y numbers. <a>Point.compareWithLineSegmentPoint</a> is a method
that performs the same comparison, but on Points.
</li>
<li>
<a>Geometry.containsPoint</a> is a method that returns true if the Geometry contains a given
point.
</li>
<li>
The <a>Link.routeBounds</a> read-only property returns the bounds of the Link geometry in
document coordinates. Used in the
<a href="extensions/BalloonLink.html" target="_blank">BalloonLink</a> sample.
</li>
<li>
The <a>Node.getAvoidableRect</a> method returns the area to be avoided for this node, by default
equal to the node's <a>GraphObject.actualBounds</a> plus the <a>Node.avoidableMargin</a>. This
method can be overridden to customize AvoidsNodes routing behavior near a node to account for
the visual area occupied by the node being smaller than the full rectangular bounds of the node.
</li>
<li>
Groups now implement <a>Panel.isClipping</a>. If set to true on a Group and if the group has a
<a>Group.placeholder</a>, the group will visually clip its member nodes and links. This does not
change how those parts are measured, nor does it affect how those parts may be positioned.
</li>
<li>
The <a>Layer.isInDocumentBounds</a> property allows finer control of which layers are part of
the <a>Diagram.documentBounds</a>. Before 2.2, only layers with <a>Layer.isTemporary</a> set to
true were excluded from the document bounds (and could not be explicitly included).
</li>
<li>
The <a>ResizingTool.oppositePoint</a> property returns the Point opposite to the chosen, dragged
handle of the "Resizing" Adornment. This allows customizations like the
<a href="/extras/groupResizingLimited.html" target="_blank">LimitedGroupResizingTool</a> sample,
which demonstrates a custom tool to allow resizing groups while disallowing the group to resize
smaller than its members, and also disallowing the group to expand to cover any non-member
nodes.
</li>
<li>
The <code>RoundedRectangles</code> extension code now includes definitions for the
"RoundedLeftRectangle" and "RoundedRightRectangle" figures. The definitions for all four
"Rounded...Rectangle" figures has been modified slightly to better match the curves of a full
"RoundedRectangle".
</li>
</ul>
<hr />
<h4 id="2.2.23">Changes for 2.2.23</h4>
<ul>
<li>
Line (and therefore Link) intersection fix for some shape geometries containing arcs and
beziers, when the start or end of the curve overlaps the adjacent path point.
</li>
</ul>
<h4 id="2.2.22">Changes for 2.2.22</h4>
<ul>
<li>
Disallow browser wheel events on the Diagram canvas from bubbling if the wheel has a horizontal
component. This bubble prevention also prevents the browser in some systems from committing page
"back" and "forward" actions.
</li>
<li>
Fixed a bug where resetting <a>Picture.source</a> to the empty string may cause a property set
error.
</li>
</ul>
<h4 id="2.2.21">Changes for 2.2.21</h4>
<ul>
<li>
Improved <a>Link.makeGeometry</a> so that overrides do not need to test for situations where a
Link has fewer than two points.
</li>
<li>Improved shadows when Diagram and Part are scaled.</li>
</ul>
<h4 id="2.2.20">Changes for 2.2.20</h4>
<ul>
<li>
Improved <a>LinkingTool.doActivate</a> to assign the location of the
<a>LinkingBaseTool.temporaryToNode</a> (or the <a>LinkingBaseTool.temporaryFromNode</a>, if
drawing a link in the reverse direction) so as to avoid momentarily seeing where the temporary
node had been the last time the user tried to draw a new link.
</li>
<li>
Corrected functionality when a browser cancels a Pointer event (for instance when the browser is
minimized during ongoing Pointer events).
</li>
<li>
Corrected <a>GraphObject.mouseLeave</a> sometimes not getting called when the user's pointer
leaves the Diagram.
</li>
<li>Fixed iOS Safari text highlighting when dragging Pointer events out of a Diagram.</li>
<li>
Fixed a regression from 2.2.18 where link JumpOvers might cause "Change not within a
transaction" warnings on model load.
</li>
</ul>
<h4 id="2.2.19">Changes for 2.2.19</h4>
<ul>
<li>
Event fix for some platforms that reimplement DOM functionality (Polymer and Salesforce Aura
components).
</li>
<li>
Graduated panels no longer display shadows on Shape and TextBlock elements when those elements
explicitly disable shadows with <a>GraphObject.shadowVisible</a>.
</li>
</ul>
<h4 id="2.2.18">Changes for 2.2.18</h4>
<ul>
<li>Fix for some initialization animations which could set <a>Part.location</a> incorrectly.</li>
<li>
Fixed operation of the <a>LinkShiftingTool</a> extension when the mouse is inside the connected
node.
</li>
<li>
The TypeScript extensions are now compiled with options
<code>"noImplicitOverride": true, "noUnusedLocals": true</code>.
</li>
<li>Fix since 2.2.0: Link bounds now always contain all JumpOvers.</li>
<li>
Fix since 2.2.0: When a <a>Diagram.autoScale</a> is applied, dragging Parts outside of the
viewport now reliably triggers a redraw.
</li>
</ul>
<h4 id="2.2.17">Changes for 2.2.17</h4>
<ul>
<li>Internal performance optimizations.</li>
<li>
<a>LinkLabelDraggingTool</a> extension now supports labels with
<a>GraphObject.segmentIndex</a> of NaN.
</li>
<li>
Static Brush functions will no longer trigger Chrome's warning about <code>willReadOnly</code>.
</li>
</ul>
<h4 id="2.2.16">Changes for 2.2.16</h4>
<ul>
<li>
Fixed a regression from 2.2.13 that caused chained animations (calls to an
<a>Animation.start</a> inside annother Animation's <a>Animation.finished</a>) to fail.
</li>
<li>
Fixed <a>Picture.successFunction</a>/<a>Picture.errorFunction</a> not firing when a Part with a
Picture is copied, and that Picture's <a>Picture.source</a> is not data-bound.
</li>
<li>
Fixed a regression from 2.1.50 where setting a <a>Picture.source</a> binding and a default value
would fail to use the default value, if there was no data to bind.
</li>
</ul>
<h4 id="2.2.15">Changes for 2.2.15</h4>
<ul>
<li>
Fixed non-Path <a>Geometry</a> copies not to have a null value for <a>Geometry.figures</a>.
</li>
<li>
Improved the calculation of the midpoint of Bezier curve Links that have exactly three points in
their route.
</li>
<li>Fixed some empty Table panels causing an exception.</li>
<li>Loading the GoJS library twice is now a console warning, instead of an error.</li>
</ul>
<h4 id="2.2.14">Changes for 2.2.14</h4>
<ul>
<li>
Diagram Layouts with <a>Layout.isRealtime</a> set to <code>true</code> will no longer attempt
real-time layouts during the <a>DraggingTool</a> operation.
</li>
<li>Graduated Panels now deal with highly precise floating point numbers more accurately.</li>
</ul>
<h4 id="2.2.13">Changes for 2.2.13</h4>
<ul>
<li>
Fixed asynchronous model loading which might intermittently fail to perform AvoidsNodes routing.
</li>
<li>
Enhanced the <a>ArrangingLayout</a> extension to support placing the side nodes about the middle
of the side, by supporting values such as <code>go.Spot.Bottom</code> for the
<a>ArrangingLayout.side</a> property.
</li>
<li>
Improved the "HyperlinkText" builder extension so that it works by default in <a>Adornment</a>s
and other Parts that are in temporary layers, by setting <a>GraphObject.isActionable</a> to
true.
</li>
<li>
Table panel separator strokes no longer draw if a row or column is empty of visual elements, and
will not draw a separator above the first-rendered row/col.
</li>
</ul>
<h4 id="2.2.12">Changes for 2.2.12</h4>
<ul>
<li>
We have been optimizing the space used by GraphObjects. The heap used by typical large diagrams
now occupies about 10% less space. Creating copies of a lot of nodes and links may be a bit
faster now too.
</li>
<li>
Fixed the new <a>PanelLayoutFlow</a> extension so that multiple "Flow" panels can coexist in the
same panel.
</li>
<li>
Improved GenogramLayout in the
<a href="samples/genogram.html" target="_blank">Genogram</a> sample to support a horizontal
direction as well as the standard vertical direction.
</li>
<li>
Improved the <a href="samples/selectableFields.html" target="_blank">Selectable Fields</a> and
<a href="samples/selectablePorts.html" target="_blank">Selectable Ports</a>
samples so that clicking on fields or ports within a node respects the Control and Shift
modifiers to toggle or add to the collection of selected fields or ports.
</li>
<li>
Fixed object picking (<a>Diagram.findObject</a>, <a>GraphObject.containsPoint</a>, etc) for
Shapes with a <a>GraphObject.background</a>.
</li>
<li>
The <a>Group.layout</a> property setter now checks to make sure that the new layout is not also
the value of <a>Diagram.layout</a>.
</li>
</ul>
<h4 id="2.2.11">Changes for 2.2.11</h4>
<ul>
<li>
Like the <a>DraggingTool</a> in v2.2.0, <a>LinkReshapingTool</a>, <a>ResizingTool</a>, and
<a>RotatingTool</a> now optimize transactions to reduce memory usage by only saving the first
and last changes for each property of each object in the transaction. This can be changed by
overriding <b>stopTransaction</b> on the respective tool.
</li>
<li>
<a>Shape.graduatedSkip</a>, <a>TextBlock.graduatedSkip</a>, and
<a>TextBlock.graduatedFunction</a>
now take a second argument, the Shape or TextBlock that the function is being called for.
</li>
<li>
Graduated Panels now correctly draw ticks/labels at very large <a>Panel.graduatedMax</a> values.
</li>
<li>
The AMD <code>define</code> statement has been removed from the module version of the library
(<code>go-module.js</code>, <code>go.mjs</code>, <code>go-debug-module.js</code>)
</li>
<li>
The <a>DraggingTool</a>, when dragging a Link (<a>DraggingTool.draggedLink</a>), now passes that
link as the
<a>RelinkingTool.originalLink</a>
so that link validation predicates are passed that link.
</li>
<li>Disconnected links now support setting <a>Part.locationSpot</a>.</li>
</ul>
<h4 id="2.2.10">Changes for 2.2.10</h4>
<ul>
<li>
Graduated panels now draw all tick marks specifying a <a>Shape.graduatedSkip</a>/<a>TextBlock.graduatedSkip</a>
function, even when they could be very close together.
</li>
<li>Fixed drawing on very zoomed-out graphs.</li>
<li>
Multiple orthogonal links between identical nodes side-by-side are now drawn without crossings.
This fixes a regression from 2.1.51.
</li>
</ul>
<h4 id="2.2.9">Changes for 2.2.9</h4>
<ul>
<li>
Fixed a regression from 2.2.8 with Table Panel when tables are empty (including tables in Node
templates).
</li>
</ul>
<h4 id="2.2.8">Changes for 2.2.8</h4>
<ul>
<li>
Improved Table Panel measuring when using TableRows and TableColumns in sparsely populated
tables.
</li>
<li>
Improved Table Panel arranging of items that span several rows or columns, when those rows or
columns do not all exist.
</li>
<li>Animation fixes when <a>AnimationTrigger</a>s execute during a drag.</li>
<li>Improved accuracy of tick angles along curves in Graduated panels.</li>
<li>Fix for two-way bindings on <a>Part.location</a> when undoing.</li>
<li>
Calls to <a>Diagram.makeImage</a> and <a>Diagram.makeImageData</a> no longer throw exceptions
when attempting to render "broken" images.
</li>
</ul>
<h4 id="2.2.7">Changes for 2.2.7</h4>
<ul>
<li>
Nested or space-constrained Table Panels apportion space more correctly when some Table elements
are stretched and other rows/columns have their width or height set.
</li>
<li>Improved the ScrollingTable extension to include a scrollbar "thumb".</li>
</ul>
<h4 id="2.2.6">Changes for 2.2.6</h4>
<ul>
<li>Made improvements in gesture handling for iPad + keyboard combinations.</li>
<li>
Made improvements and added features to the
<a href="samples/gantt.html" target="_blank">Gantt</a> and
<a href="samples/donutCharts.html" target="_blank">Donut Charts</a> samples.
</li>
<li>
Drag and drop from a Diagram into empty page space no longer throws an error (regression in
2.2.4).
</li>
<li>
Data <a>Inspector</a>, when <code>multipleSelection</code> option is true, now clears the
properties fields when the <a>Diagram.selection</a> is empty.
</li>
</ul>
<h4 id="2.2.5">Changes for 2.2.5</h4>
<ul>
<li>
Drag and drop across Diagrams fixed on touch devices (regression in 2.2.4 for non Shadow DOM
environments).
</li>
<li>
Module versions of the library <code>release/go.mjs</code> and
<code>release/go-module.js</code> now export <code>go</code> as the default export.
</li>
</ul>
<h4 id="2.2.4">Changes for 2.2.4</h4>
<ul>
<li>
Allow <a>AnimationTrigger</a>s to run during Tool operation. Previously, Animation Triggers
would not run if a Tool was active, which prevented some tools such as <a>LinkingTool</a> from
starting animations during their events.
</li>
<li>
Fixed a regression since 2.2.0: Drag and drop in Shadow DOM environments such as Angular now
correctly identify the target Diagram (for dropping from Palettes, for instance).
</li>
<li>
<a>Diagram,useDOM</a> and <a>Diagram,isUsingDOM</a> were incorrectly minified, and now have
their names properly exposed.
</li>
</ul>
<h4 id="2.2.3">Changes for 2.2.3</h4>
<ul>
<li>
Fixed Spot Panels erroneously giving incorrect sizing information to its elements if a previous
element had a stretch.
</li>
<li>
Improved <a>LayeredDigraphLayout</a> routing of Bezier curve links to reduce crossing over
nodes.
</li>
<li>
Fixed optimization (in 2.0.0) of <a>Panel.rebuildItemElements</a> when item template(s) may have
changed.
</li>
<li>The <code>package.json</code> now specifies <code>"module": "release/go-module.js"</code></li>
</ul>
<h4 id="2.2.2">Changes for 2.2.2</h4>
<ul>
<li>Added <code>init</code> optional argument to <a>Brush</a> constructor.</li>
<li>Stopped tap-hold on some versions of iOS Safari from selecting text.</li>
<li>Improvements for licensing Electron apps.</li>
</ul>
<h4 id="2.2.1">Changes for 2.2.1</h4>
<ul>
<li>
Added rounded corners to the <a>BalloonLink</a> extension, controlled by the new property
<a>BalloonLink.corner</a>. Improved <a>BalloonLink</a>'s implementation of
<a>BalloonLink.base</a>.
</li>
<li>
Fixed licensing issues when using Windows high contrast mode, due to changes in Chrome and Edge.
</li>
<li>
Added <code>init</code> optional argument to <a>Layer</a> and <a>Animation</a> constructors.
<a>Animation.start</a> and <a>Animation.stop</a> now return <code>this</code>.
</li>
</ul>
<hr />
<h4>Changes for 2.1 are <a href="../2.1.56/changelog.html">here</a>.</h4>
<h4>Changes for 2.0 are <a href="../2.0.21/changelog.html">here</a>.</h4>
<h4>Changes for 1.* are <a href="../1.8.38/changelog.html">here</a>.</h4>
</div>
</div>
<div class="bg-nwoods-primary">
<section class="max-w-screen-lg text-white container mx-auto py-2 px-12">
<p id="version" class="leading-none mb-2 my-4">GoJS</p>
</section>
</div><footer class="bg-nwoods-primary text-white">
<div class="container max-w-screen-lg mx-auto px-8">
<div class="w-full py-6">
<div class="max-w-screen-lg xl:max-w-screen-xl mx-auto px-4 sm:px-6 md:px-8">
<ul class="text-sm font-medium pb-6 grid grid-cols-2 sm:grid-cols-3 gap-y-10">
<li class="list-none row-span-2">
<h2 class="text-base font-semibold tracking-wide">GoJS</h2>
<ul class="list-none space-y-4 md:space-y-1 px-0">
<li>
<a href="./samples/index.html">Samples</a>
</li>
<li>
<a href="./learn/index.html">Learn</a>
</li>
<li>
<a href="./intro/index.html">Intro</a>
</li>
<li>
<a href="./api/index.html">API</a>
</li>
<li>
<a href="./changelog.html">Changelog</a>
</li>
<li>
<a href="https://github.com/NorthwoodsSoftware/GoJS">GitHub</a>
</li>
</ul>
</li>
<li class="list-none row-span-2">
<h2 class="text-base font-semibold tracking-wide">Support</h2>
<ul class="list-none space-y-4 md:space-y-1 px-0">
<li>
<a href="https://www.nwoods.com/contact.html"
target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/contact.html', 'contact');">Contact</a>
</li>
<li>
<a href="https://forum.nwoods.com/c/gojs">Forum</a>
</li>
<li>
<a href="https://www.nwoods.com/app/activate.aspx?sku=gojs">Activate</a>
</li>
<li>
<a href="https://www.nwoods.com/sales/index.html"
target="_blank" rel="noopener" onclick="getOutboundLink('https://www.nwoods.com/sales/index.html', 'buy');">Buy</a>
</li>
<li>
<a href="https://www.youtube.com/channel/UC9We8EoX596-6XFjJDtZIDg">Videos</a>
</li>
</ul>
</li>
<li class="list-none row-span-2">
<h2 class="text-base font-semibold tracking-wide">Company</h2>
<ul class="list-none space-y-4 md:space-y-1 px-0">
<li>
<a target="_blank" href="https://www.nwoods.com">Northwoods</a>
</li>
<li>
<a target="_blank" href="https://www.nwoods.com/about.html">About Us</a>
</li>
<li>
<a target="_blank" href="https://www.nwoods.com/contact.html">Contact Us</a>
</li>
<li>
<a target="_blank" href="https://www.nwoods.com/consulting.html">Consulting</a>
</li>
<li>
<a target="_blank" href="https://twitter.com/northwoodsgo">Twitter</a>
</li>
</ul>
</li>
</ul>
<p class="text-sm text-gray-100 md:mb-6">
Copyright 1998-2023 <a class="text-white" href="https://www.nwoods.com">Northwoods Software</a>
</p>
</div>
</div>
</footer> </body>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-S5QK8VSK84"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date()); gtag('config', 'G-S5QK8VSK84');
var getOutboundLink = function(url, label) {
gtag('event', 'click', {
'event_category': 'outbound',
'event_label': label,
'transport_type': 'beacon'
});
}
// topnav
var topButton = document.getElementById("topnavButton");
var topnavList = document.getElementById("topnavList");
topButton.addEventListener("click", function() {
this.classList.toggle("active");
topnavList.classList.toggle("hidden");
document.getElementById("topnavOpen").classList.toggle("hidden");
document.getElementById("topnavClosed").classList.toggle("hidden");
});
</script>
<script src="./assets/js/prism.js"></script>
<script src="./release/go.js"></script>
<script src="./assets/js/goDoc.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
if (window.go) {
var p = document.getElementById('ver');
if (p !== null) p.textContent = ("Version: " + go.version);
document.getElementById('version').textContent = "GoJS " + go.version;
}
if (window.goDoc) window.goDoc();
});
</script>
</html>