소스 검색

15.5.4 release

David Benson [draw.io] 3 년 전
부모
커밋
19bd7cb931
37개의 변경된 파일3392개의 추가작업 그리고 3157개의 파일을 삭제
  1. 0 13
      CITATION.cff
  2. 17 2
      ChangeLog
  3. 12 7
      README.md
  4. 1 1
      VERSION
  5. 0 28
      src/main/java/com/mxgraph/online/ImportServlet.java
  6. 0 206
      src/main/java/com/mxgraph/online/SaveServlet.java
  7. 13 0
      src/main/webapp/CITATION.cff
  8. 0 14
      src/main/webapp/WEB-INF/web.xml
  9. BIN
      src/main/webapp/images/sidebar-c4.png
  10. 637 611
      src/main/webapp/js/app.min.js
  11. 31 5
      src/main/webapp/js/diagramly/App.js
  12. 1 1
      src/main/webapp/js/diagramly/Dialogs.js
  13. 17 9
      src/main/webapp/js/diagramly/Editor.js
  14. 3 5
      src/main/webapp/js/diagramly/EditorUi.js
  15. 4 1
      src/main/webapp/js/diagramly/GitLabClient.js
  16. 1 0
      src/main/webapp/js/diagramly/GraphViewer.js
  17. 9 9
      src/main/webapp/js/diagramly/Menus.js
  18. 5 4
      src/main/webapp/js/diagramly/Minimal.js
  19. 2 2
      src/main/webapp/js/diagramly/Pages.js
  20. 214 55
      src/main/webapp/js/diagramly/sidebar/Sidebar-C4.js
  21. 1 1
      src/main/webapp/js/export.js
  22. 5 1
      src/main/webapp/js/grapheditor/Actions.js
  23. 17 19
      src/main/webapp/js/grapheditor/EditorUi.js
  24. 25 11
      src/main/webapp/js/grapheditor/Format.js
  25. 16 11
      src/main/webapp/js/grapheditor/Graph.js
  26. 33 4
      src/main/webapp/js/grapheditor/Shapes.js
  27. 9 3
      src/main/webapp/js/shapes-14-6-5.min.js
  28. 1026 1019
      src/main/webapp/js/viewer-static.min.js
  29. 1017 1016
      src/main/webapp/js/viewer.min.js
  30. 1 1
      src/main/webapp/mxgraph/mxClient.js
  31. 1 1
      src/main/webapp/plugins/replay.js
  32. 1 1
      src/main/webapp/plugins/text.js
  33. 86 86
      src/main/webapp/resources/dia_pt-br.txt
  34. 6 6
      src/main/webapp/resources/dia_sv.txt
  35. 1 1
      src/main/webapp/service-worker.js
  36. 1 1
      src/main/webapp/service-worker.js.map
  37. 179 2
      src/main/webapp/shapes/mxC4.js

+ 0 - 13
CITATION.cff

@@ -1,13 +0,0 @@
-cff-version: 1.2.0
-message: "To cite drawio or www.diagrams.net in publications please use:"
-type: software
-license: Apache-2.0
-abstract: "diagrams.net, previously draw.io, is an online diagramming web site that delivers the source in this project."
-authors:
-- name: "JGraph"
-  website: "http://www.diagrams.net"
-title: "diagrams.net, draw.io"
-version: 15.5.2
-date-released: 2021-10-14
-repository-code: "https://github.com/jgraph/drawio"
-url: "https://www.diagrams.net/"

+ 17 - 2
ChangeLog

@@ -1,3 +1,18 @@
+15-OCT-2021: 15.5.4
+
+- Fixes NPE in TableShape.paintForeground
+
+15-OCT-2021: 15.5.3
+
+- Fixes background clipping, in-place bounds changes
+- Fixes clipping in EmbedDialog
+- Updates C4 shapes
+- Fixes new page defaults, adds stepper shift+click
+- Fixes possible getAttribute is not a function
+- Fixes export to GitLab https://github.com/jgraph/drawio/issues/1784
+- Removes save and import servlet
+- Fixes ignored edge source for metadata [DID-3512]
+
 12-OCT-2021: 15.5.2
 
 - Disables plugins, shows sketch for inline embed
@@ -6,7 +21,7 @@
 - Updates current style for fillStyle change
 - Uses shift+click for stroke, alt+click for fill
 - Fixes logic for alt and shift click
-- Adds defaultGridEnabled/-PageVisible config [2306]
+- Adds defaultGridEnabled/-PageVisible config https://github.com/jgraph/drawio/issues/2306
 - Stops editing on exit inline embed mode
 
 11-OCT-2021: 15.5.1
@@ -27,7 +42,7 @@
 - Ports resource generation to JS (Node)
 - Fixes clipping for longer button labels
 - Fixes possible clipping in download PDF dialog
-- FIxes pointer events with no fill color in sketch
+- Fixes pointer events with no fill color in sketch
 - Adds numbered property, fixed for sketch theme
 - Fixes math output in JSON protocol export
 - i18n update Lambda function

+ 12 - 7
README.md

@@ -2,7 +2,9 @@
 
 About
 -----
