Skip to content

Commit eaae294

Browse files
committed
28.2.5 release
1 parent e84dacf commit eaae294

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+2310
-2269
lines changed

ChangeLog

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
24-SEP-2025: 28.2.5
2+
3+
- Fixes handling of alpha values in inverted colors [DID-16387]
4+
5+
22-SEP-2025: 28.2.4
6+
7+
- Adds support for HEX colors with transparency
8+
- Adds dash-dot line pattern [jgraph/drawio-desktop#2184]
9+
- [conf cloud] Adds option to build page IDs mapping manually using DB files [DID-15536]
10+
- Fixes possible NPE for VSDX import [jgraph/drawio#3507]
11+
- Changes unconnected terminal dims to [0,0] [jgraph/drawio#5242]
12+
113
16-SEP-2025: 28.2.3
214

315
- Adds dropbox.com to connect-src CSP

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
About
22
-----
3-
draw.io, this project, is a configurable diagramming/whiteboarding visualization application. draw.io is jointly owned and developed by JGraph Ltd and draw.io AG.
3+
draw.io, this project, is a configurable diagramming/whiteboarding visualization application. draw.io is jointly owned and developed by draw.io Ltd and draw.io AG.
44

55
As well as running this project, we run a production-grade deployment of the diagramming interface at https://app.diagrams.net.
66

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
28.2.3
1+
28.2.5

src/main/webapp/js/app.min.js

Lines changed: 931 additions & 931 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/webapp/js/diagramly/App.js

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,41 +17,6 @@ App = function(editor, container, lightbox)
1717
(urlParams['lightbox'] == '1' || (uiTheme == 'min' &&
1818
urlParams['chrome'] != '0')));
1919

20-
// Logs unloading of window with modifications for Google Drive file
21-
if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp)
22-
{
23-
window.onunload = mxUtils.bind(this, function()
24-
{
25-
var file = this.getCurrentFile();
26-
27-
if (file != null && file.isModified())
28-
{
29-
var evt = {category: 'DISCARD-FILE-' + file.getHash(),
30-
action: ((file.savingFile) ? 'saving' : '') +
31-
((file.savingFile && file.savingFileTime != null) ? '_' +
32-
Math.round((Date.now() - file.savingFileTime.getTime()) / 1000) : '') +
33-
((file.saveLevel != null) ? ('-sl_' + file.saveLevel) : '') +
34-
'-age_' + ((file.ageStart != null) ? Math.round((Date.now() - file.ageStart.getTime()) / 1000) : 'x') +
35-
((this.editor.autosave) ? '' : '-nosave') +
36-
((file.isAutosave()) ? '' : '-noauto') +
37-
'-open_' + ((file.opened != null) ? Math.round((Date.now() - file.opened.getTime()) / 1000) : 'x') +
38-
'-save_' + ((file.lastSaved != null) ? Math.round((Date.now() - file.lastSaved.getTime()) / 1000) : 'x') +
39-
'-change_' + ((file.lastChanged != null) ? Math.round((Date.now() - file.lastChanged.getTime()) / 1000) : 'x') +
40-
'-alive_' + Math.round((Date.now() - App.startTime.getTime()) / 1000),
41-
label: (file.sync != null) ? ('client_' + file.sync.clientId) : 'nosync'};
42-
43-
if (file.constructor == DriveFile && file.desc != null && this.drive != null)
44-
{
45-
evt.label += ((this.drive.user != null) ? ('-user_' + this.drive.user.id) : '-nouser') + '-rev_' +
46-
file.desc.headRevisionId + '-mod_' + file.desc.modifiedDate + '-size_' + file.getSize() +
47-
'-mime_' + file.desc.mimeType;
48-
}
49-
50-
// EditorUi.logEvent(evt);
51-
}
52-
});
53-
}
54-
5520
// Logs changes to autosave
5621
this.editor.addListener('autosaveChanged', mxUtils.bind(this, function()
5722
{

src/main/webapp/js/diagramly/GraphViewer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1370,7 +1370,7 @@ GraphViewer.prototype.addToolbar = function()
13701370
fadeThead2 = null;
13711371
}
13721372

1373-
toolbar.style.display = '';
1373+
toolbar.style.display = 'flex';
13741374
mxUtils.setOpacity(toolbar, opacity || 30);
13751375
});
13761376

src/main/webapp/js/diagramly/vsdx/importer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4774,7 +4774,7 @@ var com;
47744774
case 102:
47754775
case 103:
47764776
var index = quickStyleLineMatrix - 100;
4777-
if (lineStyles === this.lineStyles) {
4777+
if (lineStyles === this.lineStyles && this.variantLineIdx[this.themeVariantStl] != null) {
47784778
lineStyle = this.lineStyles[this.variantLineIdx[this.themeVariantStl][index] - 1];
47794779
}
47804780
else {

src/main/webapp/js/grapheditor/Dialogs.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ var ColorPicker = function()
6464
cross.style.top = '-8px';
6565

6666
var currentHsv = [0, 0, 1];
67+
var currentAlpha = 1;
6768

6869
function hsv2rgb(h, s, v)
6970
{
@@ -172,7 +173,9 @@ var ColorPicker = function()
172173
var color = '#' +
173174
('0' + Math.round(rgb[0] * 255).toString(16)).slice(-2) +
174175
('0' + Math.round(rgb[1] * 255).toString(16)).slice(-2) +
175-
('0' + Math.round(rgb[2] * 255).toString(16)).slice(-2);
176+
('0' + Math.round(rgb[2] * 255).toString(16)).slice(-2) +
177+
(currentAlpha < 1 ?
178+
('0' + Math.round(currentAlpha * 255).toString(16)).slice(-2) : '');
176179

177180
if (quiet != true)
178181
{
@@ -215,7 +218,9 @@ var ColorPicker = function()
215218
this.fromString('#' +
216219
('0' + Math.floor(temp[0] * 255).toString(16)).slice(-2) +
217220
('0' + Math.floor(temp[1] * 255).toString(16)).slice(-2) +
218-
('0' + Math.floor(temp[2] * 255).toString(16)).slice(-2));
221+
('0' + Math.floor(temp[2] * 255).toString(16)).slice(-2) +
222+
(currentAlpha < 1 ?
223+
('0' + Math.round(currentAlpha * 255).toString(16)).slice(-2) : ''));
219224
}
220225
else if (sliderActive)
221226
{
@@ -288,6 +293,7 @@ var ColorPicker = function()
288293
}
289294

290295
currentHsv[2] = hsv[2];
296+
currentAlpha = rgb.a;
291297
update(quiet);
292298
};
293299

@@ -358,7 +364,7 @@ var ColorDialog = function(editorUi, color, apply, cancelFn, defaultColor, defau
358364
var darkInput = document.createElement('input');
359365
darkInput.style.textOverflow = 'ellipsis';
360366
darkInput.style.margin = '0 4px';
361-
darkInput.style.maxWidth = '60px';
367+
darkInput.style.maxWidth = '70px';
362368
darkInput.style.width = '100%';
363369

364370
var darkSelect = document.createElement('select');

src/main/webapp/js/grapheditor/Format.js

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Format.wireEdgeImage = Graph.createSvgImage(20, 22, '<path transform="translate(
5555
'<path transform="translate(4,0)" stroke-dashoffset="8" stroke-dasharray="8 8" stroke-width="3.5" d="M 0 10 L 34 10" stroke="green" fill="black"/>', 42, 20);
5656
Format.arrowImage = Graph.createSvgImage(20, 22, '<path transform="translate(4,3)" stroke-width="2.5" d="M 0 6 L 24 6 L 24 2 L 32 8 L 24 14 L 24 10 L 0 10 Z" stroke="black" fill="none"/>', 42, 20);
5757
Format.simpleArrowImage = Graph.createSvgImage(20, 22, '<path transform="translate(4,3)" stroke-width="2.5" d="M 0 6 L 4 6 L 4 10 L 0 10 Z M 7 6 L 18 6 L 18 2 L 25 8 L 18 14 L 18 10 L 7 10 Z M 28 6 L 28 6 L 32 6 L 32 10 L 28 10 Z" stroke="black" fill="none"/>', 42, 20);
58-
Format.straightImage = Graph.createSvgImage(16, 18, '<path transform="translate(3,4)" stroke-width="4.5" d="M 0 26 L 4 26 L 4 30 L 0 30 Z M 4 26 L 26 4 M 26 0 L 30 0 L 30 4 L 26 4 Z" stroke="black" fill="none"/>', 36, 36);
58+
Format.straightImage = Graph.createSvgImage(16, 18, '<path transform="translate(3,4)" stroke-width="2.5" d="M 0 26 L 4 26 L 4 30 L 0 30 Z M 4 26 L 26 4 M 26 0 L 30 0 L 30 4 L 26 4 Z" stroke="black" fill="none"/>', 36, 36);
5959
Format.orthogonalImage = Graph.createSvgImage(16, 18, '<path transform="translate(3,4)" stroke-width="2.5" d="M 0 26 L 4 26 L 4 30 L 0 30 Z M 2 26 L 2 14 L 28 14 L 28 4 M 26 0 L 30 0 L 30 4 L 26 4 Z" stroke="black" fill="none"/>', 36, 36);
6060
Format.horizontalElbowImage = Graph.createSvgImage(16, 18, '<path transform="translate(3,3)rotate(270,0,0)scale(-1,1)" stroke-width="2.5" d="M 0 26 L 4 26 L 4 30 L 0 30 Z M 2 26 L 2 14 L 28 14 L 28 4 M 26 0 L 30 0 L 30 4 L 26 4 Z M 14 11 L 14 5 M 14 3 L 16 5 L 12 5 Z M 14 17 L 14 23 M 14 25 L 16 23 L 12 23 Z" stroke="black" fill="none"/>', 36, 36);
6161
Format.verticalElbowImage = Graph.createSvgImage(16, 18, '<path transform="translate(3,4)" stroke-width="2.5" d="M 0 26 L 4 26 L 4 30 L 0 30 Z M 2 26 L 2 14 L 28 14 L 28 4 M 26 0 L 30 0 L 30 4 L 26 4 Z M 14 11 L 14 5 M 14 3 L 16 5 L 12 5 Z M 14 17 L 14 23 M 14 25 L 16 23 L 12 23 Z" stroke="black" fill="none"/>', 36, 36);
@@ -4976,6 +4976,34 @@ StyleFormatPanel.prototype.getCustomColors = function()
49764976
return result;
49774977
};
49784978

4979+
/**
4980+
* Adds the label menu items to the given menu and parent.
4981+
*/
4982+
StyleFormatPanel.prototype.addDashPattern = function(elt, pattern)
4983+
{
4984+
var tokens = pattern.split(' ');
4985+
4986+
if (tokens.length >= 2)
4987+
{
4988+
var sum = 0;
4989+
4990+
for (var i = 0; i < tokens.length; i++)
4991+
{
4992+
sum += parseInt(tokens[i]);
4993+
}
4994+
4995+
var img = Graph.createSvgImage(sum, 1, '<line transform="translate(0,1)" x1="0" y1="0" x2="' + sum +
4996+
'" y2="0" stroke-dasharray="' + pattern + '" stroke-width="2" stroke="black"/>', sum, 1);
4997+
elt.style.backgroundImage = 'url(' + img.src + ')';
4998+
elt.style.backgroundSize = sum + 'px 1px';
4999+
elt.style.backgroundRepeat = 'repeat-x';
5000+
}
5001+
else
5002+
{
5003+
elt.style.borderBottomStyle = pattern;
5004+
}
5005+
};
5006+
49795007
/**
49805008
* Adds the label menu items to the given menu and parent.
49815009
*/
@@ -5087,23 +5115,8 @@ StyleFormatPanel.prototype.addStroke = function(container)
50875115
var addItem = mxUtils.bind(this, function(menu, width, pattern, keys, values)
50885116
{
50895117
var item = this.editorUi.menus.styleChange(menu, '', keys, values, '', null);
5090-
var pat = document.createElement('div');
5091-
var tokens = pattern.split(' ');
5092-
5093-
if (tokens.length == 2)
5094-
{
5095-
var len = parseInt(tokens[0]) + parseInt(tokens[1]);
5096-
var fill = parseInt(tokens[0]) / len * 100;
5097-
pat.style.borderBottomStyle = 'none';
5098-
pat.style.backgroundImage = 'linear-gradient(to right, ' +
5099-
'black ' + fill + '%, transparent 0%)';
5100-
pat.style.backgroundSize = len + 'px 1px';
5101-
}
5102-
else
5103-
{
5104-
pat.style.borderBottomStyle = pattern;
5105-
}
5106-
5118+
var pat = document.createElement('div');
5119+
this.addDashPattern(pat, pattern);
51075120
item.firstChild.firstChild.className = 'geStyleMenuItem';
51085121
item.firstChild.firstChild.style.width = width + 'px';
51095122
item.firstChild.firstChild.appendChild(pat);
@@ -5117,6 +5130,7 @@ StyleFormatPanel.prototype.addStroke = function(container)
51175130
addItem(menu, 110, 'dashed', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', null]).setAttribute('title', mxResources.get('dashed') + ' (1)');
51185131
addItem(menu, 110, '8 8', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '8 8']).setAttribute('title', mxResources.get('dashed') + ' (2)');
51195132
addItem(menu, 110, '12 12', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '12 12']).setAttribute('title', mxResources.get('dashed') + ' (3)');
5133+
addItem(menu, 110, '8 4 1 4', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '8 4 1 4']).setAttribute('title', mxResources.get('dashed') + ' (4)');
51205134
addItem(menu, 110, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)');
51215135
addItem(menu, 110, '1 2', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 2']).setAttribute('title', mxResources.get('dotted') + ' (2)');
51225136
addItem(menu, 110, '1 4', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN], ['1', '1 4']).setAttribute('title', mxResources.get('dotted') + ' (3)');
@@ -5155,6 +5169,8 @@ StyleFormatPanel.prototype.addStroke = function(container)
51555169
['1', '8 8']).setAttribute('title', mxResources.get('dashed') + ' (2)');
51565170
addItem(menu, 40, '12 12', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN],
51575171
['1', '12 12']).setAttribute('title', mxResources.get('dashed') + ' (3)');
5172+
addItem(menu, 40, '8 4 1 4', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN],
5173+
['1', '8 4 1 4']).setAttribute('title', mxResources.get('dashed') + ' (4)');
51585174
addItem(menu, 40, 'dotted', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN],
51595175
['1', '1 1']).setAttribute('title', mxResources.get('dotted') + ' (1)');
51605176
addItem(menu, 40, '1 2', [mxConstants.STYLE_DASHED, mxConstants.STYLE_DASH_PATTERN],
@@ -5603,15 +5619,8 @@ StyleFormatPanel.prototype.addStroke = function(container)
56035619

56045620
if (tokens.length >= 2)
56055621
{
5606-
var len = parseInt(tokens[0]) + parseInt(tokens[1]);
5607-
var fill = parseInt(tokens[0]) / len * 100;
5608-
56095622
solid.style.borderBottom = '1px solid transparent';
5610-
solid.style.backgroundImage = 'linear-gradient(to right, ' +
5611-
'black ' + fill + '%, transparent 0%)';
5612-
solid.style.backgroundPosition = 'bottom left';
5613-
solid.style.backgroundSize = len +'px 1px';
5614-
solid.style.backgroundRepeat = 'repeat-x';
5623+
this.addDashPattern(solid, pat);
56155624
}
56165625
else
56175626
{
@@ -6641,11 +6650,7 @@ DiagramStylePanel.prototype.addGraphStyles = function(div)
66416650
}));
66426651
}
66436652

