Explorar o código

16.0.2 release

David Benson %!s(int64=4) %!d(string=hai) anos
pai
achega
14fd9bd654

+ 2 - 7
.github/ISSUE_TEMPLATE/bug_report.md

@@ -10,8 +10,6 @@ about: Create a report to help us improve
 * [ ] I agree to follow the [Code of Conduct](https://github.com/jgraph/drawio/blob/master/CODE_OF_CONDUCT.md) that this project adheres to.
 * [ ] I have searched the issue tracker for a feature request that matches the one I want to file, without success.
 
-You must agree to search and the code of conduct. You must fill in this entire template. If you delete part/all or miss parts out your issue will be closed.
-
 **Describe the bug**
 A clear and concise description of what the bug is.
 
@@ -30,12 +28,12 @@ If applicable, add screenshots to help explain your problem.
 
 **draw.io version (In the Help->About menu of the draw.io editor):**
 
-- draw.io version x.y.z
+- draw.io version [e.g. 12.6.7]
 
 **Desktop (please complete the following information):**
  - OS: [e.g. iOS]
  - Browser [e.g. chrome, safari]
- - Browser Version [e.g. 22]
+ - Version [e.g. 22]
 
 **Smartphone (please complete the following information):**
  - Device: [e.g. iPhone6]
@@ -43,8 +41,5 @@ If applicable, add screenshots to help explain your problem.
  - Browser [e.g. stock browser, safari]
  - Version [e.g. 22]
 
-**I tested the problem in incognito/private mode with all browser extensions switched off, write "yes" below:**
--
-
 **Additional context**
 Add any other context about the problem here.

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+21-DEC-2021: 16.0.2
+
+- Re-build
+
+21-DEC-2021: 16.0.1
+
+- Fixes possible NPE
+
 17-DEC-2021: 16.0.0
 
 The reason for going to version 16 is there is a breaking change in the docker image. The 

+ 1 - 1
VERSION

@@ -1 +1 @@
-16.0.0
+16.0.2

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 190 - 190
src/main/webapp/js/app.min.js


+ 1 - 1
src/main/webapp/js/diagramly/App.js

@@ -3266,7 +3266,7 @@ App.prototype.start = function()
 						{
 							var id = this.getDiagramId();
 							
-							if (EditorUi.enableDrafts && (urlParams['mode'] == null || EditorUi.isElectronApp) &&
+							if (EditorUi.enableDrafts && urlParams['mode'] == null &&
 								this.getServiceName() == 'draw.io' && (id == null || id.length == 0) &&
 								!this.editor.isChromelessView())
 							{

+ 3 - 1
src/main/webapp/js/diagramly/Editor.js

@@ -899,7 +899,7 @@
 			}
 			else
 			{
-				delete style.stroke;
+				style.stroke = 'none';
 			}
 			
 			var gradient = null;
@@ -4231,6 +4231,8 @@
 		mxCellRenderer.defaultShapes['swimlane'].prototype.customProperties = [
 	        {name: 'arcSize', dispName: 'Arc Size', type: 'float', min:0, defVal: 15},
 	        {name: 'startSize', dispName: 'Header Size', type: 'float'},
+			{name: 'swimlaneHead', dispName: 'Head Border', type: 'bool', defVal: true},
+			{name: 'swimlaneBody', dispName: 'Body Border', type: 'bool', defVal: true},
 	        {name: 'horizontal', dispName: 'Horizontal', type: 'bool', defVal: true},
 	        {name: 'separatorColor', dispName: 'Separator Color', type: 'color', defVal: null},
 	    ];

+ 3 - 1
src/main/webapp/js/diagramly/EditorUi.js

@@ -10475,7 +10475,9 @@
 			 * Persists default grid color.
 			 */
 			this.editor.graph.view.gridColor = mxSettings.getGridColor(Editor.isDarkMode());
-			
+			this.editor.graph.view.defaultDarkGridColor = mxSettings.getGridColor(true);
+			this.editor.graph.view.defaultGridColor = mxSettings.getGridColor(false);
+
 			this.addListener('gridColorChanged', mxUtils.bind(this, function(sender, evt)
 			{
 				mxSettings.setGridColor(this.editor.graph.view.gridColor, Editor.isDarkMode());

+ 37 - 5
src/main/webapp/js/diagramly/ElectronApp.js

@@ -845,7 +845,11 @@ mxStencilRegistry.allowEval = false;
 			var data = this.emptyDiagramXml;
 			var file = new LocalFile(this, data, title, null);
 			this.fileCreated(file, null, null, null);
-		}		
+		}
+		else
+		{
+			this.checkDrafts();
+		}
 	}
 
 	var origFileLoaded = EditorUi.prototype.fileLoaded;
@@ -1150,7 +1154,7 @@ mxStencilRegistry.allowEval = false;
 					data = this.extractGraphModelFromPng('data:image/png;base64,' + data);
 				}
 
-				fs.stat(path, function(err, stat_p)
+				fs.stat(path, mxUtils.bind(this, function(err, stat_p)
 				{
 					if (err)
 					{
@@ -1160,10 +1164,24 @@ mxStencilRegistry.allowEval = false;
 					{
 						stat = stat_p;
 						fn(fileEntry, data, stat, null, false);
+
+						fs.access(path, fs.constants.W_OK, mxUtils.bind(this, function(err)
+						{
+							if (err)
+							{
+								var file = this.getCurrentFile();
+		
+								if (file != null && file.fileObject != null && file.fileObject.path == path)
+								{
+									file.setEditable(false);
+									this.editor.setStatus('<div class="geStatusAlert">' + mxResources.get('readOnly') + '</div>');
+								}
+							}
+						}));
 					}
 
 					checkDrafts();
-				});
+				}));
 			}
 		});
  