-[diagrams.net](https://app.diagrams.net), [previously draw.io](https://www.diagrams.net/blog/move-diagrams-net), is an online diagramming web site that delivers the source in this project.
+draw.io, this project, is a configurable diagramming/whiteboarding visualization application. draw.io is owned and developed by JGraph Ltd, a UK based software company.
+
+As well as running this project, we run a production-grade deployment of the diagramming interface at https://app.diagrams.net.
 
 License
 -------
@@ -10,14 +12,17 @@ The source code in this repo is licensed under the Apache v2.
 
 The JGraph provided icons and diagram templates are licensed under the [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). Additional terms may also apply where the icons are originally defined by a third-party copyright holder. We have checked in all cases that the original license allows use in this project.
 
-Additional minified JavaScript files and Java libraries are used in this project. All of the licenses are deemed compatible with the Apache 2.0, nothing is GPL or AGPL.
+Additional minified JavaScript files and Java libraries are used in this project. All of the licenses are deemed compatible with the Apache 2.0, nothing is GPL or AGPL ,due dilgence is performed on all third-party code.
+
+Scope of the Project
+--------------------
 
-Development
------------
+The application is designed to be used largely as-is. It's possible to alter the major parts of the interface, but if you're looking for an editor with very specific editing features, the project is likely not a good base to use.
 
-A development guide is being started on the GitHub project wiki. There is a [draw.io](http://stackoverflow.com/questions/tagged/draw.io) tag on Stack Overflow currently, please make sure any questions adhere to their guidelines for questions.
+That is to say, if you wanted to create/deply a whiteboard or diagramming application where the functionality in the main canvas is as this project provides, it more likely to be a good base to use. 
+The default libraries, the menus, the toolbar, the default colours, the storage location, these can all be changed.
 
-The [mxGraph documentation](https://jgraph.github.io/mxgraph/) provides a lot of the docs for the bottom part of the stack. There is an [mxgraph tag on SO](http://stackoverflow.com/questions/tagged/mxgraph).
+If you are using a draw.io project/product and have issues or questions about the editor itself, the issue tracker and discussion in this GitHub project are likely a good place to look.
 
 Running
 -------
@@ -29,7 +34,7 @@ The full packaged .war of the client and servlets is built when the project is t
 
 Supported Browsers
 ------------------
-diagrams.net supports IE 11, Chrome 70+, Firefox 70+, Safari 11+, Opera 50+, Native Android browser 7x+, the default browser in the current and previous major iOS versions (e.g. 11.2.x and 10.3.x) and Edge 79+.
+diagrams.net supports Chrome 70+, Firefox 70+, Safari 11+, Opera 50+, Native Android browser 7x+, the default browser in the current and previous major iOS versions (e.g. 11.2.x and 10.3.x) and Edge 79+.
 
 Open-source, not open-contribution
 ----------------------------------

+ 1 - 1
VERSION

@@ -1 +1 @@
-15.5.2
+15.5.4

+ 0 - 28
src/main/java/com/mxgraph/online/ImportServlet.java

@@ -1,28 +0,0 @@
-package com.mxgraph.online;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@SuppressWarnings("serial")
-public class ImportServlet extends HttpServlet
-{
-
-	@Override
-	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
-	{
-		if(!req.getRemoteHost().endsWith("atlassian.net")) 
-		{
-			
-		} 
-		else 
-		{
-			System.out.println(req);
-		}
-	}
-
-	
-}

+ 0 - 206
src/main/java/com/mxgraph/online/SaveServlet.java

@@ -1,206 +0,0 @@
-package com.mxgraph.online;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.util.logging.Logger;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Servlet implementation class SaveServlet
- */
-public class SaveServlet extends HttpServlet
-{
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * 
-	 */
-	private static final Logger log = Logger
-			.getLogger(SaveServlet.class.getName());
-
-	/**
-	 * @see HttpServlet#HttpServlet()
-	 */
-	public SaveServlet()
-	{
-		super();
-	}
-
-	/**
-	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
-	 *      response)
-	 */
-	protected void doPost(HttpServletRequest request,
-			HttpServletResponse response) throws ServletException, IOException
-	{
-		handlePost(request, response);
-	}
-
-	/**
-	 * Validates the given filename.
-	 */
-	protected static String validateFilename(String filename)
-	{
-		// Only limited characters allowed
-		try
-		{
-			filename = URLDecoder.decode(filename, "UTF-8");
-		}
-		catch (UnsupportedEncodingException e)
-		{
-			// ignore unsupported encoding
-		}
-		
-		filename = filename.replaceAll("[\\/:;*?\"<>|]", "");
-		
-		if (filename.length() == 0)
-		{
-			filename = "export.txt";
-		}
-		else if (!filename.toLowerCase().endsWith(".svg") &&
-			!filename.toLowerCase().endsWith(".html") &&
-			!filename.toLowerCase().endsWith(".xml") &&
-			!filename.toLowerCase().endsWith(".png") &&
-			!filename.toLowerCase().endsWith(".jpg") &&
-			!filename.toLowerCase().endsWith(".pdf") &&
-			!filename.toLowerCase().endsWith(".vsdx") &&
-			!filename.toLowerCase().endsWith(".txt"))
-		{
-			filename = filename + ".txt";
-		}
-		
-		filename = Utils.encodeURIComponent(filename, "UTF-8");
-		
-		return filename;
-	}
-
-	public static void handlePost(HttpServletRequest request,
-			HttpServletResponse response) throws ServletException, IOException
-	{
-		if (request.getContentLength() < Constants.MAX_REQUEST_SIZE)
-		{
-			long t0 = System.currentTimeMillis();
-			String filename = request.getParameter("filename");
-			byte[] data = null;
-
-			// Data in data param is base64 encoded and deflated
-			String enc = request.getParameter("data");
-			String xml = null;
-
-			try
-			{
-				if (enc != null && enc.length() > 0)
-				{
-					// NOTE: Simulate is used on client-side so the value is double-encoded
-					xml = Utils.inflate(mxBase64.decode(URLDecoder
-							.decode(enc, Utils.CHARSET_FOR_URL_ENCODING)
-							.getBytes()));
-				}
-				else
-				{
-					xml = request.getParameter("xml");
-				}
-
-				// Decoding is optional (no plain text values allowed here so %3C means encoded)
-				if (xml != null && xml.startsWith("%3C"))
-				{
-					xml = URLDecoder.decode(xml, Utils.CHARSET_FOR_URL_ENCODING);
-				}
-
-				String binary = request.getParameter("binary");
-
-				if (binary != null && binary.equals("1") && xml != null && filename != null)
-				{
-					response.setStatus(HttpServletResponse.SC_OK);
-					response.setContentType("application/octet-stream");
-					filename = validateFilename(filename);
-					response.setHeader("Content-Disposition",
-						"attachment; filename=\"" + filename +
-						"\"; filename*=UTF-8''" + filename);
-					response.getOutputStream().write(
-						mxBase64.decodeFast(URLDecoder.decode(xml,
-						Utils.CHARSET_FOR_URL_ENCODING)));
-				}
-				else if (xml != null)
-				{
-					data = xml.getBytes(Utils.CHARSET_FOR_URL_ENCODING);
-					String format = request.getParameter("format");
-					response.setStatus(HttpServletResponse.SC_OK);
-
-					if (filename != null)
-					{
-						if (format == null)
-						{
-							format = "xml";
-						}
-	
-						if (filename.length() > 0  &&
-							!filename.toLowerCase().endsWith(".svg") &&
-							!filename.toLowerCase().endsWith(".html") &&
-							!filename.toLowerCase().endsWith(".png") &&
-							!filename.toLowerCase().endsWith("." + format))
-						{
-							filename += "." + format;
-						}
-
-						filename = validateFilename(filename);
-					}
-					else
-					{
-						filename = validateFilename((format != null) ?
-							"export." + format.toLowerCase() :
-							"export.txt");
-					}
-
-					response.setContentType("application/octet-stream");
-					response.setHeader("Content-Disposition",
-						"attachment; filename=\"" + filename +
-						"\"; filename*=UTF-8''" + filename);
-
-					OutputStream out = response.getOutputStream();
-					out.write(data);
-					out.close();
-				}
-				else
-				{
-					response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
-				}
-
-				long mem = Runtime.getRuntime().totalMemory()
-						- Runtime.getRuntime().freeMemory();
-
-				log.fine("save: ip=" + request.getRemoteAddr() + " ref=\""
-						+ request.getHeader("Referer") + "\" in="
-						+ request.getContentLength() + " enc="
-						+ ((enc != null) ? enc.length() : "[none]") + " xml="
-						+ ((xml != null) ? xml.length() : "[none]") + " dt="
-						+ request.getContentLength() + " mem=" + mem + " dt="
-						+ (System.currentTimeMillis() - t0));
-			}
-			catch (OutOfMemoryError e)
-			{
-				response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-			}
-			catch (IllegalArgumentException e)
-			{
-				log.warning("Error parsing xml contents : " + xml
-						+ System.getProperty("line.separator")
-						+ "Original stack trace : " + e.getMessage());
-			}
-		}
-		else
-		{
-			response.setStatus(HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE);
-		}
-	}
-
-}

+ 13 - 0
src/main/webapp/CITATION.cff

@@ -0,0 +1,13 @@
+cff-version: 1.2.0
+message: "To cite draw.io in publications please use:"
+type: software
+license: Apache-2.0
+abstract: "draw.io - JavaScript Diagramming and Whiteboard Application"
+authors:
+- name: "JGraph"
+  website: "http://www.diagrams.net"
+title: "draw.io"
+version: 15.5.2
+date-released: 2021-10-14
+repository-code: "https://github.com/jgraph/drawio"
+url: "https://www.diagrams.net/"

+ 0 - 14
src/main/webapp/WEB-INF/web.xml

@@ -6,20 +6,6 @@
   <welcome-file-list>
     <welcome-file>index.html</welcome-file>
   </welcome-file-list>
-  <servlet>
-    <description/>
-    <display-name>SaveServlet</display-name>
-    <servlet-name>SaveServlet</servlet-name>
-    <servlet-class>com.mxgraph.online.SaveServlet</servlet-class>
-  </servlet>
-  <servlet-mapping>
-    <servlet-name>SaveServlet</servlet-name>
-    <url-pattern>/SaveServlet</url-pattern>
-  </servlet-mapping>
-  <servlet-mapping>
-    <servlet-name>SaveServlet</servlet-name>
-    <url-pattern>/save</url-pattern>
-  </servlet-mapping>
   <servlet>
     <description/>
     <display-name>ProxyServlet</display-name>

BIN
src/main/webapp/images/sidebar-c4.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 637 - 611
src/main/webapp/js/app.min.js


+ 31 - 5
src/main/webapp/js/diagramly/App.js

@@ -2433,6 +2433,7 @@ App.prototype.getThumbnail = function(width, fn)
 
 			if (bgImg != null)
 			{
+				bounds = mxRectangle.fromRectangle(bounds);
 				bounds.add(new mxRectangle(
 					(t.x + bgImg.x) * s, (t.y + bgImg.y) * s,
 					bgImg.width * s, bgImg.height * s));
@@ -5946,6 +5947,17 @@ App.prototype.fetchAndShowNotification = function(target)
 
 App.prototype.showNotification = function(notifs, lsReadFlag)
 {
+	if (notifs.length == 0)
+	{
+		if (this.notificationBtn != null)
+		{
+			this.notificationBtn.style.display = 'none';
+			this.editor.fireEvent(new mxEventObject('statusChanged'));
+		}
+		
+		return;
+	}
+	
 	function shouldAnimate(newNotif)
 	{
 		var countEl = document.querySelector('.geNotification-count');
@@ -6062,6 +6074,10 @@ App.prototype.showNotification = function(notifs, lsReadFlag)
 		
 		mxEvent.addListener(winClose, 'click', markAllAsRead);
 	}
+	else
+	{
+		this.notificationBtn.style.display = ''; //In case it was hidden
+	}
 		
 	var newNotif = 0;
 	var notifListEl = document.getElementById('geNotifList');
@@ -6070,11 +6086,6 @@ App.prototype.showNotification = function(notifs, lsReadFlag)
 	{
 		return; //This shouldn't happen and no meaning of continuing
 	}
-	else if (notifs.length == 0)
-	{
-		notifListEl.innerHTML = '<div class="line"></div><div class="notification">' +
-								mxUtils.htmlEntities(mxResources.get('none')) + '</div>';
-	}
 	else
 	{
 		notifListEl.innerHTML = '<div class="line"></div>';
@@ -6349,6 +6360,21 @@ App.prototype.exportFile = function(data, filename, mimeType, base64Encoded, mod
 			}), true, folderId, base64Encoded);
 		}
 	}
+	else if (mode == App.MODE_GITLAB)
+	{
+		if (this.gitHub != null && this.spinner.spin(document.body, mxResources.get('saving')))
+		{
+			// Must insert file as library to force the file to be written
+			this.gitLab.insertFile(filename, data, mxUtils.bind(this, function()
+			{
+				this.spinner.stop();
+			}), mxUtils.bind(this, function(resp)
+			{
+				this.spinner.stop();
+				this.handleError(resp);
+			}), true, folderId, base64Encoded);
+		}
+	}
 	else if (mode == App.MODE_TRELLO)
 	{
 		if (this.trello != null && this.spinner.spin(document.body, mxResources.get('saving')))

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

@@ -9479,7 +9479,7 @@ var LibraryDialog = function(editorUi, name, library, initialImages, file, mode)
 						var dlg = new EmbedDialog(editorUi, window.location.protocol + '//' +
 							window.location.host + '/' + search, null, null, null, null,
 							'Check out the library I made using @drawio');
-						editorUi.showDialog(dlg.container, 440, 240, true);
+						editorUi.showDialog(dlg.container, 450, 240, true);
 						dlg.init();
 					}
 					else if (file.constructor == DriveLibrary)

+ 17 - 9
src/main/webapp/js/diagramly/Editor.js

@@ -5192,14 +5192,17 @@
 			
 			var setScheme = mxUtils.bind(this, function(index)
 			{
-				if (this.format.currentScheme != null)
+				if (dots[index] != null)
 				{
-					dots[this.format.currentScheme].style.background = 'transparent';
+					if (this.format.currentScheme != null && dots[this.format.currentScheme] != null)
+					{
+						dots[this.format.currentScheme].style.background = 'transparent';
+					}
+					
+					this.format.currentScheme = index;
+					updateScheme(this.defaultColorSchemes[this.format.currentScheme]);
+					dots[this.format.currentScheme].style.background = '#84d7ff';
 				}
-				
-				this.format.currentScheme = index;
-				updateScheme(this.defaultColorSchemes[this.format.currentScheme]);
-				dots[this.format.currentScheme].style.background = '#84d7ff';
 			});
 			
 			var updateScheme = mxUtils.bind(this, function(colorsets)
@@ -5744,7 +5747,7 @@
 	 * Properties for the SVG shadow effect.
 	 */
 	Graph.prototype.svgShadowSize = '3';
-		
+
 	/**
 	 * Enables move of bends/segments without selecting.
 	 */
@@ -5753,8 +5756,13 @@
 	/**
 	 * Enables move of bends/segments without selecting.
 	 */
-	 Graph.prototype.hiddenTags = null;
-		
+	Graph.prototype.hiddenTags = null;
+	
+	/**
+	 * Enables move of bends/segments without selecting.
+	 */
+	Graph.prototype.defaultMathEnabled = false;
+	
 	/**
 	 * Adds rack child layout style.
 	 */

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

@@ -577,6 +577,7 @@
 		this.editor.graph.mathEnabled = value;
 		this.editor.updateGraphComponents();
 		this.editor.graph.refresh();
+		this.editor.graph.defaultMathEnabled = value;
 		
 		this.fireEvent(new mxEventObject('mathEnabledChanged'));
 	};
@@ -4563,7 +4564,7 @@
 					else if (mimeType != null && mimeType.substring(0, 9) == 'text/html')
 					{
 						var dlg = new EmbedDialog(this, data);
-						this.showDialog(dlg.container, 440, 240, true, true);
+						this.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					}
 					else
@@ -5596,7 +5597,7 @@
 		var s2 = (fetchParam.length > 0) ? (((urlParams['dev'] == '1') ?
 			'https://test.draw.io/embed2.js?dev=1' : EditorUi.lightboxHost + '/embed2.js?')) + fetchParam :
 			(((urlParams['dev'] == '1') ? 'https://test.draw.io/js/viewer-static.min.js' :
-			window.VIEWER_URL ? window.VIEWER_URL : EditorUi.lightboxHost + '/js/viewer-static.min.js'));
+			window.DRAWIO_VIEWER_URL ? window.DRAWIO_VIEWER_URL : EditorUi.lightboxHost + '/js/viewer-static.min.js'));
 		var src = '<script type="text/javascript" src="' + s2 + '"></script>';
 		
 		fn(value, src);