6644-
// Workaround for broken cache in IE11
6645-
if (!mxClient.IS_IE && !mxClient.IS_IE11)
6646-
{
6647-
this.format.cachedStyleEntries[index] = panel;
6648-
}
6653+
this.format.cachedStyleEntries[index] = panel;
66496654
}
66506655

66516656
entries.appendChild(panel);

src/main/webapp/js/grapheditor/Menus.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ Menus.prototype.init = function()
7676
Format.processMenuIcon(this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE],
7777
['orthogonalEdgeStyle', null, null], null, null, true, Format.orthogonalImage.src)).setAttribute('title', mxResources.get('orthogonal'));
7878
Format.processMenuIcon(this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE],
79-
['elbowEdgeStyle', null, null, null], null, null, true, Format.horizontalElbowImage.src)).setAttribute('title', mxResources.get('simple'));
79+
['elbowEdgeStyle', null, null, null], null, null, true, Format.horizontalElbowImage.src)).setAttribute('title', mxResources.get('vertical'));
8080
Format.processMenuIcon(this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE],
81-
['elbowEdgeStyle', 'vertical', null, null], null, null, true, Format.verticalElbowImage.src)).setAttribute('title', mxResources.get('simple'));
81+
['elbowEdgeStyle', 'vertical', null, null], null, null, true, Format.verticalElbowImage.src)).setAttribute('title', mxResources.get('horizontal'));
8282
Format.processMenuIcon(this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE],
8383
['isometricEdgeStyle', null, null, null], null, null, true, Format.horizontalIsometricImage.src)).setAttribute('title', mxResources.get('isometric'));
8484
Format.processMenuIcon(this.editorUi.menus.edgeStyleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW, mxConstants.STYLE_CURVED, mxConstants.STYLE_NOEDGESTYLE],

0 commit comments

Comments
 (0)