@@ -1319,6 +1337,16 @@ mxStencilRegistry.allowEval = false;
 		return stat != null && this.stat != null && stat.mtimeMs != this.stat.mtimeMs;
 	};
 	
+	LocalFile.prototype.isEditable = function()
+	{
+		return this.editable != null? this.editable : this.ui.editor.editable;
+	};
+
+	LocalFile.prototype.setEditable = function(editable)
+	{
+		this.editable = editable;
+	};
+
 	LocalFile.prototype.getFilename = function()
 	{
 		var filename = this.title;
@@ -1414,13 +1442,17 @@ mxStencilRegistry.allowEval = false;
 						if (errMsg == 'empty data')
 						{
 							this.ui.handleError({message: mxResources.get('errorSavingFile')});
+							errorWrapper();
 						}
 						else if (errMsg == 'conflict')
 						{
 							this.inConflictState = true;
+							errorWrapper();
+						}
+						else
+						{
+							errorWrapper(err || errMsg);
 						}
-						
-						errorWrapper();
 					}));
 				});
 	

+ 3 - 3
src/main/webapp/js/diagramly/Menus.js

@@ -8,12 +8,12 @@
 	var mxPopupMenuShowMenu = mxPopupMenu.prototype.showMenu;
 	mxPopupMenu.prototype.showMenu = function()
 	{
-		mxPopupMenuShowMenu.apply(this, arguments);
-		
 		this.div.style.overflowY = 'auto';
 		this.div.style.overflowX = 'hidden';
 		var h0 = Math.max(document.body.clientHeight, document.documentElement.clientHeight);
-		this.div.style.maxHeight = (h0 - 10) + 'px';
+		this.div.style.maxHeight = (h0 - (EditorUi.isElectronApp? 50 : 10)) + 'px'; //In Electron and without titlebar, the top item is not selectable
+
+		mxPopupMenuShowMenu.apply(this, arguments);
 	};
 	
 	Menus.prototype.createHelpLink = function(href)

+ 13 - 7
src/main/webapp/js/diagramly/Minimal.js

@@ -1127,16 +1127,22 @@ EditorUi.initMinimalTheme = function()
             	ui.menus.addSubmenu('importFrom', menu, parent);
             }
 