@@ -13194,9 +13195,6 @@
 		    					
 		    					if (tmp != null)
 		    					{
-		    						// Removes attribute
-			    					graph.setAttributeForCell(dataCell, edge.from, null);
-			    					
 			    					if (tmp != '')
 			    					{
 			    						var refs = tmp.split(',');

+ 4 - 1
src/main/webapp/js/diagramly/GitLabClient.js

@@ -574,7 +574,10 @@ GitLabClient.prototype.insertFile = function(filename, data, success, error, asL
 							try
 							{
 								var msg = JSON.parse(req.getText());
-								success(this.createGitLabFile(org, repo, ref, msg.content, asLibrary, refPos));
+
+								success(this.createGitLabFile(org, repo, ref,
+									(msg.content != null) ? msg.content : msg,
+									asLibrary, refPos));
 							}
 							catch (e)
 							{

+ 1 - 0
src/main/webapp/js/diagramly/GraphViewer.js

@@ -386,6 +386,7 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig)
 						var t = this.view.translate;
 						var s = this.view.scale;
 		
+						bounds = mxRectangle.fromRectangle(bounds);
 						bounds.add(new mxRectangle(
 							(t.x + img.x) * s, (t.y + img.y) * s,
 							img.width * s, img.height * s));

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

@@ -370,7 +370,7 @@
 
 					var dlg = new EmbedDialog(editorUi, editorUi.createLink(linkTarget, linkColor,
 						allPages, lightbox, editLink, layers, null, true, params));
-					editorUi.showDialog(dlg.container, 440, 240, true, true);
+					editorUi.showDialog(dlg.container, 450, 240, true, true);
 					dlg.init();
 				});
 			}));
@@ -1063,7 +1063,7 @@
 									'/' + editorUi.getSearch() + '#_CONFIG_' +
 									Graph.compress(JSON.stringify(obj));
 								var dlg = new EmbedDialog(editorUi, url);
-								editorUi.showDialog(dlg.container, 440, 240, true);
+								editorUi.showDialog(dlg.container, 450, 240, true);
 								dlg.init();
 							}
 							catch (e)
@@ -2009,7 +2009,7 @@
 										editorUi.handleError({message: mxResources.get('errorUpdatingPreview')});
 									}
 								});
-								editorUi.showDialog(dlg.container, 440, 240, true, true);
+								editorUi.showDialog(dlg.container, 450, 240, true, true);
 								dlg.init();
 							}));
 					});
@@ -2031,7 +2031,7 @@
 					{
 						var dlg = new EmbedDialog(editorUi, '<img src="' + ((current.constructor != DriveFile) ?
 							url : 'https://drive.google.com/uc?id=' + current.getId()) + '"/>');
-						editorUi.showDialog(dlg.container, 440, 240, true, true);
+						editorUi.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					}
 					else
@@ -2052,7 +2052,7 @@
 					{
 						editorUi.spinner.stop();
 						var dlg = new EmbedDialog(editorUi, result);
-						editorUi.showDialog(dlg.container, 440, 240, true, true);
+						editorUi.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					}, function(err)
 					{
@@ -2074,7 +2074,7 @@
 						editorUi.spinner.stop();
 						
 						var dlg = new EmbedDialog(editorUi, result);
-						editorUi.showDialog(dlg.container, 440, 240, true, true);
+						editorUi.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					}, function(err)
 					{
@@ -2109,7 +2109,7 @@
 						var dlg = new EmbedDialog(editorUi, '<iframe frameborder="0" style="width:' + width +
 							';height:' + height + ';" src="' + editorUi.createLink(linkTarget, linkColor,
 							allPages, lightbox, editLink, layers, url, null, params) + '"></iframe>');
-						editorUi.showDialog(dlg.container, 440, 240, true, true);
+						editorUi.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					});
 				}
@@ -2135,7 +2135,7 @@
 
 						var dlg = new EmbedDialog(editorUi, editorUi.createLink(linkTarget, linkColor,
 							allPages, lightbox, editLink, layers, url, null, params, true));
-						editorUi.showDialog(dlg.container, 440, 240, true, true);
+						editorUi.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					});
 				}
@@ -2162,7 +2162,7 @@
 
 						var dlg = new EmbedDialog(editorUi, editorUi.createLink(linkTarget, linkColor,
 							allPages, lightbox, editLink, layers, url, null, params));
-						editorUi.showDialog(dlg.container, 440, 240, true, true);
+						editorUi.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					});
 				}

+ 5 - 4
src/main/webapp/js/diagramly/Minimal.js

@@ -1272,7 +1272,7 @@ EditorUi.initMinimalTheme = function()
 					ui.menus.addMenuItems(menu, ['-', 'showStartScreen', 'search', 'scratchpad'], parent);
 				}
 
-				if (urlParams['sketch'] == '1')
+				if (urlParams['sketch'] == '1' && urlParams['pages'] == null)
 				{
 					this.addMenuItems(menu, ['togglePagesVisible'], parent);
 				}
@@ -1979,7 +1979,8 @@ EditorUi.initMinimalTheme = function()
 						typeof ui.statusContainer.firstChild.getAttribute === 'function' &&
 						ui.statusContainer.firstChild.getAttribute('class') == null))
 					{
-						var title = (ui.statusContainer.firstChild != null) ?
+						var title = (ui.statusContainer.firstChild != null &&
+							typeof ui.statusContainer.firstChild.getAttribute === 'function') ?
 							ui.statusContainer.firstChild.getAttribute('title') :
 							ui.editor.getStatus();
 						setNotificationTitle(title);
@@ -2334,8 +2335,8 @@ EditorUi.initMinimalTheme = function()
 
 				function pagesVisibleChanged()
 				{
-					pageMenu.style.display = (urlParams['pages'] == '1' ||
-						(ui.pages != null && ui.pages.length > 1 ) ||
+					pageMenu.style.display = ui.pages != null &&
+						(urlParams['pages'] == '1' || ui.pages.length > 1 ||
 						Editor.pagesVisible) ? 'inline-block' : 'none';
 				};
 

+ 2 - 2
src/main/webapp/js/diagramly/Pages.js

@@ -815,7 +815,7 @@ Graph.prototype.setViewState = function(state, removeOldExtFonts)
 		this.setConnectable(true);
 		this.lastPasteXml = null;
 		this.pasteCounter = 0;
-		this.mathEnabled = false;
+		this.mathEnabled = this.defaultMathEnabled;
 		this.connectionArrowsEnabled = true;
 		this.hiddenTags = [];
 		this.extFonts = [];
@@ -1792,7 +1792,7 @@ EditorUi.prototype.createPageMenu = function(page, label)
 					}
 					
 					var dlg = new EmbedDialog(this, this.getLinkForPage(page, params, lightbox));
-					this.showDialog(dlg.container, 440, 240, true, true);
+					this.showDialog(dlg.container, 450, 240, true, true);
 					dlg.init();
 				}));
 			}));

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 214 - 55
src/main/webapp/js/diagramly/sidebar/Sidebar-C4.js


+ 1 - 1
src/main/webapp/js/export.js

@@ -580,7 +580,7 @@ function render(data)
 			{
 				var size = this.getPageSize();
 				var bounds = this.getGraphBounds();
-				
+
 				if (bounds.width == 0 || bounds.height == 0)
 				{
 					return new mxRectangle(0, 0, 1, 1);

+ 5 - 1
src/main/webapp/js/grapheditor/Actions.js

@@ -997,7 +997,10 @@ Actions.prototype.init = function()
 
 		if (graph.backgroundImage != null)
 		{
-			bounds.add(new mxRectangle(0, 0, graph.backgroundImage.width, graph.backgroundImage.height));
+			bounds = mxRectangle.fromRectangle(bounds);
+			bounds.add(new mxRectangle(0, 0,
+				graph.backgroundImage.width,
+				graph.backgroundImage.height));
 		}
 		
 		if (bounds.width == 0 || bounds.height == 0)
@@ -1122,6 +1125,7 @@ Actions.prototype.init = function()
 	action = this.addAction('grid', function()
 	{
 		graph.setGridEnabled(!graph.isGridEnabled());
+		graph.defaultGridEnabled = graph.isGridEnabled();
 		ui.fireEvent(new mxEventObject('gridEnabledChanged'));
 	}, null, null, Editor.ctrlKey + '+Shift+G');
 	action.setToggleAction(true);

+ 17 - 19
src/main/webapp/js/grapheditor/EditorUi.js

@@ -17,30 +17,27 @@ EditorUi = function(editor, container, lightbox)
 	this.initialDefaultVertexStyle = mxUtils.clone(graph.defaultVertexStyle);
 	this.initialDefaultEdgeStyle = mxUtils.clone(graph.defaultEdgeStyle);
 
-	if (lightbox)
+	// Overrides graph bounds to include background pages
+	var graphGetGraphBounds = graph.getGraphBounds;
+
+	graph.getGraphBounds = function(img)
 	{
-		// Overrides graph bounds to include background pages
-		var graphGetGraphBounds = graph.getGraphBounds;
+		var bounds = graphGetGraphBounds.apply(this, arguments);
+		var img = this.backgroundImage;
 
-		graph.getGraphBounds = function(img)
+		if (img != null)
 		{
-			var bounds = graphGetGraphBounds.apply(this, arguments);
-			var img = this.backgroundImage;
-
-			if (img != null)
-			{
-				var t = this.view.translate;
-				var s = this.view.scale;
+			var t = this.view.translate;
+			var s = this.view.scale;
 
-				bounds.add(new mxRectangle(
-					(t.x + img.x) * s, (t.y + img.y) * s,
-					img.width * s, img.height * s));
-			}
-	
-			return bounds;
-		};
-	}
+			bounds = mxRectangle.fromRectangle(bounds);
+			bounds.add(new mxRectangle(
+				(t.x + img.x) * s, (t.y + img.y) * s,
+				img.width * s, img.height * s));
+		}
 
+		return bounds;
+	};
 
 	// Faster scrollwheel zoom is possible with CSS transforms
 	if (graph.useCssTransforms)
@@ -3502,6 +3499,7 @@ EditorUi.prototype.setPageVisible = function(value)
 		graph.container.scrollTop = graph.view.translate.y * graph.view.scale - ty;
 	}
 	
+	graph.defaultPageVisible = value;
 	this.fireEvent(new mxEventObject('pageViewChanged'));
 };
 

+ 25 - 11
src/main/webapp/js/grapheditor/Format.js