+			menu.addSeparator(parent);
+
 			if (urlParams['sketch'] != '1')
 			{
-				ui.menus.addMenuItems(menu, ['-', 'outline'], parent);
-				
-				if (ui.commentsSupported())
-				{
-					ui.menus.addMenuItems(menu, ['comments'], parent);
-				}
+				ui.menus.addMenuItems(menu, ['outline'], parent);
 			}
-			
+			else if (file.constructor == DriveFile)
+			{
+				ui.menus.addMenuItems(menu, ['share'], parent);
+			}
+
+			if (ui.commentsSupported())
+			{
+				ui.menus.addMenuItems(menu, ['comments'], parent);
+			}
+
 			ui.menus.addMenuItems(menu, ['-', 'findReplace',
 				'layers', 'tags', '-', 'pageSetup'], parent);
 

+ 15 - 8
src/main/webapp/js/grapheditor/Dialogs.js

@@ -101,6 +101,7 @@ var ColorDialog = function(editorUi, color, apply, cancelFn)
 		table.setAttribute('cellspacing', '0');
 		table.style.marginBottom = '20px';
 		table.style.cellSpacing = '0px';
+		table.style.marginLeft = '1px';
 		var tbody = document.createElement('tbody');
 		table.appendChild(tbody);
 
@@ -115,7 +116,7 @@ var ColorDialog = function(editorUi, color, apply, cancelFn)
 				(mxUtils.bind(this, function(clr)
 				{
 					var td = document.createElement('td');
-					td.style.border = '1px solid black';
+					td.style.border = '0px solid black';
 					td.style.padding = '0px';
 					td.style.width = '16px';
 					td.style.height = '16px';
@@ -124,14 +125,20 @@ var ColorDialog = function(editorUi, color, apply, cancelFn)
 					{
 						clr = defaultColor;
 					}
-					
-					if (clr == 'none')
-					{
-						td.style.background = 'url(\'' + Dialog.prototype.noColorImage + '\')';
-					}
-					else if (clr != null)
+
+					if (clr != null)
 					{
-						td.style.backgroundColor = '#' + clr;
+						td.style.borderWidth = '1px';
+
+						if (clr == 'none')
+						{
+							td.style.background = 'url(\'' + Dialog.prototype.noColorImage + '\')';
+						}
+						else
+						{
+							td.style.backgroundColor = '#' + clr;
+						}
+
 						var name = this.colorNames[clr.toUpperCase()];
 
 						if (name != null)

+ 2 - 1
src/main/webapp/js/grapheditor/EditorUi.js

@@ -1299,7 +1299,7 @@ EditorUi.prototype.initSelectionState = function()
 		style: {}, containsImage: false, containsLabel: false, fill: true, glass: true,
 		rounded: true, autoSize: false, image: true, shadow: true, lineJumps: true, resizable: true,
 		table: false, cell: false, row: false, movable: true, rotatable: true, stroke: true,
-		unlocked: this.editor.graph.isEnabled(), connections: false};
+		swimlane: false, unlocked: this.editor.graph.isEnabled(), connections: false};
 };
 
 /**
@@ -1364,6 +1364,7 @@ EditorUi.prototype.updateSelectionStateForCell = function(result, cell, cells, i
 		result.rotatable = result.rotatable && graph.isCellRotatable(cell);
 		result.movable = result.movable && graph.isCellMovable(cell) &&
 			!graph.isTableRow(cell) && !graph.isTableCell(cell);
+		result.swimlane = result.swimlane || graph.isSwimlane(cell);
 		result.table = result.table || graph.isTable(cell);
 		result.cell = result.cell || graph.isTableCell(cell);
 		result.row = result.row || graph.isTableRow(cell);

+ 12 - 5
src/main/webapp/js/grapheditor/Format.js

@@ -4539,9 +4539,10 @@ StyleFormatPanel.prototype.getCustomColors = function()
 	var ss = this.editorUi.getSelectionState();
 	var result = [];
 	
-	if (ss.style.shape == 'swimlane' || ss.style.shape == 'table')
+	if (ss.swimlane)
 	{
-		result.push({title: mxResources.get('laneColor'), key: 'swimlaneFillColor', defaultValue: 'default'});
+		result.push({title: mxResources.get('laneColor'),
+			key: 'swimlaneFillColor', defaultValue: 'default'});
 	}
 	
 	return result;
@@ -4850,7 +4851,10 @@ StyleFormatPanel.prototype.addStroke = function(container)
 
 			window.setTimeout(mxUtils.bind(this, function()
 			{
-				mxUtils.fit(menu.div);
+				if (menu.div != null)
+				{
+					mxUtils.fit(menu.div);
+				}
 			}), 0);
 		}
 	}));
@@ -4913,7 +4917,10 @@ StyleFormatPanel.prototype.addStroke = function(container)
 
 			window.setTimeout(mxUtils.bind(this, function()
 			{
-				mxUtils.fit(menu.div);
+				if (menu.div != null)
+				{
+					mxUtils.fit(menu.div);
+				}
 			}), 0);
 		}
 	}));
@@ -5459,7 +5466,7 @@ StyleFormatPanel.prototype.addEffects = function(div)
 			addOption(mxResources.get('rounded'), mxConstants.STYLE_ROUNDED, 0);
 		}
 		
-		if (ss.style.shape == 'swimlane')
+		if (ss.swimlane)
 		{
 			addOption(mxResources.get('divider'), 'swimlaneLine', 1);
 		}

+ 46 - 31
src/main/webapp/js/grapheditor/Graph.js

@@ -360,11 +360,18 @@ Graph = function(container, model, renderHint, stylesheet, themes, standalone)
 		    			if (handler == null || handler.getHandleForEvent(me) == null)
 		    			{
 				    		var box = new mxRectangle(me.getGraphX() - 1, me.getGraphY() - 1);
-			    			box.grow(mxEvent.isTouchEvent(me.getEvent()) ?
-			    				mxShape.prototype.svgStrokeTolerance - 1 :
-			    				(mxShape.prototype.svgStrokeTolerance + 1) / 2);
-			    			
-			    			if (this.isTableCell(state.cell) && !this.isCellSelected(state.cell))
+							var tol = mxEvent.isTouchEvent(me.getEvent()) ?
+								mxShape.prototype.svgStrokeTolerance - 1 :
+								(mxShape.prototype.svgStrokeTolerance + 1) / 2;
+			    			box.grow(tol);
+
+							// Ignores clicks on cell background to avoid delayed selection on
+							// merged cells when clicking on invisible dividers
+			    			if (this.isTableCell(state.cell) && !this.isCellSelected(state.cell) &&
+								(!mxUtils.contains(state, me.getGraphX() - tol, me.getGraphY() - tol) ||
+								!mxUtils.contains(state, me.getGraphX() - tol, me.getGraphY() + tol) ||
+								!mxUtils.contains(state, me.getGraphX() + tol, me.getGraphY() + tol) ||
+								!mxUtils.contains(state, me.getGraphX() + tol, me.getGraphY() - tol)))
 			    			{
 			    				var row = this.model.getParent(state.cell);
 			    				var table = this.model.getParent(row);
@@ -382,7 +389,7 @@ Graph = function(container, model, renderHint, stylesheet, themes, standalone)
 				    					state.x + g.width * s - 2, state.y, 2, g.height * s)))
 			    					{
 				    					var wasSelected = this.selectionCellsHandler.isHandled(table);
-				    					this.selectCellForEvent(table, me.getEvent());
+										this.selectCellForEvent(table, me.getEvent());
 						    			handler = this.selectionCellsHandler.getHandler(table);
 			
 						    			if (handler != null)
@@ -649,8 +656,9 @@ Graph = function(container, model, renderHint, stylesheet, themes, standalone)
 				    		}
 				    		else if (!mxEvent.isControlDown(me.getEvent()))
 				    		{
+								var tol = mxShape.prototype.svgStrokeTolerance / 2;
 				    			var box = new mxRectangle(me.getGraphX() - 1, me.getGraphY() - 1);
-			    				box.grow(mxShape.prototype.svgStrokeTolerance / 2);
+			    				box.grow(tol);
 	
 					    		if (this.isTableCell(state.cell))
 					    		{
@@ -659,15 +667,15 @@ Graph = function(container, model, renderHint, stylesheet, themes, standalone)
 			    					
 			    					if (!this.isCellSelected(table))
 			    					{
-				    					if ((mxUtils.intersects(box, new mxRectangle(state.x - 2, state.y, 2, state.height)) &&
+				    					if ((mxUtils.intersects(box, new mxRectangle(state.x - 2, state.y, 4, state.height)) &&
 						    				this.model.getChildAt(row, 0) != state.cell) || mxUtils.intersects(box,
-						    				new mxRectangle(state.x + state.width - 2, state.y, 2, state.height)))
+						    				new mxRectangle(state.x + state.width - 2, state.y, 4, state.height)))
 				    					{
 						    				cursor ='col-resize';
 				    					}
-				    					else if ((mxUtils.intersects(box, new mxRectangle(state.x, state.y - 2, state.width, 3)) &&
+				    					else if ((mxUtils.intersects(box, new mxRectangle(state.x, state.y - 2, state.width, 4)) &&
 					    					this.model.getChildAt(table, 0) != row) || mxUtils.intersects(box,
-					    					new mxRectangle(state.x, state.y + state.height - 2, state.width, 3)))
+					    					new mxRectangle(state.x, state.y + state.height - 2, state.width, 4)))
 				    					{
 						    				cursor ='row-resize';
 				    					}
@@ -5956,7 +5964,7 @@ Graph.prototype.createTable = function(rowCount, colCount, w, h, title, startSiz
 	tableStyle = (tableStyle != null) ? tableStyle : 'shape=table;startSize=' +
 		((title != null) ? startSize : '0') + ';container=1;collapsible=0;childLayout=tableLayout;';
 	rowStyle = (rowStyle != null) ? rowStyle : 'shape=partialRectangle;collapsible=0;dropTarget=0;' +
-    	'pointerEvents=0;fillColor=none;top=0;left=0;bottom=0;right=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;';
+    	'fillColor=none;top=0;left=0;bottom=0;right=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;';
 	cellStyle = (cellStyle != null) ? cellStyle : 'shape=partialRectangle;html=1;whiteSpace=wrap;connectable=0;' +
 		'overflow=hidden;fillColor=none;top=0;left=0;bottom=0;right=0;pointerEvents=1;';
 	
@@ -6005,17 +6013,16 @@ Graph.prototype.createCrossFunctionalSwimlane = function(rowCount, colCount, w,
 {
 	w = (w != null) ? w : 120;
 	h = (h != null) ? h : 120;
-	var startSize = (title == null) ? 0 : 40;
 	
-	var s = 'collapsible=0;recursiveResize=0;expand=0;pointerEvents=0;';
-	tableStyle = (tableStyle != null) ? tableStyle : 'shape=table;childLayout=tableLayout;startSize=' + startSize + ';' +
-		((title == null) ? 'fillColor=none;' : '') + s;
-		
-	rowStyle = (rowStyle != null) ? rowStyle : 'swimlane;horizontal=0;fontStyle=0;points=[[0,0.5],[1,0.5]];' +
-		'fillColor=none;strokeColor=none;portConstraint=eastwest;startSize=' + startSize + ';' + s;
-	firstCellStyle = (firstCellStyle != null) ? firstCellStyle : 'swimlane;fontStyle=0;connectable=0;fillColor=none;startSize=40;' + s;
-	cellStyle = (cellStyle != null) ? cellStyle : 'swimlane;fontStyle=0;connectable=0;fillColor=none;startSize=' +
-		((title == null) ? '40' : '0') + ';' + s;
+	var s = 'collapsible=0;recursiveResize=0;expand=0;';
+	tableStyle = (tableStyle != null) ? tableStyle : 'shape=table;childLayout=tableLayout;' +
+		((title == null) ? 'startSize=0;fillColor=none;' : 'startSize=40;') + s;
+	rowStyle = (rowStyle != null) ? rowStyle : 'swimlane;horizontal=0;swimlaneHead=0;swimlaneBody=0;fontStyle=0;' +
+		'fillColor=none;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;startSize=40;' + s;
+	firstCellStyle = (firstCellStyle != null) ? firstCellStyle : 'swimlane;swimlaneHead=0;swimlaneBody=0;fontStyle=0;' +
+		'connectable=0;fillColor=none;startSize=40;' + s;
+	cellStyle = (cellStyle != null) ? cellStyle : 'swimlane;swimlaneHead=0;swimlaneBody=0;fontStyle=0;connectable=0;' +
+		'fillColor=none;startSize=0;' + s;
 	
 	var table = this.createVertex(null, null, (title != null) ? title : '', 0, 0,
 		colCount * w, rowCount * h, tableStyle);
@@ -6055,6 +6062,7 @@ Graph.prototype.visitTableCells = function(cell, visitor)
 	{
 		var rowStart = this.getActualStartSize(rows[i], true);
 		var cols = this.model.getChildCells(rows[i], true);
+		var rowStyle = this.getCellStyle(rows[i], true);
 		var lastCol = null;
 		var row = [];
 
@@ -6093,7 +6101,13 @@ Graph.prototype.visitTableCells = function(cell, visitor)
 				}
 			}
 
-			visitor(col, cols.length, rows.length, start.x + rowStart.x, start.y + rowStart.y);
+			var head = mxUtils.getValue(rowStyle, mxConstants.STYLE_SWIMLANE_HEAD, 1) == 1 &&
+				mxUtils.getValue(rowStyle, mxConstants.STYLE_STROKECOLOR,
+					mxConstants.NONE) != mxConstants.NONE;
+				
+			visitor(col, cols.length, rows.length,
+				start.x + ((head) ? rowStart.x : 0),
+				start.y + ((head) ? rowStart.y : 0));
 			row.push(col);
 			lastCol = col;
 		}
@@ -7849,20 +7863,21 @@ if (typeof mxVertexHandler != 'undefined')
 		};
 
 		/**
-		 * Overridden to check for table shape.
+		 * Overridden to use table cell instead of table as parent.
 		 */
 		Graph.prototype.isSwimlane = function(cell, ignoreState)
 		{
-			if (cell != null && this.model.getParent(cell) != this.model.getRoot() &&
-				!this.model.isEdge(cell))
+			var shape = null;
+
+			if (cell != null && !this.model.isEdge(cell) &&
+				this.model.getParent(cell) !=
+					this.model.getRoot())
 			{
-				var shape = this.getCurrentCellStyle(cell, ignoreState)
-					[mxConstants.STYLE_SHAPE];
-				
-				return shape == mxConstants.SHAPE_SWIMLANE || shape == 'table';
+				var style = this.getCurrentCellStyle(cell, ignoreState)
+				shape = style[mxConstants.STYLE_SHAPE];
 			}
 			
-			return false;
+			return shape == mxConstants.SHAPE_SWIMLANE || shape == 'table';
 		};
 		
 		/**

+ 24 - 26
src/main/webapp/js/grapheditor/Shapes.js

@@ -260,7 +260,7 @@
 	
 	TableShape.prototype.paintVertexShape = function(c, x, y, w, h)
 	{
-		// LATER: Split background to add striping
+		// LATER: Split background to add striping, paint rows and cells
 		//paintTableBackground(this.state, c, x, y, w, h);
 		var start = this.getTitleSize();
 		
@@ -316,7 +316,7 @@
 	}
 
 	mxCellRenderer.registerShape('table', TableShape);
-	
+
 	// Cube Shape, supports size style
 	function CubeShape()
 	{
@@ -5694,7 +5694,7 @@
 						state.style['width'] = Math.round(w * 2) / state.view.scale;
 						
 						// Applies to opposite side
-						if (mxEvent.isControlDown(me.getEvent()))
+						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 						{
 							state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
 						}
@@ -5725,7 +5725,7 @@
 						state.style['startWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
 						
 						// Applies to opposite side
-						if (mxEvent.isControlDown(me.getEvent()))
+						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 						{
 							state.style[mxConstants.STYLE_ENDSIZE] = state.style[mxConstants.STYLE_STARTSIZE];
 							state.style['endWidth'] = state.style['startWidth'];
@@ -5765,7 +5765,7 @@
 						state.style['width'] = Math.round(w * 2) / state.view.scale;
 						
 						// Applies to opposite side
-						if (mxEvent.isControlDown(me.getEvent()))
+						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 						{
 							state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
 						}
@@ -5796,7 +5796,7 @@
 						state.style['endWidth'] = Math.max(0, Math.round(w * 2) - state.shape.getEdgeWidth()) / state.view.scale;
 						
 						// Applies to opposite side
-						if (mxEvent.isControlDown(me.getEvent()))
+						if (mxEvent.isShiftDown(me.getEvent()) || mxEvent.isControlDown(me.getEvent()))
 						{
 							state.style[mxConstants.STYLE_STARTSIZE] = state.style[mxConstants.STYLE_ENDSIZE];
 							state.style['startWidth'] = state.style['endWidth'];
@@ -5829,7 +5829,7 @@
 					var size = parseFloat(mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
 					handles.push(createArcHandle(state, size / 2));
 				}
-				
+
 				// Start size handle must be last item in handles for hover to work in tables (see mouse event handler in Graph)
 				handles.push(createHandle(state, [mxConstants.STYLE_STARTSIZE], function(bounds)
 				{
@@ -5851,31 +5851,29 @@
 							Math.round(Math.max(0, Math.min(bounds.width, pt.x - bounds.x)));
 				}, false, null, function(me)
 				{
-					if (mxEvent.isControlDown(me.getEvent()))
+					var graph = state.view.graph;
+					
+					if (!mxEvent.isShiftDown(me.getEvent()) && !mxEvent.isControlDown(me.getEvent()) &&
+						(graph.isTableRow(state.cell) || graph.isTableCell(state.cell)))
 					{
-						var graph = state.view.graph;
+						var dir = graph.getSwimlaneDirection(state.style);
+						var parent = graph.model.getParent(state.cell);
+						var cells = graph.model.getChildCells(parent, true);
+						var temp = [];
 						
-						if (graph.isTableRow(state.cell) || graph.isTableCell(state.cell))
+						for (var i = 0; i < cells.length; i++)
 						{
-							var dir = graph.getSwimlaneDirection(state.style);
-							var parent = graph.model.getParent(state.cell);
-							var cells = graph.model.getChildCells(parent, true);
-							var temp = []; 
-							
-							for (var i = 0; i < cells.length; i++)
+							// Finds siblings with the same direction and to set start size
+							if (cells[i] != state.cell && graph.isSwimlane(cells[i]) &&
+								graph.getSwimlaneDirection(graph.getCurrentCellStyle(
+								cells[i])) == dir)
 							{
-								// Finds siblings with the same direction and to set start size
-								if (cells[i] != state.cell && graph.isSwimlane(cells[i]) &&
-									graph.getSwimlaneDirection(graph.getCurrentCellStyle(
-									cells[i])) == dir)
-								{
-									temp.push(cells[i]);
-								}
+								temp.push(cells[i]);
 							}
-							
-							graph.setCellStyles(mxConstants.STYLE_STARTSIZE,
-								state.style[mxConstants.STYLE_STARTSIZE], temp);
 						}
+						
+						graph.setCellStyles(mxConstants.STYLE_STARTSIZE,
+							state.style[mxConstants.STYLE_STARTSIZE], temp);
 					}					
 				}));
 				

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
src/main/webapp/js/grapheditor/Sidebar.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2 - 2
src/main/webapp/js/viewer-static.min.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2 - 2
src/main/webapp/js/viewer.min.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
src/main/webapp/mxgraph/mxClient.js


+ 1 - 1
src/main/webapp/package.json

@@ -34,6 +34,6 @@
     "pdf-lib": "^1.16.0"
   },
   "devDependencies": {
-    "electron": "^13.6.1"
+    "electron": "^16.0.5"
   }
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
src/main/webapp/service-worker.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
src/main/webapp/service-worker.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
src/main/webapp/templates/basic/cross.xml