@@ -855,11 +855,7 @@ BaseFormatPanel.prototype.createStepper = function(input, update, step, height,
 {
 	step = (step != null) ? step : 1;
 	height = (height != null) ? height : 9;
-	
-	if (mxClient.IS_MT || document.documentMode >= 8)
-	{
-		//height = height + 1;
-	} 
+	var bigStep = 10 * step;
 	
 	var stepper = document.createElement('div');
 	mxUtils.setPrefixedStyle(stepper.style, 'borderRadius', '3px');
@@ -880,7 +876,11 @@ BaseFormatPanel.prototype.createStepper = function(input, update, step, height,
 	down.className = 'geBtnDown';
 	stepper.appendChild(down);
 
-	mxEvent.addListener(down, 'click', function(evt)
+	mxEvent.addGestureListeners(down, function(evt)
+	{
+		// Stops text selection on shift+click
+		mxEvent.consume(evt);
+	}, null, function(evt)
 	{
 		if (input.value == '')
 		{
@@ -891,18 +891,22 @@ BaseFormatPanel.prototype.createStepper = function(input, update, step, height,
 		
 		if (!isNaN(val))
 		{
-			input.value = val - step;
+			input.value = val - (mxEvent.isShiftDown(evt) ? bigStep : step);
 			
 			if (update != null)
 			{
 				update(evt);
 			}
 		}
-		
+
 		mxEvent.consume(evt);
 	});
 	
-	mxEvent.addListener(up, 'click', function(evt)
+	mxEvent.addGestureListeners(up, function(evt)
+	{
+		// Stops text selection on shift+click
+		mxEvent.consume(evt);
+	}, null, function(evt)
 	{
 		if (input.value == '')
 		{
@@ -913,14 +917,14 @@ BaseFormatPanel.prototype.createStepper = function(input, update, step, height,
 		
 		if (!isNaN(val))
 		{
-			input.value = val + step;
+			input.value = val + (mxEvent.isShiftDown(evt) ? bigStep : step);
 			
 			if (update != null)
 			{
 				update(evt);
 			}
 		}
-		
+
 		mxEvent.consume(evt);
 	});
 	
@@ -957,6 +961,14 @@ BaseFormatPanel.prototype.createStepper = function(input, update, step, height,
 			}
 		);
 	}
+	else
+	{
+		// Stops propagation on checkbox labels
+		mxEvent.addListener(stepper, 'click', function(evt)
+		{
+			mxEvent.consume(evt);
+		});
+	}
 	
 	return stepper;
 };
@@ -6775,6 +6787,7 @@ DiagramFormatPanel.prototype.addGridOption = function(container)
 		
 		if (value != graph.getGridSize())
 		{
+			mxGraph.prototype.gridSize = value;
 			graph.setGridSize(value)
 		}
 
@@ -6813,6 +6826,7 @@ DiagramFormatPanel.prototype.addGridOption = function(container)
 		
 		if (enabled != graph.isGridEnabled())
 		{
+			graph.defaultGridEnabled = graph.isGridEnabled();
 			ui.fireEvent(new mxEventObject('gridEnabledChanged'));
 		}
 	}, Editor.isDarkMode() ? graph.view.defaultDarkGridColor : graph.view.defaultGridColor,

+ 16 - 11
src/main/webapp/js/grapheditor/Graph.js

@@ -6189,18 +6189,8 @@ TableLayout.prototype.layoutRow = function(row, positions, height, tw, lastCells
 			model.setGeometry(cells[i], cell);
 		}
 
-		// Handles colspan
 		var visible = true;
 
-		if (last != null && last.geo != null &&
-			last.colspan != null && last.colspan > 1)
-		{
-			last.geo.width += (cell.alternateBounds != null) ?
-				cell.alternateBounds.width : cell.width;
-			visible = false;
-			last.colspan--;
-		}
-
 		// Handles rowspan
 		var upper = lastCells[i];
 
@@ -6213,6 +6203,16 @@ TableLayout.prototype.layoutRow = function(row, positions, height, tw, lastCells
 			upper.rowspan--;
 		}
 
+		// Handles colspan
+		if (last != null && last.geo != null &&
+			last.colspan != null && last.colspan > 1)
+		{
+			last.geo.width += (cell.alternateBounds != null) ?
+				cell.alternateBounds.width : cell.width;
+			visible = false;
+			last.colspan--;
+		}
+
 		model.setVisible(cells[i], visible);
 
 		var style = this.graph.getCurrentCellStyle(cells[i], true);
@@ -6231,6 +6231,10 @@ TableLayout.prototype.layoutRow = function(row, positions, height, tw, lastCells
 				temp.rowspan = parseInt(style['rowspan'] || 0);
 				lastCells[i] = temp;
 			}
+			else if (upper != null)
+			{
+				temp.colspan = parseInt(upper.style['colspan'] || 0);
+			}
 		}
 	}
 	
@@ -9590,7 +9594,8 @@ if (typeof mxVertexHandler != 'undefined')
 				
 				if (exportType == 'diagram' && this.backgroundImage != null)
 				{
-					 bounds.add(new mxRectangle(
+					bounds = mxRectangle.fromRectangle(bounds);
+					bounds.add(new mxRectangle(
 						(this.view.translate.x + this.backgroundImage.x) * vs,
 						(this.view.translate.y + this.backgroundImage.y) * vs,
 					 	this.backgroundImage.width * vs,

+ 33 - 4
src/main/webapp/js/grapheditor/Shapes.js

@@ -188,8 +188,9 @@
 			var columnLines = mxUtils.getValue(this.state.style,
 				'columnLines', '1') != '0';
 			var geo = graph.getCellGeometry(rows[0]);
+			var cells = graph.model.getChildCells(rows[0], true);
 			var rowData = [{y: (geo != null) ? geo.y + geo.height : 0,
-				cells: graph.model.getChildCells(rows[0], true)}];
+				x: 0, cells: cells, colspans: []}];
 			
 			// Paints row lines
 			if (rowLines)
@@ -197,7 +198,10 @@
 				for (var i = 1; i < rows.length; i++)
 				{
 					geo = graph.getCellGeometry(rows[i]);
-					var data = {y: 0, cells: graph.model.getChildCells(rows[i], true)};
+
+					var data = {y: 0, cells: graph.model.
+						getChildCells(rows[i], true),
+						colspans: []};
 					rowData.push(data);
 
 					if (geo != null)
@@ -206,6 +210,23 @@
 
 						c.begin();
 						c.moveTo(x + start.x, y + geo.y);
+						var tw = 0;
+
+						if (graph.model.isVisible(data.cells[i]))
+						{
+							tw = data.x;
+						}
+						else
+						{
+							if (tw > 0)
+							{
+								c.lineTo(x + tw - start.width, y + geo.y);
+							}
+
+							c.moveTo(x + geo.x + geo.width + start.x, y + geo.y);
+							tw = 0;
+						}
+
 						c.lineTo(x + w - start.width, y + geo.y);
 						c.end();
 						c.stroke();
@@ -215,7 +236,7 @@
 			
 			if (columnLines)
 			{
-				var cols = graph.model.getChildCells(rows[0], true);
+				var cols = rowData[0].cells;
 				
 				// Paints column lines
 				for (var i = 1; i < cols.length; i++)
@@ -234,8 +255,16 @@
 
 							if (data != null)
 							{
-								if (graph.model.isVisible(data.cells[i]))
+								var colspan = (i == 1) ? parseInt(graph.getCurrentCellStyle(
+									data.cells[i - 1])['colspan'] || 1) :
+										rowData[j].colspans[i - 1];
+
+								data.colspans[i] = colspan - 1;
+
+								if (data.colspans[i] < 1)
 								{
+									data.colspans[i] = parseInt(graph.getCurrentCellStyle(
+										data.cells[i])['colspan'] || 1);
 									th = data.y;
 								}
 								else

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 9 - 3
src/main/webapp/js/shapes-14-6-5.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1026 - 1019
src/main/webapp/js/viewer-static.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1017 - 1016
src/main/webapp/js/viewer.min.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
src/main/webapp/mxgraph/mxClient.js


+ 1 - 1
src/main/webapp/plugins/replay.js

@@ -155,7 +155,7 @@ Draw.loadPlugin(function(ui) {
 						var dlg = new EmbedDialog(ui, 'https://www.draw.io/?p=replay&lightbox=1&replay-delay=' +
 							parseFloat(newValue) + '&replay-data=' + Graph.compress('<recording>' +
 							tmp.join('') + '</recording>'));
-						ui.showDialog(dlg.container, 440, 240, true, true);
+						ui.showDialog(dlg.container, 450, 240, true, true);
 						dlg.init();
 					}
 				}, 'Delay');

+ 1 - 1
src/main/webapp/plugins/text.js

@@ -11,7 +11,7 @@ Draw.loadPlugin(function(ui)
 	{
 		var dlg = new EmbedDialog(ui, ui.editor.graph.getIndexableText(),
 			null, null, null, 'Extracted Text:');
-		ui.showDialog(dlg.container, 440, 240, true, true);
+		ui.showDialog(dlg.container, 450, 240, true, true);
 		dlg.init();
 	});
 	

+ 86 - 86
src/main/webapp/resources/dia_pt-br.txt

@@ -236,7 +236,7 @@ googleImages=Google Imagens
 imageSearch=Procurar imagem
 eip=EIP
 embed=Incorporar
-embedFonts=Embed Fonts
+embedFonts=Incorporar fontes
 embedImages=Incorporar imagens
 mainEmbedNotice=Colar esse conteúdo na página
 electrical=Elétrico
@@ -253,78 +253,78 @@ errorDeletingFile=Erro ao excluir o aquivo
 errorLoadingFile=Erro ao carregar o arquivo
 errorRenamingFile=Erro ao renomear o arquivo
 errorRenamingFileNotFound=Erro ao renomear o arquivo. Arquivo não encontrado.
-errorRenamingFileForbidden=Erro ao renomear o arquivo. Direitos de acesso insuficientes.
+errorRenamingFileForbidden=Erro ao renomear o arquivo. Permissões de acesso insuficientes.
 errorSavingDraft=Erro ao salvar o rascunho
 errorSavingFile=Erro ao salvar o arquivo
 errorSavingFileUnknown=Erro ao autorizar com servidores do Google. Por favor, atualize a página para tentar novamente.
-errorSavingFileForbidden=Erro ao salvar o arquivo. Direitos de acesso insuficientes.
+errorSavingFileForbidden=Erro ao salvar o arquivo. Permissões de acesso insuficientes.
 errorSavingFileNameConflict=Não foi possível salvar o diagrama. A página atual já contém arquivo com o nome '{1}'.
 errorSavingFileNotFound=Erro ao salvar o arquivo. Arquivo não encontrado.
-errorSavingFileReadOnlyMode=Could not save diagram while read-only mode is active.
-errorSavingFileSessionTimeout=Sua sessão foi finalizada. Por favor <a target='_blank' href='{1}'>{2}</a> e retorne a esta guia para tentar salvar novamente.
-errorSendingFeedback=Erro ao enviar feedback.
-errorUpdatingPreview=Erro na atualização da visualização
+errorSavingFileReadOnlyMode=Não é possível salvar o diagrama enquanto o modo apenas para leitura estiver ativado.
+errorSavingFileSessionTimeout=Sua sessão foi finalizada. Por favor, faça <a target='_blank' href='{1}'>{2}</a> e retorne a esta aba para tentar salvar novamente.
+errorSendingFeedback=Erro ao enviar comentários.
+errorUpdatingPreview=Erro ao atualizar a visualização.
 exit=Sair
-exitGroup=Sair do Grupo
+exitGroup=Sair do grupo
 expand=Expandir
 export=Exportar
 exporting=Exportando
 exportAs=Exportar como
-exportOptionsDisabled=Exportar opções desabilitadas
-exportOptionsDisabledDetails=O proprietário desabilitou as opções de download, impressão ou cópia para comentadores e visualizadores neste arquivo.
-externalChanges=External Changes
+exportOptionsDisabled=As opções para exportar estão desabilitadas
+exportOptionsDisabledDetails=O proprietário desabilitou a possibilidade de comentadores e visualizadores baixarem, imprimirem ou copiarem este arquivo.
+externalChanges=Alterações externas
 extras=Extras
 facebook=Facebook
-failedToSaveTryReconnect=Falha ao salvar, tentando reconetar
-featureRequest=Solicitar recurso
-feedback=Feedback
-feedbackSent=Feedback enviado com sucesso.
+failedToSaveTryReconnect=Falha ao salvar, tentando reconectar
+featureRequest=Solicitar funcionalidade
+feedback=Comentários
+feedbackSent=Comentário enviado com sucesso.
 floorplans=Planta baixa
-file=Arquivo 
-fileChangedOverwriteDialog=Arquivo foi alterado. Substituir as alterações?
-fileChangedSyncDialog=The file has been modified. Do you want to synchronize those changes?
-fileChangedSync=The file has been modified. Click here to synchronize.
+file=Arquivo
+fileChangedOverwriteDialog=Esse arquivo foi editado. Deseja salvar o arquivo e substituir trechos com as alterações externas?
+fileChangedSyncDialog=Esse arquivo foi editado. Deseja sincronizar com a edição mais recente?
+fileChangedSync=Esse arquivo foi editado. Clique aqui para sincronizar.
 overwrite=Substituir
-synchronize=Synchronize
+synchronize=Sincronizar
 filename=Nome do arquivo
 fileExists=Arquivo já existente
-fileMovedToTrash=File was moved to trash
-fileNearlyFullSeeFaq=Arquivo quase cheio, por favor veja FAQ
+fileMovedToTrash=O arquivo foi movido para a lixeira
+fileNearlyFullSeeFaq=Arquivo quase cheio. Por favor, leia as Perguntas Frequentes
 fileNotFound=Arquivo não encontrado
 repositoryNotFound=Repositório não encontrado
-fileNotFoundOrDenied=O arquivo não foi encontrado. Ele não existe ou você não tem acesso.
+fileNotFoundOrDenied=O arquivo não foi encontrado. Ele não existe ou você não tem permissão de acesso.
 fileNotLoaded=Arquivo não carregado
 fileNotSaved=Arquivo não salvo
 fileOpenLocation=Como você gostaria de abrir o(s) arquivo(s)?
-filetypeHtml=.html causes file to save as HTML with redirect to cloud URL
-filetypePng=.png causes file to save as PNG with embedded data
-filetypeSvg=.svg causes file to save as SVG with embedded data
+filetypeHtml=.html faz com que o arquivo seja salvo como HTML com redirecionamento para o endereço URL na internet
+filetypePng=.png faz com que o arquivo seja salvo como PNG com metadados incorporados
+filetypeSvg=.svg faz com que o arquivo seja salvo como SVG com metadados incorporados
 fileWillBeSavedInAppFolder={1} será salvo na pasta do aplicativo.
 fill=Preencher
-fillColor=Cor de preenchimento 
-filterCards=Filter Cards
+fillColor=Cor de preenchimento
+filterCards=Filtrar os cartões
 find=Encontrar
-fit=Ajustar
-fitContainer=Redimensionar compartimento
-fitIntoContainer=Ajustar no compartimento
+fit=Caber
+fitContainer=Redimensionar a tela
+fitIntoContainer=Caber na tela
 fitPage=Ajustar página
 fitPageWidth=Ajustar largura da página
 fitTo=Ajustar para
-fitToSheetsAcross=Toda a(s) folha(s)
-fitToBy=Por
-fitToSheetsDown=Página(s)  para baixo
+fitToSheetsAcross=quebra de página(s)
+fitToBy=por
+fitToSheetsDown=folha(s)
 fitTwoPages=Duas páginas
-fitWindow=Ajustar Janela 
+fitWindow=Ajustar janela
 flip=Virar
-flipH=Virar horizontal
-flipV=Virar vertical
+flipH=Virar horizontalmente
+flipV=Virar verticalmente
 flowchart=Fluxograma
 folder=Pasta
 font=Fonte
-fontColor=Cor da fonte 
-fontFamily=Família fonte
+fontColor=Cor da fonte
+fontFamily=Nome da fonte
 fontSize=Tamanho da fonte
-forbidden=Você não tem autorização para acessar este arquivo.
+forbidden=Você não tem permissão para acessar este arquivo.
 format=Formatar
 formatPanel=Formatar painel
 formatted=Formatado
@@ -341,26 +341,26 @@ formatVsdx=VSDX
 formatVssx=VSSX
 formatXmlPlain=XML (normal)
 formatXml=XML
-forum=Fóruns de Discussão/Ajuda
-freehand=Freehand
+forum=Fórum de discussão/Ajuda
+freehand=Desenho à mão livre
 fromTemplate=Do modelo
-fromTemplateUrl=Do modelo de URL
+fromTemplateUrl=Do endereço URL do modelo
 fromText=Do texto
-fromUrl=Da URL
+fromUrl=Do endereço URL
 fromThisPage=Desta página
 fullscreen=Tela cheia
-gap=Gap
+gap=Espaçamento
 gcp=GCP
 general=Geral
 github=GitHub
 gitlab=GitLab
 gliffy=Gliffy
-global=Global 
+global=Global
 googleDocs=Google Docs
 googleDrive=Google Drive
-googleGadget=Google Gadget
+googleGadget=Google Gadgets
 googlePlus=Google+
-googleSharingNotAvailable=Sharing is only available via Google Drive. Please click Open below and share from the more actions menu:
+googleSharingNotAvailable=O compartilhamento está disponível apenas por meio do Google Drive. Clique abaixo em Abrir. Em seguida, compartilhe a partir do menu de opções:
 googleSlides=Google Apresentações
 googleSites=Google Sites
 googleSheets=Google Planilhas
@@ -376,30 +376,30 @@ heading=Cabeçalho
 height=Altura
 help=Ajuda
 helpTranslate=Nos ajude a traduzir este aplicativo
-hide=Ocultar 
+hide=Ocultar
 hideIt=Ocultar {1}
 hidden=Oculto
-home=Página Inicial
-horizontal=Horizontal 
+home=Página inicial
+horizontal=Horizontal
 horizontalFlow=Fluxo horizontal
 horizontalTree=Árvore horizontal
-howTranslate=Como você acha que está a tradução no seu idioma?
+howTranslate=Como está a qualidade da tradução no seu idioma?
 html=HTML
 htmlText=Texto HTML
 id=ID
 iframe=IFrame
 ignore=Ignorar
 image=Imagem
-imageUrl=Imagem URL
+imageUrl=URL da imagem
 images=Imagens
-imagePreviewError=Esta imagem não pôde ser carregada para visualização. Por favor verifique a URL
-imageTooBig=Imagem é muito grande
+imagePreviewError=Esta imagem não pôde ser carregada para visualização. Por favor, verifique o endereço URL.
+imageTooBig=A imagem é muito grande
 imgur=Imgur
 import=Importar
 importFrom=Importar de
 includeCopyOfMyDiagram=Incluir uma cópia do meu diagrama
-increaseIndent=Aumentar ajuste
-decreaseIndent=Diminuir ajuste
+increaseIndent=Aumentar recuo
+decreaseIndent=Diminuir recuo
 insert=Inserir
 insertColumnBefore=Inserir coluna à esquerda
 insertColumnAfter=Inserir coluna à direita
@@ -409,35 +409,35 @@ insertHorizontalRule=Inserir linha horizontal
 insertLink=Inserir link
 insertPage=Inserir página
 insertRectangle=Inserir retângulo
-insertRhombus=Insert Rhombus
+insertRhombus=Inserir losango
 insertRowBefore=Inserir linha acima
 insertRowAfter=Inserir linha abaixo
 insertText=Inserir texto
 inserting=Inserindo
 installApp=Instalar o aplicativo
 invalidFilename=Nomes de diagramas não podem conter os seguintes caracteres: \ / | : ; { } < > & + ? = "
-invalidLicenseSeeThisPage=Sua licença é inválida, por favor veja <a target="_blank" href="https://support.draw.io/display/DFCS/Licensing+your+draw.io+plugin">page</a>.
-invalidInput=Invalid input
+invalidLicenseSeeThisPage=Sua licença é inválida. Por favor, leia essa <a target="_blank" href="https://support.draw.io/display/DFCS/Licensing+your+draw.io+plugin">página</a>.
+invalidInput=Conteúdo inválido
 invalidName=Nome inválido
 invalidOrMissingFile=Arquivo inválido ou em falta
-invalidPublicUrl=URL pública inválida
+invalidPublicUrl=Endereço URL público inválido
 isometric=Isométrico
 ios=iOS
-italic=Itálico 
+italic=Itálico
 kennedy=Kennedy
 keyboardShortcuts=Atalhos de teclado
 layers=Camadas
-landscape=Paisagem 
-language=Linguagem
+landscape=Paisagem
+language=Idioma
 leanMapping=Mapeamento
 lastChange=Última mudança {1} atrás
 lessThanAMinute=menos de um minuto
 licensingError=Erro de licenciamento
 licenseHasExpired=A licença para {1} expirou em {2}. Clique aqui.
-licenseRequired=This feature requires draw.io to be licensed.
+licenseRequired=Essa funcionalidade requer uma licença do draw.io.
 licenseWillExpire=A licença para {1} irá expirar em {2}. Clique aqui.
-lineJumps=Line jumps
-linkAccountRequired=Se o diagrama não é público é necessário ter uma conta no Google para visualizar o link.
+lineJumps=Saltos de linha
+linkAccountRequired=Se o diagrama não for público, é necessário ter uma conta no Google para visualizar o link.
 linkText=Texto do link
 list=Lista
 minute=minuto
@@ -446,20 +446,20 @@ hours=horas
 days=dias
 months=meses
 years=anos
-restartForChangeRequired=Mudanças serão visualizadas após atualização da página.
-laneColor=Cartela de cores
+restartForChangeRequired=Mudanças serão visualizadas após a atualização da página.
+laneColor=Cor das células
 lastModified=Última alteração
 layout=Layout
-left=Esquerda 
-leftAlign=Alinhar à esquerda 
+left=Esquerda
+leftAlign=Alinhar à esquerda
 leftToRight=Esquerda para direita
-libraryTooltip=Arraste e solte os formatos aqui ou clique + para inserir. Duplo-clique para editar.
-lightbox=Lightbox
-line=Linha 
-lineend=Fim da Linha
-lineheight=Altura da Linha
-linestart=Início da Linha
-linewidth=Largura da Linha
+libraryTooltip=Arraste e solte os formatos aqui ou clique em + para inserir. Duplo clique nos formatos para editá-los.
+lightbox=Lightbox ao clicar
+line=Linha
+lineend=Fim da linha
+lineheight=Altura da linha
+linestart=Início da linha
+linewidth=Largura da linha
 link=Link
 links=Links
 loading=Carregando
@@ -469,11 +469,11 @@ logIn=Conectar
 loveIt=Eu amo {1}
 lucidchart=Lucidchart
 maps=Mapas
-mathematicalTypesetting=Sistema tipográfico matemático
+mathematicalTypesetting=Conjunto de fórmulas matemáticas
 makeCopy=Fazer uma cópia
 manual=Manual
-merge=Merge
-mermaid=Mermaid
+merge=Mesclar
+mermaid=Mermaid (fluxograma)
 microsoftOffice=Microsoft Office
 microsoftExcel=Microsoft Excel
 microsoftPowerPoint=Microsoft PowerPoint
@@ -493,8 +493,8 @@ moving=Movendo
 moveSelectionTo=Mover seleção para {1}
 name=Nome
 navigation=Navegação
-network=Network
-networking=Rede
+network=Rede
+networking=Ligação em rede
 new=Novo
 newLibrary=Nova biblioteca
 nextPage=Próxima página
@@ -640,7 +640,7 @@ retryingLogin=Tempo de login esgotado. Tentando novamente...
 reverse=Retroceder
 revision=Revisão
 revisionHistory=Histórico de revisões
-rhombus=Rhombus
+rhombus=Losango
 right=Direita 
 rightAlign=Alinhar à direita 
 rightToLeft=Direita para esquerda
@@ -695,7 +695,7 @@ signOut=Sair
 simple=Simples
 simpleArrow=Seta simples
 simpleViewer=Simple Viewer
-size=Tamanho 
+size=Tamanho
 sketch=Sketch
 solid=Sólido
 sourceSpacing=Espaçamento entre fontes
@@ -731,7 +731,7 @@ textOpacity=Opacidade do Texto
 theme=Tema
 timeout=Tempo esgotado
 title=Título
-to=Para
+to=até
 toBack=Para trás 
 toFront=Para a frente 
 tooLargeUseDownload=Too large, use download instead.

+ 6 - 6
src/main/webapp/resources/dia_sv.txt

@@ -653,11 +653,11 @@ saveAndExit=Spara & Avsluta
 saveAs=Spara som
 saveAsXmlFile=Spara som XML-fil?
 saved=Sparad
-saveDiagramFirst=Please save the diagram first
+saveDiagramFirst=Vänligen spara diagrammet först
 saveDiagramsTo=Spara diagram till
 saveLibrary403=Otillräckliga korregeringsrättigheter för detta bibliotek
 saveLibrary500=Ett fel uppstod under sparande av biblioteket 
-saveLibraryReadOnly=Could not save library while read-only mode is active
+saveLibraryReadOnly=Kunde inte spara bibliotek i skrivskyddat läge
 saving=Sparande
 scratchpad=Anteckningsblock
 scrollbars=Rullningslister
@@ -671,9 +671,9 @@ selectFile=Välj fil
 selectFolder=Välj mapp
 selectFont=Välj teckensnitt
 selectNone=Välj ingen
-selectTemplate=Select Template
+selectTemplate=Välj mall
 selectVertices=Markera hörn
-sendBackward=Send Backward
+sendBackward=Flytta bakåt
 sendMessage=Skicka
 sendYourFeedback=Skicka din feedback
 serviceUnavailableOrBlocked=Tjänsten är otillgänglig eller blockerad
@@ -685,7 +685,7 @@ shape=Form
 shapes=Former
 share=Dela
 shareLink=Länk för delad redigering
-sharingAvailable=Sharing available for Google Drive and OneDrive files.
+sharingAvailable=Delning via Google Drive och OneDrive är möjlig
 sharp=Skarp
 show=Visa
 showStartScreen=Visa hemskärmen
@@ -772,7 +772,7 @@ userManual=Användarmanual
 vertical=Vertikal
 verticalFlow=Vertikalt flöde
 verticalTree=Vertikalt träd
-view=Vy
+view=Visa
 viewerSettings=Inställningar för tittare
 viewUrl=Länk för att se: {1}
 voiceAssistant=Röstassistent (beta)

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
src/main/webapp/service-worker.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
src/main/webapp/service-worker.js.map


+ 179 - 2
src/main/webapp/shapes/mxC4.js

@@ -22,7 +22,7 @@ function mxShapeC4Person(bounds, fill, stroke, strokewidth)
 */
 mxUtils.extend(mxShapeC4Person, mxShape);
 
-mxShapeC4Person.prototype.cst = {START : 'mxgraph.c4.person'};
+mxShapeC4Person.prototype.cst = {PERSONSHAPE : 'mxgraph.c4.person'};
 
 /**
 * Function: paintVertexShape
@@ -64,4 +64,181 @@ mxShapeC4Person.prototype.getLabelMargins = function(rect)
 	return new mxRectangle(0, headSize * 0.8, 0, 0);
 };
 
-mxCellRenderer.registerShape(mxShapeC4Person.prototype.cst.START, mxShapeC4Person);
+mxCellRenderer.registerShape(mxShapeC4Person.prototype.cst.PERSONSHAPE, mxShapeC4Person);
+
+//**********************************************************************************************************************************************************
+// Person
+//**********************************************************************************************************************************************************
+/**
+* Extends mxShape.
+*/
+function mxShapeC4Person2(bounds, fill, stroke, strokewidth)
+{
+	mxShape.call(this);
+	this.bounds = bounds;
+	this.fill = fill;
+	this.stroke = stroke;
+	this.strokewidth = (strokewidth != null) ? strokewidth : 1;
+};
+
+/**
+* Extends mxShape.
+*/
+mxUtils.extend(mxShapeC4Person2, mxShape);
+
+mxShapeC4Person2.prototype.cst = {PERSONSHAPE : 'mxgraph.c4.person2'};
+
+/**
+* Function: paintVertexShape
+* 
+* Paints the vertex shape.
+*/
+mxShapeC4Person2.prototype.paintVertexShape = function(c, x, y, w, h)
+{
+	c.translate(x, y);
+	var headSize = Math.min(w * 0.45, h * 0.45);
+	var r = headSize / 2;
+	
+	c.ellipse(w * 0.5 - headSize * 0.5, 0, headSize, headSize);
+	c.fillAndStroke();
+	
+	c.begin();
+	c.moveTo(0, headSize * 0.8 + r);
+	c.arcTo(r, r, 0, 0, 1, r, headSize * 0.8);
+	c.lineTo(w - r, headSize * 0.8);
+	c.arcTo(r, r, 0, 0, 1, w, headSize * 0.8 + r);
+	c.lineTo(w, h - r);
+	c.arcTo(r, r, 0, 0, 1, w - r, h);
+	c.lineTo(r, h);
+	c.arcTo(r, r, 0, 0, 1, 0, h -r);
+	c.close();
+	c.fillAndStroke();
+
+	c.setShadow(false);
+	
+	c.ellipse(w * 0.5 - headSize * 0.5, 0, headSize, headSize);
+	c.fillAndStroke();
+
+};
+
+mxShapeC4Person2.prototype.getLabelMargins = function(rect)
+{
+	var headSize = Math.min(rect.width * 0.45, rect.height * 0.45);
+		
+	return new mxRectangle(0, headSize * 0.8, 0, 0);
+};
+
+mxCellRenderer.registerShape(mxShapeC4Person2.prototype.cst.PERSONSHAPE	, mxShapeC4Person2);
+
+//**********************************************************************************************************************************************************
+// Web Browser Container
+//**********************************************************************************************************************************************************
+/**
+* Extends mxShape.
+*/
+function mxShapeC4WebBrowserContainer(bounds, fill, stroke, strokewidth)
+{
+	mxShape.call(this);
+	this.bounds = bounds;
+	this.fill = fill;
+	this.stroke = stroke;
+	this.strokewidth = (strokewidth != null) ? strokewidth : 1;
+};
+
+/**
+* Extends mxShape.
+*/
+mxUtils.extend(mxShapeC4WebBrowserContainer, mxShape);
+
+mxShapeC4WebBrowserContainer.prototype.cst = {WEB_BROWSER_CONTAINER_SHAPE : 'mxgraph.c4.webBrowserContainer'};
+
+/**
+* Function: paintVertexShape
+* 
+* Paints the vertex shape.
+*/
+mxShapeC4WebBrowserContainer.prototype.paintVertexShape = function(c, x, y, w, h)
+{
+	c.translate(x, y);
+	var r = 8;
+	
+	c.begin();
+	c.moveTo(0, r);
+	c.arcTo(r, r, 0, 0, 1, r, 0);
+	c.lineTo(w - r, 0);
+	c.arcTo(r, r, 0, 0, 1, w, r);
+	c.lineTo(w, h - r);
+	c.arcTo(r, r, 0, 0, 1, w - r, h);
+	c.lineTo(r, h);
+	c.arcTo(r, r, 0, 0, 1, 0, h - r);
+	c.close();
+	c.fillAndStroke();
+
+	c.setShadow(false);
+	
+	var ins = 5;
+	var r2 = 3;
+	var h2 = 12;
+	
+	if (w > (ins * 5 + h2 * 3) && h > (2 * h2 + 3 * ins))
+	{
+		c.setFillColor('#23A2D9');
+		
+		c.begin();
+		c.moveTo(ins, ins + r2);
+		c.arcTo(r2, r2, 0, 0, 1, ins + r2, ins);
+		c.lineTo(w - 3 * h2 - 4 * ins - r2, ins);
+		c.arcTo(r2, r2, 0, 0, 1, w - 3 * h2 - 4 * ins, ins + r2);
+		c.lineTo(w - 3 * h2 - 4 * ins, ins + h2 - r2);
+		c.arcTo(r2, r2, 0, 0, 1, w - 3 * h2 - 4 * ins - r2, ins + h2);
+		c.lineTo(ins + r2, ins + h2);
+		c.arcTo(r2, r2, 0, 0, 1, ins, ins + h2 - r2);
+		c.close();
+	
+		c.moveTo(w - 3 * h2 - 3 * ins, ins + r2);
+		c.arcTo(r2, r2, 0, 0, 1, w - 3 * h2 - 3 * ins + r2, ins);
+		c.lineTo(w - 2 * h2 - 3 * ins - r2, ins);
+		c.arcTo(r2, r2, 0, 0, 1, w - 2 * h2 - 3 * ins, ins + r2);
+		c.lineTo(w - 2 * h2 - 3 * ins, ins + h2 - r2);
+		c.arcTo(r2, r2, 0, 0, 1, w - 2 * h2 - 3 * ins - r2, ins + h2);
+		c.lineTo(w - 3 * h2 - 3 * ins + r2, ins + h2);
+		c.arcTo(r2, r2, 0, 0, 1, w - 3 * h2 - 3 * ins, ins + h2 - r2);
+		c.close();
+	
+		c.moveTo(w - 2 * h2 - 2 * ins, ins + r2);
+		c.arcTo(r2, r2, 0, 0, 1, w - 2 * h2 - 2 * ins + r2, ins);
+		c.lineTo(w - h2 - 2 * ins - r2, ins);
+		c.arcTo(r2, r2, 0, 0, 1, w - h2 - 2 * ins, ins + r2);
+		c.lineTo(w - h2 - 2 * ins, ins + h2 - r2);
+		c.arcTo(r2, r2, 0, 0, 1, w - h2 - 2 * ins - r2, ins + h2);
+		c.lineTo(w - 2 * h2 - 2 * ins + r2, ins + h2);
+		c.arcTo(r2, r2, 0, 0, 1, w - 2 * h2 - 2 * ins, ins + h2 - r2);
+		c.close();
+	
+		c.moveTo(w - h2 - ins, ins + r2);
+		c.arcTo(r2, r2, 0, 0, 1, w - h2 - ins + r2, ins);
+		c.lineTo(w - ins - r2, ins);
+		c.arcTo(r2, r2, 0, 0, 1, w - ins, ins + r2);
+		c.lineTo(w - ins, ins + h2 - r2);
+		c.arcTo(r2, r2, 0, 0, 1, w - ins - r2, ins + h2);
+		c.lineTo(w - h2 - ins + r2, ins + h2);
+		c.arcTo(r2, r2, 0, 0, 1, w - h2 - ins, ins + h2 - r2);
+		c.close();
+
+		c.moveTo(ins, h2 + 2 * ins + r);
+		c.arcTo(r, r, 0, 0, 1, ins + r, h2 + 2 * ins);
+		c.lineTo(w - r - ins, h2 + 2 * ins);
+		c.arcTo(r, r, 0, 0, 1, w - ins, h2 + 2 * ins + r);
+		c.lineTo(w - ins, h - r - ins);
+		c.arcTo(r, r, 0, 0, 1, w - r - ins, h - ins);
+		c.lineTo(ins + r, h - ins);
+		c.arcTo(r, r, 0, 0, 1, ins, h - r - ins);
+		c.close();
+		c.fill();
+		
+		c.fill();
+	}
+};
+
+mxCellRenderer.registerShape(mxShapeC4WebBrowserContainer.prototype.cst.WEB_BROWSER_CONTAINER_SHAPE, mxShapeC4WebBrowserContainer);
+