瀏覽代碼

12.1.0 release

Gaudenz Alder 5 年之前
父節點
當前提交
86d47fe538
共有 31 個文件被更改,包括 1971 次插入1687 次删除
  1. 28 0
      ChangeLog
  2. 1 1
      VERSION
  3. 62 51
      etc/mxgraph/mxClient.js
  4. 87 18
      src/main/java/com/mxgraph/online/ExportProxyServlet.java
  5. 4 0
      src/main/webapp/WEB-INF/web.xml
  6. 1 1
      src/main/webapp/cache.manifest
  7. 1 1
      src/main/webapp/index.html
  8. 564 551
      src/main/webapp/js/app.min.js
  9. 1 3
      src/main/webapp/js/deflate/pako.min.js
  10. 22 18
      src/main/webapp/js/diagramly/App.js
  11. 1 3
      src/main/webapp/js/diagramly/Dialogs.js
  12. 32 0
      src/main/webapp/js/diagramly/DrawioFile.js
  13. 12 12
      src/main/webapp/js/diagramly/DrawioFileSync.js
  14. 41 1
      src/main/webapp/js/diagramly/DriveClient.js
  15. 22 0
      src/main/webapp/js/diagramly/DriveFile.js
  16. 40 2
      src/main/webapp/js/diagramly/Editor.js
  17. 10 3
      src/main/webapp/js/diagramly/EditorUi.js
  18. 5 1
      src/main/webapp/js/diagramly/Menus.js
  19. 4 1
      src/main/webapp/js/diagramly/Pages.js
  20. 1 1
      src/main/webapp/js/diagramly/graphml/mxGraphMlCodec.js
  21. 4 4
      src/main/webapp/js/diagramly/mxFreehand.js
  22. 70 54
      src/main/webapp/js/diagramly/mxRuler.js
  23. 1 1
      src/main/webapp/js/diagramly/sidebar/Sidebar-Flowchart.js
  24. 1 1
      src/main/webapp/js/diagramly/vsdx/importer.js
  25. 1 1
      src/main/webapp/js/extensions.min.js
  26. 0 2
      src/main/webapp/js/mxgraph/Dialogs.js
  27. 1 1
      src/main/webapp/js/mxgraph/EditorUi.js
  28. 8 19
      src/main/webapp/js/mxgraph/Graph.js
  29. 486 476
      src/main/webapp/js/viewer.min.js
  30. 175 175
      src/main/webapp/resources/dia_nl.txt
  31. 285 285
      src/main/webapp/resources/dia_uk.txt

+ 28 - 0
ChangeLog

@@ -1,3 +1,31 @@
+09-OCT-2019: 12.1.0
+
+- Escape no longer starts editing in Safari and IE 11
+- Uses revision IDs for realtime in Google Drive
+- Fixes ignored alignment for autosize cells
+- Switches to manual sync on cache timeout
+- Disables resize live preview for groups
+- Fixes test URL parameter for logging
+- Adds live preview for moving cells
+- Uses mxGraph 4.0.3 beta 5
+- Uses quirks mode in IE 9
+
+08-OCT-2019: 12.0.3
+
+- Fixes vertical label position of Data shape
+- Handles changed etag in Google Drive after save
+- Fixes page reorder for Chrome on Windows 10 in embed mode
+
+02-OCT-2019: 12.0.2
+
+- Updates pako to 1.0.10
+- Fixes VSS naming problem
+- Restores folder support to Confluence Cloud diagram viewer
+
+01-OCT-2019: 12.0.1
+
+- Adds testing for new pako version
+
 27-SEP-2019: 12.0.0
 
 - Fixes Google auth for multiple users

+ 1 - 1
VERSION

@@ -1 +1 @@
-12.0.0
+12.1.0

文件差異過大導致無法顯示
+ 62 - 51
etc/mxgraph/mxClient.js


+ 87 - 18
src/main/java/com/mxgraph/online/ExportProxyServlet.java

@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
@@ -21,25 +22,60 @@ public class ExportProxyServlet extends HttpServlet
 {
 	private final String EXPORT_URL = "http://localhost:8000/";
 	
-	/**
-	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
-	 */
-	protected void doPost(HttpServletRequest request,
+	private final String[] supportedServices = {"EXPORT_URL", "PLANTUML_URL", "VSD_CONVERT_URL", "EMF_CONVERT_URL"};
+	
+	private void doRequest(String method, HttpServletRequest request,
 			HttpServletResponse response) throws ServletException, IOException
 	{
 		try
 		{
-			String exportUrl = System.getenv("EXPORT_URL");
+			int serviceId = 0;
+			String proxyPath = "";
+			String queryString = "";
+			
+			try 
+			{
+				if (request.getQueryString() != null)
+				{
+					queryString = "?" + request.getQueryString(); 	
+				}
+				
+				if (request.getPathInfo() != null) // /{serviceId}/*
+				{
+					String[] pathParts = request.getPathInfo().split("/");
+	
+					if (pathParts.length > 1)
+					{
+						serviceId = Integer.parseInt(pathParts[1]);
+					}
+					
+					if (pathParts.length > 2)
+					{
+						proxyPath = String.join("/", Arrays.copyOfRange(pathParts, 2, pathParts.length));
+					}
+					
+					if (serviceId < 0 || serviceId > supportedServices.length)
+					{
+						serviceId = 0;
+					}
+				}
+			}
+			catch (Exception e) 
+			{
+				// Ignore and use 0
+			}
+			
+			String exportUrl = System.getenv(supportedServices[serviceId]);
 			
 			if (exportUrl == null)
 			{
 				exportUrl = EXPORT_URL;
 			}
 			
-			URL url = new URL(exportUrl);
+			URL url = new URL(exportUrl + proxyPath + queryString);
 			HttpURLConnection con = (HttpURLConnection) url.openConnection();
 			
-			con.setRequestMethod("POST");
+			con.setRequestMethod(method);
 			
 			//Copy request headers to export server
 			Enumeration<String> headerNames = request.getHeaderNames();
@@ -56,16 +92,20 @@ public class ExportProxyServlet extends HttpServlet
 	            }
 	        }
 	        
-			// Send post request
-			con.setDoOutput(true);
-			
-			OutputStream params = con.getOutputStream();
-			Utils.copy(request.getInputStream(), params);
-			params.flush();
-			params.close();
-			
+	        if ("POST".equals(method))
+	        {
+				// Send post request
+				con.setDoOutput(true);
+				
+				OutputStream params = con.getOutputStream();
+				Utils.copy(request.getInputStream(), params);
+				params.flush();
+				params.close();
+	        }
+	        
+	        int responseCode = con.getResponseCode();
 			//Copy response code
-			response.setStatus(con.getResponseCode());
+			response.setStatus(responseCode);
 			
 			//Copy response headers
 			Map<String, List<String>> map = con.getHeaderFields();
@@ -86,7 +126,17 @@ public class ExportProxyServlet extends HttpServlet
 			
 			//Copy response
 			OutputStream out = response.getOutputStream();
-			Utils.copy(con.getInputStream(), out);
+			
+			//Error
+			if (responseCode >= 400)
+			{
+				Utils.copy(con.getErrorStream(), out);
+			}
+			else //Success
+			{
+				Utils.copy(con.getInputStream(), out);
+			}
+			
 			out.flush();
 			out.close();
 		}
@@ -97,4 +147,23 @@ public class ExportProxyServlet extends HttpServlet
 			e.printStackTrace();
 		}
 	}
-}
+
+	
+	/**
+	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doGet(HttpServletRequest request,
+			HttpServletResponse response) throws ServletException, IOException
+	{
+		doRequest("GET", request, response);
+	}
+	
+	/**
+	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
+	 */
+	protected void doPost(HttpServletRequest request,
+	HttpServletResponse response) throws ServletException, IOException
+	{
+		doRequest("POST", request, response);
+	}
+}

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

@@ -139,6 +139,10 @@
     <servlet-name>ExportProxyServlet</servlet-name>
     <url-pattern>/export</url-pattern>
   </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>ExportProxyServlet</servlet-name>
+    <url-pattern>/service/*</url-pattern>
+  </servlet-mapping>
   <mime-mapping>
     <extension>css</extension>
     <mime-type>text/css</mime-type>

+ 1 - 1
src/main/webapp/cache.manifest

@@ -1,7 +1,7 @@
 CACHE MANIFEST
 
 # THIS FILE WAS GENERATED. DO NOT MODIFY!
-# 09/27/2019 01:00 PM
+# 10/09/2019 11:28 AM
 
 app.html
 index.html?offline=1

+ 1 - 1
src/main/webapp/index.html

@@ -1,4 +1,4 @@
-<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=5,IE=9" ><![endif]-->
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=5" ><![endif]-->
 <!DOCTYPE html>
 <html>
 <head>

文件差異過大導致無法顯示
+ 564 - 551
src/main/webapp/js/app.min.js


文件差異過大導致無法顯示
+ 1 - 3
src/main/webapp/js/deflate/pako.min.js


+ 22 - 18
src/main/webapp/js/diagramly/App.js

@@ -545,7 +545,8 @@ App.main = function(callback, createUi)
 		}
 		
 		// Loads Pusher API
-		if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp && DrawioFile.SYNC == 'auto' &&
+		if (('ArrayBuffer' in window) && !mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp &&
+			DrawioFile.SYNC == 'auto' && urlParams['embed'] != '1' && urlParams['local'] != '1' &&
 			urlParams['stealth'] != '1' && urlParams['offline'] != '1')
 		{
 			// TODO: Check if async loading is fast enough
@@ -1347,7 +1348,7 @@ App.prototype.init = function()
 		}
 		
 		if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp && urlParams['embed'] != '1' &&
-			urlParams['stealth'] != '1' && urlParams['offline'] != '1' &&
+			urlParams['local'] != '1' && urlParams['stealth'] != '1' && urlParams['offline'] != '1' &&
 			(!this.editor.chromeless || this.editor.editable))
 		{
 			// Checks if the cache is alive
@@ -1356,20 +1357,31 @@ App.prototype.init = function()
 			var timeoutThread = window.setTimeout(mxUtils.bind(this, function()
 			{
 				acceptResponse = false;
+				
+				// Switches to manual sync if cache cannot be reached
+				DrawioFile.SYNC = 'manual';
+				
+				var file = this.getCurrentFile();
+				
+				if (file != null && file.sync != null)
+				{
+					file.sync.destroy();
+					file.sync = null;
+					
+					var status = mxUtils.htmlEntities(mxResources.get('timeout'));
+					this.editor.setStatus('<div title="'+ status +
+						'" class="geStatusAlert" style="overflow:hidden;">' + status +
+						'</div>');
+				}
+				
 				EditorUi.logEvent({category: 'TIMEOUT-CACHE-CHECK', action: 'timeout', label: 408});
-			}), this.timeout);
+			}), Editor.cacheTimeout);
 			
 			var t0 = new Date().getTime();
 			
 			mxUtils.get(EditorUi.cacheUrl + '?alive', mxUtils.bind(this, function(req)
 			{
 				window.clearTimeout(timeoutThread);
-				
-//				if (acceptResponse)
-//				{
-//					EditorUi.logEvent({category: 'ALIVE-CACHE-CHECK', action: 'alive', label:
-//						req.getStatus() + '.' + (new Date().getTime() - t0)});
-//				}
 			}));
 
 			this.editor.addListener('fileLoaded', mxUtils.bind(this, function()
@@ -2435,15 +2447,7 @@ App.prototype.load = function()
 				{
 					this.loadGapi(mxUtils.bind(this, function()
 					{
-						if (urlParams['convert-realtime'] == '1')
-						{
-							this.spinner.stop();
-							this.drive.convertRealtimeFiles();
-						}
-						else
-						{
-							this.start();
-						}
+						this.start();
 					}));
 				}
 			}

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

@@ -2139,9 +2139,7 @@ var ParseDialog = function(editorUi, title, defaultType)
 				// TODO: Remove unescape, use btoa for compatibility with graph.compress
 				function compress(s)
 				{
-					return encode64(Graph.bytesToString(
-						pako.deflateRaw(unescape(
-						encodeURIComponent(s)))));
+					return encode64(pako.deflateRaw(s, { to : 'string' }));
 				};
 
 				var xhr = new XMLHttpRequest();

+ 32 - 0
src/main/webapp/js/diagramly/DrawioFile.js

@@ -1180,6 +1180,22 @@ DrawioFile.prototype.getLastModifiedDate = function()
 	return new Date();
 };
 
+/**
+ * Sets the current revision ID.
+ */
+DrawioFile.prototype.setCurrentRevisionId = function(id)
+{
+	this.setDescriptorRevisionId(this.getDescriptor(), id);
+};
+
+/**
+ * Returns the current revision ID.
+ */
+DrawioFile.prototype.getCurrentRevisionId = function()
+{
+	return this.getDescriptorRevisionId(this.getDescriptor());
+};
+
 /**
  * Sets the current etag.
  */
@@ -1209,6 +1225,22 @@ DrawioFile.prototype.getDescriptor = function()
  */
 DrawioFile.prototype.setDescriptor = function() { };
 
+/**
+ * Updates the revision ID on the given descriptor.
+ */
+DrawioFile.prototype.setDescriptorRevisionId = function(desc, id)
+{
+	this.setDescriptorEtag(desc, id);
+};
+
+/**
+ * Returns the revision ID from the given descriptor.
+ */
+DrawioFile.prototype.getDescriptorRevisionId = function(desc)
+{
+	return this.getDescriptorEtag(desc);
+};
+
 /**
  * Updates the etag on the given descriptor.
  */

+ 12 - 12
src/main/webapp/js/diagramly/DrawioFileSync.js

@@ -653,7 +653,7 @@ DrawioFileSync.prototype.reloadDescriptor = function()
 		if (desc != null)
 		{
 			// Forces data to be updated
-			this.file.setDescriptorEtag(desc, this.file.getCurrentEtag());
+			this.file.setDescriptorRevisionId(desc, this.file.getCurrentRevisionId());
 			this.updateDescriptor(desc);
 			this.fileChangedNotify();
 		}
@@ -687,8 +687,8 @@ DrawioFileSync.prototype.catchup = function(desc, success, error, abort)
 	if (abort == null || !abort())
 	{
 		var secret = this.file.getDescriptorSecret(desc);
-		var etag = this.file.getDescriptorEtag(desc);
-		var current = this.file.getCurrentEtag();
+		var etag = this.file.getDescriptorRevisionId(desc);
+		var current = this.file.getCurrentRevisionId();
 		
 		if (current == etag)
 		{
@@ -716,7 +716,7 @@ DrawioFileSync.prototype.catchup = function(desc, success, error, abort)
 				if (abort == null || !abort())
 				{
 					// Ignores patch if shadow has changed
-					if (current != this.file.getCurrentEtag())
+					if (current != this.file.getCurrentRevisionId())
 					{
 						if (success != null)
 						{
@@ -751,7 +751,7 @@ DrawioFileSync.prototype.catchup = function(desc, success, error, abort)
 							if (acceptResponse && (abort == null || !abort()))
 							{
 								// Ignores patch if shadow has changed
-								if (current != this.file.getCurrentEtag())
+								if (current != this.file.getCurrentRevisionId())
 								{
 									if (success != null)
 									{
@@ -897,7 +897,7 @@ DrawioFileSync.prototype.merge = function(patches, checksum, desc, success, erro
 			this.ui.diffPages(this.file.shadowPages,
 			this.ui.pages) : null;
 		var ignored = this.file.ignorePatches(patches);
-		var etag = this.file.getDescriptorEtag(desc);
+		var etag = this.file.getDescriptorRevisionId(desc);
 
 		if (!ignored)
 		{
@@ -912,7 +912,7 @@ DrawioFileSync.prototype.merge = function(patches, checksum, desc, success, erro
 			if (urlParams['test'] == '1')
 			{
 				EditorUi.debug('Sync.merge', [this],
-					'from', this.file.getCurrentEtag(), 'to', etag,
+					'from', this.file.getCurrentRevisionId(), 'to', etag,
 					'backup', this.file.backupPatch,
 					'attempt', this.catchupRetryCount,
 					'patches', patches,
@@ -922,7 +922,7 @@ DrawioFileSync.prototype.merge = function(patches, checksum, desc, success, erro
 			// Compares the checksum
 			if (checksum != null && checksum != current)
 			{
-				var from = this.ui.hashValue(this.file.getCurrentEtag());
+				var from = this.ui.hashValue(this.file.getCurrentRevisionId());
 				var to = this.ui.hashValue(etag);
 				
 				this.file.checksumError(error, patches, 'From: ' + from + '\nTo: ' + to +
@@ -986,7 +986,7 @@ DrawioFileSync.prototype.merge = function(patches, checksum, desc, success, erro
 		{
 			if (this.file.errorReportsEnabled)
 			{
-				var from = this.ui.hashValue(this.file.getCurrentEtag());
+				var from = this.ui.hashValue(this.file.getCurrentRevisionId());
 				var to = this.ui.hashValue(etag);
 				
 				this.file.sendErrorReport('Error in merge',
@@ -1024,7 +1024,7 @@ DrawioFileSync.prototype.descriptorChanged = function(etag)
 	{
 		var msg = this.objectToString(this.createMessage({a: 'desc',
 			m: this.lastModified.getTime()}));
-		var current = this.file.getCurrentEtag();
+		var current = this.file.getCurrentRevisionId();
 		var data = this.objectToString({});
 
 		mxUtils.post(EditorUi.cacheUrl, this.getIdParameters() +
@@ -1091,8 +1091,8 @@ DrawioFileSync.prototype.fileSaved = function(pages, lastDesc, success, error)
 			var diff = this.ui.diffPages(shadow, pages);
 			
 			// Data is stored in cache and message is sent to all listeners
-			var etag = this.file.getDescriptorEtag(lastDesc);
-			var current = this.file.getCurrentEtag();
+			var etag = this.file.getDescriptorRevisionId(lastDesc);
+			var current = this.file.getCurrentRevisionId();
 			
 			var data = this.objectToString(this.createMessage({patch: diff, checksum: checksum}));
 			var msg = this.objectToString(this.createMessage({m: this.lastModified.getTime()}));

+ 41 - 1
src/main/webapp/js/diagramly/DriveClient.js

@@ -1463,7 +1463,7 @@ DriveClient.prototype.saveFile = function(file, revision, success, errFn, noChec
 								file.getCurrentEtag() : null;
 							var retryCount = 0;
 							
-							var executeSave = mxUtils.bind(this, function(realOverwrite)
+							var doExecuteSave = mxUtils.bind(this, function(realOverwrite)
 							{
 								file.saveLevel = 5;
 								
@@ -1572,6 +1572,46 @@ DriveClient.prototype.saveFile = function(file, revision, success, errFn, noChec
 									criticalError(e);
 								}
 							});
+
+							// Workaround for Google returning the wrong etag after file save is to
+							// update the etag before save and check if the headRevisionId changed
+							var executeSave = mxUtils.bind(this, function(realOverwrite)
+							{
+								if (realOverwrite)
+								{
+									doExecuteSave(realOverwrite);
+								}
+								else
+								{
+									this.executeRequest({
+										url: '/files/' + file.getId() + '?supportsTeamDrives=true&fields=' + this.catchupFields
+									}, 
+									mxUtils.bind(this, function(desc2)
+									{
+										try
+										{
+											// Checks head revision ID and updates etag or returns conflict
+											if (desc2 != null && desc2.headRevisionId == head0)
+											{
+												etag = desc2.etag;
+												doExecuteSave(realOverwrite);
+											}
+											else
+											{
+												error({error: {code: 412}}, desc2);
+											}
+										}
+										catch (e)
+										{
+											criticalError(e);
+										}
+									}), mxUtils.bind(this, function(err)
+									{
+										// Simulated 
+										error(err);
+									}));
+								}
+							});
 							
 							// Uses saved PNG data for thumbnail
 							if (saveAsPng && thumb == null)

+ 22 - 0
src/main/webapp/js/diagramly/DriveFile.js

@@ -12,6 +12,12 @@ DriveFile = function(ui, data, desc)
 //Extends mxEventSource
 mxUtils.extend(DriveFile, DrawioFile);
 
+/**
+ * Workaround for changing etag after save is higher autosave delay to allow
+ * for preflight etag update and decrease possible conflicts on file save.
+ */
+DriveFile.prototype.autosaveDelay = 2500;
+
 /**
  * Delay for last save in ms.
  */
@@ -634,6 +640,22 @@ DriveFile.prototype.getDescriptorSecret = function(desc)
 	return this.ui.drive.getCustomProperty(desc, 'secret');
 };
 
+/**
+ * Updates the revision ID on the given descriptor.
+ */
+DriveFile.prototype.setDescriptorRevisionId = function(desc, id)
+{
+	desc.headRevisionId = id;
+};
+
+/**
+ * Returns the revision ID from the given descriptor.
+ */
+DriveFile.prototype.getDescriptorRevisionId = function(desc)
+{
+	return desc.headRevisionId;
+};
+
 /**
  * Adds all listeners.
  */

+ 40 - 2
src/main/webapp/js/diagramly/Editor.js

@@ -553,8 +553,8 @@
 					if (value.substring(0, idx) == 'mxGraphModel')
 					{
 						// Workaround for Java URL Encoder using + for spaces, which isn't compatible with JS
-						var xmlData = Graph.bytesToString(pako.inflateRaw(
-							value.substring(idx + 2))).replace(/\+/g,' ');
+						var xmlData = pako.inflateRaw(
+							value.substring(idx + 2), { to : 'string' }).replace(/\+/g,' ');
 						
 						if (xmlData != null && xmlData.length > 0)
 						{
@@ -4530,6 +4530,44 @@
 		}
 	};
 
+	/**
+	 * Returns a base64 encoded version of the compressed string.
+	 */
+	Graph.compress = function(data, deflate)
+	{
+		if (data == null || data.length == 0 || typeof(pako) === 'undefined')
+		{
+			return data;
+		}
+		else
+		{
+	   		var tmp = (deflate) ? pako.deflate(encodeURIComponent(data), { to : 'string' }) :
+	   			pako.deflateRaw(encodeURIComponent(data),  { to : 'string' });
+	   		
+	   		return (window.btoa) ? btoa(tmp) : Base64.encode(tmp, true);
+		}
+	};
+
+	/**
+	 * Returns a decompressed version of the base64 encoded string.
+	 */
+	Graph.decompress = function(data, inflate)
+	{
+	   	if (data == null || data.length == 0 || typeof(pako) === 'undefined')
+		{
+			return data;
+		}
+		else
+		{
+			var tmp = (window.atob) ? atob(data) : Base64.decode(data, true);
+			
+   			var inflated = (inflate) ? pako.inflate(tmp,  { to : 'string' }) :
+				pako.inflateRaw(tmp,  { to : 'string' })
+
+			return Graph.zapGremlins(decodeURIComponent(inflated));
+		}
+	};
+
 	/**
 	 * Specifies special libraries that are loaded via dynamic JS. Add cases
 	 * where the filename cannot be worked out from the package name. The

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

@@ -57,6 +57,11 @@
 	 */
 	EditorUi.cacheUrl = (urlParams['dev'] == '1') ? '/cache' : 'https://rt.draw.io/cache';
 
+	/**
+	 * Cache timeout is 10 seconds.
+	 */
+	Editor.cacheTimeout = 10000;
+	
 	/**
 	 * Switch to enable PlantUML in the insert from text dialog.
 	 * NOTE: This must also be enabled on the server-side.
@@ -182,7 +187,7 @@
 	{
 		try
 		{
-			if (window.console != null && urlParams['dev'] == '1')
+			if (window.console != null && urlParams['test'] == '1')
 			{
 				var args = [new Date().toISOString()];
 				
@@ -8984,9 +8989,11 @@
 				mxSettings.save();		
 			});
 
-			var showRuler = urlParams['ruler'] == '1' || (mxSettings.isRulerOn() && urlParams['lightbox'] != '1');
+			var showRuler = this.canvasSupported && document.documentMode != 9 &&
+				(urlParams['ruler'] == '1' || mxSettings.isRulerOn()) &&
+				(!this.editor.isChromelessView() || this.editor.editable);
 			
-			this.ruler = showRuler? new mxDualRuler(this, view.unit) : null;
+			this.ruler = (showRuler) ? new mxDualRuler(this, view.unit) : null;
 			this.refresh();
 		}
 		

+ 5 - 1
src/main/webapp/js/diagramly/Menus.js

@@ -178,6 +178,7 @@
 				editorUi.refresh();
 			}
 		});
+		rulerAction.setEnabled(editorUi.canvasSupported && document.documentMode != 9);
 		rulerAction.setToggleAction(true);
 		rulerAction.setSelectedCallback(function() { return editorUi.ruler != null; });
 
@@ -203,7 +204,10 @@
 					
 					this.freehandWindow.window.setVisible(graph.freehand.isDrawing());
 				}
-			})).isEnabled = isGraphEnabled;
+			})).isEnabled = function()
+			{
+				return isGraphEnabled() && mxClient.IS_SVG;
+			};
 		}
 		
 		editorUi.actions.put('exportXml', new Action(mxResources.get('formatXml') + '...', function()

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

@@ -1101,7 +1101,9 @@ EditorUi.prototype.updateTabContainer = function()
 				
 				mxEvent.addListener(tab, 'dragend', mxUtils.bind(this, function(evt)
 				{
-					startIndex = null;
+					// Workaround for end before drop in Chrome on Win10 is to
+					// reset startIndex in drop event handler instead
+					// startIndex = null;
 					evt.stopPropagation();
 					evt.preventDefault();
 				}));
@@ -1125,6 +1127,7 @@ EditorUi.prototype.updateTabContainer = function()
 						this.movePage(startIndex, index);
 					}
 
+					startIndex = null;
 					evt.stopPropagation();
 					evt.preventDefault();
 				}));

+ 1 - 1
src/main/webapp/js/diagramly/graphml/mxGraphMlCodec.js

@@ -2137,7 +2137,7 @@ mxGraphMlCodec.prototype.addEdgeStyle = function (edge, styleObj, styleMap)
 		"y:LineStyle": {
 			"color": {key: "strokeColor", mod: "color"},
 			"type": desktopLineStyleFn,
-			"width": "strokeWidth",
+			"width": "strokeWidth"
 		},
 		"y:Arrows": {
 			"source": startArrow,

+ 4 - 4
src/main/webapp/js/diagramly/mxFreehand.js

@@ -1,14 +1,14 @@
 function mxFreehand(graph)
 {
-	//Graph must have a container
-	if (graph.container == null || graph.container.querySelector('svg') == null)
+	// Graph must have a container
+	var svgElement = (graph.view != null && graph.view.canvas != null) ? graph.view.canvas.ownerSVGElement : null;
+	
+	if (graph.container == null || svgElement == null)
 	{
 		return;
 	}
 	
 	//Code inspired by https://stackoverflow.com/questions/40324313/svg-smooth-freehand-drawing
-	var svgElement = graph.container.querySelector('svg');
-	
 	var bufferSize = mxFreehand.prototype.NORMAL_SMOOTHING;
 	var path = null;
 	var partPathes = [];

+ 70 - 54
src/main/webapp/js/diagramly/mxRuler.js

@@ -329,69 +329,85 @@ function mxRuler(editorUi, unit, isVertical, isSecondery)
     	drawRuler();
     }
     
-    //Showing guides on cell move
+    // Showing guides on cell move
     this.origGuideMove = mxGuide.prototype.move;
 	
 	mxGuide.prototype.move = function (bounds, delta, gridEnabled, clone)
 	{
-		if (ruler.guidePart != null)
-		{
-			ctx.putImageData(ruler.guidePart.imgData1, ruler.guidePart.x1, ruler.guidePart.y1);	
-			ctx.putImageData(ruler.guidePart.imgData2, ruler.guidePart.x2, ruler.guidePart.y2);	
-			ctx.putImageData(ruler.guidePart.imgData3, ruler.guidePart.x3, ruler.guidePart.y3);	
-		}
+		var ret = null;
 		
-		var ret = ruler.origGuideMove.apply(this, arguments);
-
-		var x1, y1, imgData1, x2, y2, imgData2, x3, y3, imgData3;
-		ctx.lineWidth = 0.5;
-        ctx.strokeStyle = style.guideClr;
-        ctx.setLineDash([2]);
-
-        if (isVertical)
+		// LATER: Fix repaint for width and height < 5
+		if ((isVertical && bounds.height > 4) || (!isVertical && bounds.width > 4))
 		{
-			y1 = bounds.y + ret.y + RULER_THICKNESS - this.graph.container.scrollTop;
-			x1 = 0;
-			y2 = y1 + bounds.height / 2;
-			x2 = RULER_THICKNESS / 2;
-			y3 = y1 + bounds.height;
-			x3 = 0;
-			imgData1 = ctx.getImageData(x1, y1, RULER_THICKNESS, 5);
-			drawLine(x1, y1, RULER_THICKNESS, y1);
-			imgData2 = ctx.getImageData(x2, y2, RULER_THICKNESS, 5);
-			drawLine(x2, y2, RULER_THICKNESS, y2);
-			imgData3 = ctx.getImageData(x3, y3, RULER_THICKNESS, 5);
-			drawLine(x3, y3, RULER_THICKNESS, y3);
+			if (ruler.guidePart != null)
+			{
+				ctx.putImageData(ruler.guidePart.imgData1, ruler.guidePart.x1, ruler.guidePart.y1);	
+				ctx.putImageData(ruler.guidePart.imgData2, ruler.guidePart.x2, ruler.guidePart.y2);	
+				ctx.putImageData(ruler.guidePart.imgData3, ruler.guidePart.x3, ruler.guidePart.y3);	
+			}
+			
+			ret = ruler.origGuideMove.apply(this, arguments);
+	
+			var x1, y1, imgData1, x2, y2, imgData2, x3, y3, imgData3;
+			ctx.lineWidth = 0.5;
+	        ctx.strokeStyle = style.guideClr;
+	        ctx.setLineDash([2]);
+	
+	        if (isVertical)
+			{
+				y1 = bounds.y + ret.y + RULER_THICKNESS - this.graph.container.scrollTop;
+				x1 = 0;
+				y2 = y1 + bounds.height / 2;
+				x2 = RULER_THICKNESS / 2;
+				y3 = y1 + bounds.height;
+				x3 = 0;
+				imgData1 = ctx.getImageData(x1, y1 - 1, RULER_THICKNESS, 3);
+				drawLine(x1, y1, RULER_THICKNESS, y1);
+				y1--;
+				imgData2 = ctx.getImageData(x2, y2 - 1, RULER_THICKNESS, 3);
+				drawLine(x2, y2, RULER_THICKNESS, y2);
+				y2--;
+				imgData3 = ctx.getImageData(x3, y3 - 1, RULER_THICKNESS, 3);
+				drawLine(x3, y3, RULER_THICKNESS, y3);
+				y3--;
+			}
+			else
+			{
+				y1 = 0;
+				x1 = bounds.x + ret.x + RULER_THICKNESS - this.graph.container.scrollLeft;
+				y2 = RULER_THICKNESS / 2;
+				x2 = x1 + bounds.width / 2;
+				y3 = 0;
+				x3 = x1 + bounds.width;
+				imgData1 = ctx.getImageData(x1 - 1, y1, 3, RULER_THICKNESS);
+				drawLine(x1, y1, x1, RULER_THICKNESS);
+				x1--;
+				imgData2 = ctx.getImageData(x2 - 1, y2, 3, RULER_THICKNESS);
+				drawLine(x2, y2, x2, RULER_THICKNESS);
+				x2--;
+				imgData3 = ctx.getImageData(x3 - 1, y3, 3, RULER_THICKNESS);
+				drawLine(x3, y3, x3, RULER_THICKNESS);
+				x3--;
+			}
+			
+			if (ruler.guidePart == null || ruler.guidePart.x1 != x1 || ruler.guidePart.y1 != y1)
+			{
+				ruler.guidePart = { 
+					imgData1: imgData1,
+					x1: x1,
+					y1: y1,
+					imgData2: imgData2,
+					x2: x2,
+					y2: y2,
+					imgData3: imgData3,
+					x3: x3,
+					y3: y3
+				}	
+			}
 		}
 		else
 		{
-			y1 = 0;
-			x1 = bounds.x + ret.x + RULER_THICKNESS - this.graph.container.scrollLeft;
-			y2 = RULER_THICKNESS / 2;
-			x2 = x1 + bounds.width / 2;
-			y3 = 0;
-			x3 = x1 + bounds.width;
-			imgData1 = ctx.getImageData(x1 , y1, 5, RULER_THICKNESS);
-			drawLine(x1, y1, x1, RULER_THICKNESS);
-			imgData2 = ctx.getImageData(x2 , y2, 5, RULER_THICKNESS);
-			drawLine(x2, y2, x2, RULER_THICKNESS);
-			imgData3 = ctx.getImageData(x3 , y3, 5, RULER_THICKNESS);
-			drawLine(x3, y3, x3, RULER_THICKNESS);
-		}
-		
-		if (ruler.guidePart == null || ruler.guidePart.x1 != x1 || ruler.guidePart.y1 != y1)
-		{
-			ruler.guidePart = { 
-				imgData1: imgData1,
-				x1: x1,
-				y1: y1,
-				imgData2: imgData2,
-				x2: x2,
-				y2: y2,
-				imgData3: imgData3,
-				x3: x3,
-				y3: y3
-			}	
+			ret = ruler.origGuideMove.apply(this, arguments);
 		}
 		
 		return ret;

+ 1 - 1
src/main/webapp/js/diagramly/sidebar/Sidebar-Flowchart.js

@@ -16,7 +16,7 @@
 			this.createVertexTemplateEntry(s + 'annotation_2;align=left;labelPosition=right;pointerEvents=1;connectable=0;', w * 0.5, h, '', 'Annotation', null, null, this.getTagsForStencil(gn, 'annotation_2', dt).join(' ')),
 			this.createVertexTemplateEntry(s3 + 'card;whiteSpace=wrap;size=20;arcSize=12;', w, h * 0.6, '', 'Card', null, null, this.getTagsForStencil(gn, 'card', dt).join(' ')),
 			this.createVertexTemplateEntry(s2 + 'collate;', w, h, '', 'Collate', null, null, this.getTagsForStencil(gn, 'collate', dt).join(' ')),
-			this.createVertexTemplateEntry(s3 + 'parallelogram;perimeter=parallelogramPerimeter;whiteSpace=wrap;rounded=1;arcSize=12;size=0.23;', w, h * 0.6, '', 'Data', null, null, this.getTagsForStencil(gn, 'data', dt).join(' ')),
+			this.createVertexTemplateEntry('shape=parallelogram;html=1;strokeWidth=2;perimeter=parallelogramPerimeter;whiteSpace=wrap;rounded=1;arcSize=12;size=0.23;', w, h * 0.6, '', 'Data', null, null, this.getTagsForStencil(gn, 'data', dt).join(' ')),
 			this.createVertexTemplateEntry(s + 'database;whiteSpace=wrap;', w * 0.6, h * 0.6, '', 'Database', null, null, this.getTagsForStencil(gn, 'database', dt).join(' ')),
 			this.createVertexTemplateEntry(s + 'decision;whiteSpace=wrap;', w, h, '', 'Decision', null, null, this.getTagsForStencil(gn, 'decision', dt).join(' ')),
 			this.createVertexTemplateEntry(s + 'delay;whiteSpace=wrap;', w, h * 0.6, '', 'Delay', null, null, this.getTagsForStencil(gn, 'delay', dt).join(' ')),

+ 1 - 1
src/main/webapp/js/diagramly/vsdx/importer.js

@@ -1374,7 +1374,7 @@ var com;
                                         	{
                                             	shapeName_1 = "";
                                         	}
-                                            shapeName_1 = JSON.stringify(mxUtils.htmlEntities(shapeName_1));
+                                            shapeName_1 = mxUtils.htmlEntities(JSON.stringify(shapeName_1));
                                             /* append */ (function (sb) { return sb.str = sb.str.concat(shapeName_1); })(shapes_1);
                                             /* append */ (function (sb) { return sb.str = sb.str.concat("}"); })(shapes_1);
                                             comma_1 = ",";

文件差異過大導致無法顯示
+ 1 - 1
src/main/webapp/js/extensions.min.js


+ 0 - 2
src/main/webapp/js/mxgraph/Dialogs.js

@@ -2163,8 +2163,6 @@ var OutlineWindow = function(editorUi, x, y, w, h)
 				{
 					zoomOutAction.funct();
 				}
-	
-				mxEvent.consume(evt);
 			}
 		});
 	}

+ 1 - 1
src/main/webapp/js/mxgraph/EditorUi.js

@@ -1116,7 +1116,7 @@ EditorUi.prototype.onKeyPress = function(evt)
 	
 	// KNOWN: Focus does not work if label is empty in quirks mode
 	if (this.isImmediateEditingEvent(evt) && !graph.isEditing() && !graph.isSelectionEmpty() && evt.which !== 0 &&
-		!mxEvent.isAltDown(evt) && !mxEvent.isControlDown(evt) && !mxEvent.isMetaDown(evt))
+		evt.which !== 27 && !mxEvent.isAltDown(evt) && !mxEvent.isControlDown(evt) && !mxEvent.isMetaDown(evt))
 	{
 		graph.escape();
 		graph.startEditing();

+ 8 - 19
src/main/webapp/js/mxgraph/Graph.js

@@ -8184,6 +8184,7 @@ if (typeof mxVertexHandler != 'undefined')
 		mxVertexHandler.prototype.rotationEnabled = true;
 		mxVertexHandler.prototype.manageSizers = true;
 		mxVertexHandler.prototype.livePreview = true;
+		mxGraphHandler.prototype.maxLivePreview = 16;
 	
 		// Increases default rubberband opacity (default is 20)
 		mxRubberband.prototype.defaultOpacity = 30;
@@ -8690,12 +8691,6 @@ if (typeof mxVertexHandler != 'undefined')
 			
 			var update = mxUtils.bind(this, function()
 			{
-				// Shows rotation handle only if one vertex is selected
-				if (this.rotationShape != null && this.rotationShape.node != null)
-				{
-					this.rotationShape.node.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none';
-				}
-				
 				if (this.specialHandle != null)
 				{
 					this.specialHandle.node.style.display = (this.graph.isEnabled() && this.graph.getSelectionCount() < this.graph.graphHandler.maxCells) ? '' : 'none';
@@ -8882,6 +8877,13 @@ if (typeof mxVertexHandler != 'undefined')
 		var vertexHandlerRedrawHandles = mxVertexHandler.prototype.redrawHandles;
 		mxVertexHandler.prototype.redrawHandles = function()
 		{
+			// Shows rotation handle only if one vertex is selected
+			if (this.rotationShape != null && this.rotationShape.node != null)
+			{
+				this.rotationShape.node.style.display = (this.graph.getSelectionCount() == 1 &&
+					(this.index == null || this.index == mxEvent.ROTATION_HANDLE)) ? '' : 'none';
+			}
+			
 			vertexHandlerRedrawHandles.apply(this);
 
 			if (this.state != null && this.linkHint != null)
@@ -8910,20 +8912,7 @@ if (typeof mxVertexHandler != 'undefined')
 					this.state.view.graph.tolerance) + 'px';
 			}
 		};
-
 		
-		var vertexHandlerReset = mxVertexHandler.prototype.reset;
-		mxVertexHandler.prototype.reset = function()
-		{
-			vertexHandlerReset.apply(this, arguments);
-			
-			// Shows rotation handle only if one vertex is selected
-			if (this.rotationShape != null && this.rotationShape.node != null)
-			{
-				this.rotationShape.node.style.display = (this.graph.getSelectionCount() == 1) ? '' : 'none';
-			}
-		};
-	
 		var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
 		mxVertexHandler.prototype.destroy = function()
 		{

文件差異過大導致無法顯示
+ 486 - 476
src/main/webapp/js/viewer.min.js


+ 175 - 175
src/main/webapp/resources/dia_nl.txt

@@ -5,7 +5,7 @@ accessDenied=Toegang geweigerd
 action=Actie
 actualSize=Ware grootte
 add=Toevoegen
-addAccount=Add account
+addAccount=Account toevoegen
 addedFile={1} toegevoegd
 addImages=Afbeeldingen toevoegen
 addImageUrl=Afbeelding-URL toevoegen
@@ -86,7 +86,7 @@ cannotOpenFile=Kan bestand niet openen
 change=Wijzigen
 changeOrientation=Oriëntatie wijzigen
 changeUser=Gebruiker wijzigen
-changeStorage=Change storage
+changeStorage=Opslag wijzigen
 changesNotSaved=Wijzigingen niet opgeslagen
 userJoined={1} heeft zich aangesloten
 userLeft={1} is vertrokken
@@ -110,7 +110,7 @@ clearDefaultStyle=Standaardstijl wissen
 clearWaypoints=Tussenpunten wissen
 clipart=Clipart
 close=Sluiten
-closingFile=Closing file
+closingFile=Bestand sluiten
 collaborator=Medewerker
 collaborators=Medewerkers
 collapse=Inklappen
@@ -195,7 +195,7 @@ draw.io=draw.io
 drawing=Tekening{1}
 drawingEmpty=Tekening is blanco
 drawingTooLarge=Tekening is te groot
-drawioForWork=Draw.io voor GSuite
+drawioForWork=draw.io voor GSuite
 dropbox=Dropbox
 duplicate=Dupliceren
 duplicateIt={1} dupliceren
@@ -396,7 +396,7 @@ insertText=Tekst invoegen
 inserting=Invoegen
 invalidFilename=Een Diagramnaam mag niet de volgende tekens bevatten: \ / | : ; { } < > & + ? = "
 invalidLicenseSeeThisPage=Uw licentie is ongeldig, bekijk deze <a target="_blank" href="https://support.draw.io/display/DFCS/Licensing+your+draw.io+plugin">pagina</a>.
-invalidInput=Invalid input
+invalidInput=Ingeldige invoer
 invalidName=Ongeldige naam
 invalidOrMissingFile=Ongeldig of ontbrekend bestand
 invalidPublicUrl=Ongeldige publieke URL
@@ -623,7 +623,7 @@ saveAndExit=Opslaan & afsluiten
 saveAs=Opslaan als
 saveAsXmlFile=Opslaan als XML-bestand?
 saved=Opgeslagen
-saveDiagramFirst=Please save the diagram first
+saveDiagramFirst=Sla het diagram eerst op
 saveDiagramsTo=Diagrammen opslaan naar
 saveLibrary403=Onvoldoende rechten om deze bibliotheek te bewerken
 saveLibrary500=Er is een fout opgetreden bij het opslaan van de bibliotheek
@@ -661,7 +661,7 @@ signs=Tekens
 signOut=Afmelden
 simple=Eenvoudig
 simpleArrow=Eenvoudige pijl
-simpleViewer=Simple Viewer
+simpleViewer=Eenvoudige weergave
 size=Grootte
 solid=Massief
 sourceSpacing=Bronafstand
@@ -780,174 +780,174 @@ gridView=Rasterweergave
 resultsFor=Resultaten voor '{1}'
 oneDriveCharsNotAllowed=De volgende tekens zijn niet toegestaan: ~ "#% *: <>? / \ {|}
 oneDriveInvalidDeviceName=De opgegeven apparaatnaam is ongeldig
-officeNotLoggedOD=U bent niet aangemeld bij OneDrive. Open het Draw.io taakvenster en log eerst in.
-officeSelectSingleDiag=Please select a single draw.io diagram only without other contents.
-officeSelectDiag=Please select a draw.io diagram.
-officeCannotFindDiagram=Cannot find a draw.io diagram in the selection
-noDiagrams=No diagrams found
-authFailed=Authentication failed
-officeFailedAuthMsg=Unable to successfully authenticate user or authorize application.
-convertingDiagramFailed=Converting diagram failed
-officeCopyImgErrMsg=Due to some limitations in the host application, the image could not be inserted. Please manually copy the image then paste it to the document.
-insertingImageFailed=Inserting image failed
-officeCopyImgInst=Instructions: Right-click the image below. Select "Copy image" from the context menu. Then, in the document, right-click and select "Paste" from the context menu.
-folderEmpty=Folder is empty
+officeNotLoggedOD=U bent niet aangemeld bij OneDrive. Open het draw.io taakvenster en log eerst in.
+officeSelectSingleDiag=Selecteer één draw.io diagram zonder aanvullende inhoud.
+officeSelectDiag=Selecteer een draw.io diagram.
+officeCannotFindDiagram=De selectie bevat geen draw.io diagram
+noDiagrams=Geen diagrammen gevonden
+authFailed=Verificatie mislukt
+officeFailedAuthMsg=Kan de gebruiker niet succesvol verifiëren of de toepassing autoriseren.
+convertingDiagramFailed=De conversie van het diagram is mislukt
+officeCopyImgErrMsg=Vanwege enkele beperkingen in de hosttoepassing kon de afbeelding niet worden ingevoegd. Kopieer de afbeelding handmatig en plak deze in het document. 
+insertingImageFailed=Het invoegen van de afbeelding is mislukt
+officeCopyImgInst=Instructies: Klik met de rechtermuisknop op de onderstaande afbeelding. Selecteer "Afbeelding kopiëren" in het contextmenu. Klik vervolgens in het document met de rechtermuisknop en selecteer "Plakken" in het contextmenu.
+folderEmpty=Map is leeg
 recent=Recent
-sharedWithMe=Shared With Me
-sharepointSites=Sharepoint Sites
-errorFetchingFolder=Error fetching folder items
-errorAuthOD=Error authenticating to OneDrive
-officeMainHeader=Adds draw.io diagrams to your document.
-officeStepsHeader=This add-in performs the following steps:
-officeStep1=Connects to Microsoft OneDrive, Google Drive or your device.
-officeStep2=Select a draw.io diagram.
-officeStep3=Insert the diagram into the document.
-officeAuthPopupInfo=Please complete the authentication in the pop-up window.
-officeSelDiag=Select draw.io Diagram:
-files=Files
-shared=Shared
-sharepoint=Sharepoint
-officeManualUpdateInst=Instructions: Copy draw.io diagram from the document. Then, in the box below, right-click and select "Paste" from the context menu.
-officeClickToEdit=Click icon to start editing:
-pasteDiagram=Paste draw.io diagram here
-connectOD=Connect to OneDrive
-selectChildren=Select Children
-selectSiblings=Select Siblings
-selectParent=Select Parent
-selectDescendants=Select Descendants
-lastSaved=Last saved {1} ago
-resolve=Resolve
-reopen=Re-open
-showResolved=Show Resolved
-reply=Reply
-objectNotFound=Object not found
-reOpened=Re-opened
-markedAsResolved=Marked as resolved
-noCommentsFound=No comments found
-comments=Comments
-timeAgo={1} ago
+sharedWithMe=Gedeeld met mij
+sharepointSites=SharePoint Sites
+errorFetchingFolder=Fout bij het ophalen van mapitems
+errorAuthOD=Fout bij authenticeren bij OneDrive
+officeMainHeader=Voegt draw.io-diagrammen toe aan uw document.
+officeStepsHeader=Deze invoegtoepassing voert de volgende stappen uit:
+officeStep1=Maakt verbinding met Microsoft OneDrive, Google Drive of uw apparaat.
+officeStep2=Selecteer een draw.io-diagram.
+officeStep3=Plaats het diagram in het document.
+officeAuthPopupInfo=Vul de authenticatie in het pop-upvenster in.
+officeSelDiag=Selecteer draw.io-diagram:
+files=Bestanden
+shared=Gedeeld
+sharepoint=SharePoint
+officeManualUpdateInst=Instructies: kopieer het draw.io-diagram uit het document. Klik vervolgens in het onderstaande vak met de rechtermuisknop en selecteer "Plakken" in het contextmenu.
+officeClickToEdit=Klik op het pictogram om te beginnen met bewerken:
+pasteDiagram=Plak hier het draw.io-diagram
+connectOD=Maak verbinding met OneDrive
+selectChildren=Selecteer kinderen
+selectSiblings=Selecteer broers en zussen
+selectParent=Selecteer ouder
+selectDescendants=Selecteer nakomelingen
+lastSaved=Laatst opgeslagen {1} geleden
+resolve=Oplossen
+reopen=Opnieuw openen
+showResolved=Opgelost weergeven
+reply=Beantwoorden
+objectNotFound=Object niet gevonden
+reOpened=Opnieuw geopend
+markedAsResolved=Gemarkeerd als opgelost
+noCommentsFound=Geen commentaar gevonden
+comments=Commentaar
+timeAgo={1} geleden
 confluenceCloud=Confluence Cloud
-libraries=Libraries
-confAnchor=Confluence Page Anchor
-confTimeout=The connection has timed out
-confSrvTakeTooLong=The server at {1} is taking too long to respond.
-confCannotInsertNew=Cannot insert draw.io diagram to a new Confluence page
-confSaveTry=Please save the page and try again.
-confCannotGetID=Unable to determine page ID
-confContactAdmin=Please contact your Confluence administrator.
-readErr=Read Error
-editingErr=Editing Error
-confExtEditNotPossible=This diagram cannot be edited externally. Please try editing it while editing the page
-confEditedExt=Diagram/Page edited externally
-diagNotFound=Diagram Not Found
-confEditedExtRefresh=Diagram/Page is edited externally. Please refresh the page.
-confCannotEditDraftDelOrExt=Cannot edit diagrams in a draft page, diagram is deleted from the page, or diagram is edited externally. Please, check the page.
-retBack=Return back
-confDiagNotPublished=The diagram does not belong to a published page
-createdByDraw=Created by draw.io
-filenameShort=Filename too short
-invalidChars=Invalid characters
-alreadyExst={1} already exists
-draftReadErr=Draft Read Error
-diagCantLoad=Diagram cannot be loaded
-draftWriteErr=Draft Write Error
-draftCantCreate=Draft could not be created
-confDuplName=Duplicate diagram name detected. Please pick another name.
-confSessionExpired=Looks like your session expired. Log in again to keep working.
-login=Login
-drawPrev=draw.io preview
-drwaDiag=draw.io diagram
-unknownErr=Unkown Error
-invalidCallFnNotFound=Invalid Call: {1} not found
-invalidCallErrOccured=Invalid Call: An error occured, {1}
-anonymous=Anonymous
-confGotoPage=Go to containing page
-showComments=Show Comments
-confError=Error: {1}
-gliffyImport=Gliffy Import
-gliffyImportInst1=Click the "Start Import" button to import all Gliffy diagrams to draw.io.
-gliffyImportInst2=Please note that the import procedure will take some time and the browser window must remain open until the import is completed.
-startImport=Start Import
-drawConfig=draw.io Configuration
-customLib=Custom Libraries
-customTemp=Custom Templates
-pageIdsExp=Page IDs Export
-drawReindex=draw.io re-indexing (beta)
-working=Working
-drawConfigNotFoundInst=draw.io Configuration Space (DRAWIOCONFIG) does not exist. This space is needed to store draw.io configuration files and custom libraries/templates.
-createConfSp=Create Config Space
-unexpErrRefresh=Unexpected error, please refresh the page and try again.
-configJSONInst=Write draw.io JSON configuration in the editor below then click save. If you need help, please refer to
-thisPage=this page
-curCustLib=Current Custom Libraries
-libName=Library Name
-action=Action
+libraries=Bibliotheken
+confAnchor=Confluence Pagina-anker
+confTimeout=De verbinding heeft een time-out
+confSrvTakeTooLong=Het duurt te lang voordat de server op {1} reageert.
+confCannotInsertNew=Kan draw.io-diagram niet in een nieuwe Confluence-pagina invoegen
+confSaveTry=Sla de pagina op en probeer het opnieuw.
+confCannotGetID=Kan pagina-ID niet bepalen
+confContactAdmin=Neem contact op met uw Confluence-beheerder.
+readErr=Leesfout
+editingErr=Bewerkingsfout
+confExtEditNotPossible=Dit diagram kan niet extern worden bewerkt. Probeer het te bewerken terwijl u de pagina bewerkt
+confEditedExt=Diagram/pagina extern bewerkt
+diagNotFound=Diagram niet aangetroffen
+confEditedExtRefresh=Diagram/pagina is extern bewerkt. Ververs de pagina.
+confCannotEditDraftDelOrExt=Kan diagrammen in een conceptpagina niet bewerken, diagram wordt van de pagina verwijderd of diagram wordt extern bewerkt. Controleer alstublieft de pagina.
+retBack=Keer terug
+confDiagNotPublished=Het diagram hoort niet bij een gepubliceerde pagina
+createdByDraw=Gemaakt door draw.io
+filenameShort=Bestandsnaam is te kort
+invalidChars=Ongeldige lettertekens
+alreadyExst={1} bestaat reeds
+draftReadErr=Concept leesfout
+diagCantLoad=Diagram kan niet worden geladen
+draftWriteErr=Concept schrijffout
+draftCantCreate=Concept kon niet worden gemaakt
+confDuplName=Dubbele diagramnaam gedetecteerd. Kies een andere naam.
+confSessionExpired=Het lijkt erop dat uw sessie is verlopen. Log opnieuw in om te blijven werken.
+login=Aanmelding
+drawPrev=draw.io voorvertoning
+drwaDiag=draw.io-diagram
+unknownErr=Onbekende fout
+invalidCallFnNotFound=Ongeldige oproep: {1} niet gevonden
+invalidCallErrOccured=Ongeldige oproep: Er is een fout opgetreden, {1}
+anonymous=Anoniem
+confGotoPage=Ga naar interne pagina
+showComments=Commentar weergeven
+confError=Fout: {1}
+gliffyImport=Gliffy importeren
+gliffyImportInst1=Klik op de knop "Import starten" om alle Gliffy-diagrammen naar draw.io te importeren.
+gliffyImportInst2=Houd er rekening mee dat de importprocedure enige tijd duurt en dat het browservenster open moet blijven totdat de import is voltooid.
+startImport=Start importeren
+drawConfig=draw.io configuratie
+customLib=Aangepaste bibliotheken
+customTemp=Aangepaste sjablonen
+pageIdsExp=Pagina-ID's exporteren
+drawReindex=draw.io opnieuw indexeren (beta)
+working=Bezig
+drawConfigNotFoundInst=draw.io Configuration Space (DRAWIOCONFIG) bestaat niet. Deze ruimte is nodig om draw.io-configuratiebestanden en aangepaste bibliotheken/sjablonen op te slaan.
+createConfSp=Config Space aanmaken
+unexpErrRefresh=Onverwachte fout, vernieuw de pagina en probeer het opnieuw.
+configJSONInst=Schrijf draw.io JSON-configuratie in de onderstaande editor en klik vervolgens op opslaan. Als u hulp nodig hebt, raadpleegt u
+thisPage=deze pagina
+curCustLib=Huidige aangepaste bibliotheken
+libName=Bibliotheeknaam
+action=Actie
 drawConfID=draw.io Config ID
-addLibInst=Click the "Add Library" button to upload a new library.
-addLib=Add Library
-customTempInst1=Custom templates are draw.io diagrams saved in children pages of
-customTempInst2=For more details, please refer to
-tempsPage=Templates page
-pageIdsExpInst1=Click the "Start Export" button to export all pages IDs.
-pageIdsExpInst2=Please note that the export procedure will take some time and the browser window must remain open until the export is completed.
-startExp=Start Export
-refreshDrawIndex=Refresh draw.io Diagrams Index
-reindexInst1=Click the "Start Indexing" button to refresh draw.io diagrams index.
-reindexInst2=Please note that the indexing procedure will take some time and the browser window must remain open until the indexing is completed.
-startIndexing=Start Indexing
-confAPageFoundFetch=Page "{1}" found. Fetching
-confAAllDiagDone=All {1} diagrams processed. Process finished.
-confAStartedProcessing=Started processing page "{1}"
-confAAllDiagInPageDone=All {1} diagrams in page "{2}" processed successfully.
-confAPartialDiagDone={1} out of {2} {3} diagrams in page "{4}" processed successfully.
-confAUpdatePageFailed=Updating page "{1}" failed.
-confANoDiagFoundInPage=No {1} diagrams found in page "{2}".
-confAFetchPageFailed=Fetching the page failed.
-confANoDiagFound=No {1} diagrams found. Process finished.
-confASearchFailed=Searching for {1} diagrams failed. Please try again later.
-confAGliffyDiagFound=Gliffy diagram "{1}" found. Importing
-confAGliffyDiagImported=Gliffy diagram "{1}" imported successfully.
-confASavingImpGliffyFailed=Saving imported Gliffy diagram "{1}" failed.
-confAImportedFromByDraw=Imported from "{1}" by draw.io
-confAImportGliffyFailed=Importing Gliffy diagram "{1}" failed.
-confAFetchGliffyFailed=Fetching Gliffy diagram "{1}" failed.
-confACheckBrokenDiagLnk=Checking for broken diagrams links.
-confADelDiagLinkOf=Deleting diagram link of "{1}"
-confADupLnk=(duplicate link)
-confADelDiagLnkFailed=Deleting diagram link of "{1}" failed.
-confAUnexpErrProcessPage=Unexpected error during processing the page with id: {1}
-confADiagFoundIndex=Diagram "{1}" found. Indexing
-confADiagIndexSucc=Diagram "{1}" indexed successfully.
-confAIndexDiagFailed=Indexing diagram "{1}" failed.
-confASkipDiagOtherPage=Skipped "{1}" as it belongs to another page!
-confADiagUptoDate=Diagram "{1}" is up to date.
-confACheckPagesWDraw=Checking pages having draw.io diagrams.
-confAErrOccured=An error occured!
-savedSucc=Saved successfully
-confASaveFailedErr=Saving Failed (Unexpected Error)
-character=Character
-confAConfPageDesc=This page contains draw.io configuration file (configuration.json) as attachment
-confALibPageDesc=This page contains draw.io custom libraries as attachments
-confATempPageDesc=This page contains draw.io custom templates as attachments
-working=Working
-confAConfSpaceDesc=This space is used to store draw.io configuration files and custom libraries/templates
-confANoCustLib=No Custom Libraries
-delFailed=Delete failed!
-showID=Show ID
-confAIncorrectLibFileType=Incorrect file type. Libraries should be XML files.
-uploading=Uploading
-confALibExist=This library already exists
-confAUploadSucc=Uploaded successfully
-confAUploadFailErr=Upload Failed (Unexpected Error)
-hiResPreview=High Res Preview
-officeNotLoggedGD=You are not logged in to Google Drive. Please open draw.io task pane and login first.
-officePopupInfo=Please complete the process in the pop-up window.
-pickODFile=Pick OneDrive File
-pickGDriveFile=Pick Google Drive File
-pickDeviceFile=Pick Device File
-vsdNoConfig="vsdurl" is not configured
-ruler=Ruler
-units=Units
-points=Points
-inches=Inches
-millimeters=Millimeters
+addLibInst=Klik op de knop "Bibliotheek toevoegen" om een nieuwe bibliotheek te uploaden.
+addLib=Bibliotheek toevoegen
+customTempInst1=Aangepaste sjablonen zijn draw.io-diagrammen die zijn opgeslagen in onderliggende pagina's van
+customTempInst2=Raadpleeg voor meer informatie
+tempsPage=Sjablonenpagina
+pageIdsExpInst1=Klik op de knop "Export starten" om alle pagina-ID's te exporteren.
+pageIdsExpInst2=Houd er rekening mee dat de exportprocedure enige tijd duurt en dat het browservenster open moet blijven totdat de export is voltooid.
+startExp=Start exporteren
+refreshDrawIndex=draw.io Diagrams Index verversen
+reindexInst1=Klik op de knop "Start Indexering" om de index van draw.io diagrammen te vernieuwen.
+reindexInst2=Houd er rekening mee dat het indexeren enige tijd kan duren en dat het browservenster open moet blijven totdat het indexeren is voltooid.
+startIndexing=Start Indexering
+confAPageFoundFetch=Pagina "{1}" gevonden. Ophalen
+confAAllDiagDone=Alle {1} diagrammen verwerkt. Proces voltooid.
+confAStartedProcessing=Begonnen met het verwerken van pagina "{1}"
+confAAllDiagInPageDone=Alle {1} diagrammen op pagina "{2}" zijn succesvol verwerkt.
+confAPartialDiagDone={1} van {2} {3} diagrammen op pagina "{4}" succesvol verwerkt.
+confAUpdatePageFailed=Het bijwerken van pagina "{1}" is mislukt.
+confANoDiagFoundInPage=Geen {1} diagrammen gevonden op pagina "{2}".
+confAFetchPageFailed=Het ophalen van de pagina is mislukt.
+confANoDiagFound=Geen {1} diagrammen gevonden. Proces voltooid.
+confASearchFailed=Zoeken naar {1} diagrammen is mislukt. Probeer het later opnieuw.
+confAGliffyDiagFound=Gliffy-diagram "{1}" gevonden. Importeren
+confAGliffyDiagImported=Gliffy-diagram "{1}" succesvol geïmporteerd.
+confASavingImpGliffyFailed=Het opslaan van geïmporteerd Gliffy-diagram "{1}" is mislukt.
+confAImportedFromByDraw=Door draw.io uit "{1}" geïmporteerd
+confAImportGliffyFailed=Het importeren van Gliffy-diagram "{1}" is mislukt.
+confAFetchGliffyFailed=Het ophalen van Gliffy-diagram "{1}" is mislukt.
+confACheckBrokenDiagLnk=Controleren op verbroken diagramkoppelingen.
+confADelDiagLinkOf=Diagramkoppeling van "{1}" verwijderen
+confADupLnk=(dubbele koppeling)
+confADelDiagLnkFailed=Verwijderen van diagramkoppeling van "{1}" is mislukt.
+confAUnexpErrProcessPage=Onverwachte fout tijdens het verwerken van de pagina met ID: {1}
+confADiagFoundIndex=Diagram "{1}" gevonden. Indexeren
+confADiagIndexSucc=Diagram "{1}" is met succes geïndexeerd.
+confAIndexDiagFailed=Indexering van diagram "{1}" is mislukt.
+confASkipDiagOtherPage="{1}" overgeslagen omdat deze bij een andere pagina hoort!
+confADiagUptoDate=Diagram "{1}" is bijgewerkt.
+confACheckPagesWDraw=Pagina's controleren met draw.io-diagrammen.
+confAErrOccured=Er is een fout opgetreden!
+savedSucc=Succesvol opgeslagen
+confASaveFailedErr=Opslaan mislukt (onverwachte fout)
+character=Letterteken
+confAConfPageDesc=Deze pagina bevat het draw.io-configuratiebestand (configuration.json) als bijlage
+confALibPageDesc=Deze pagina bevat aangepaste draw.io-bibliotheken als bijlagen
+confATempPageDesc=Deze pagina bevat aangepaste draw.io-sjablonen als bijlagen
+working=Bezig
+confAConfSpaceDesc=Deze ruimte wordt gebruikt om draw.io-configuratiebestanden en aangepaste bibliotheken/sjablonen op te slaan
+confANoCustLib=Geen aangepaste bibliotheken
+delFailed=Verwijderen mislukt!
+showID=ID weergeven
+confAIncorrectLibFileType=Onjuist bestandstype. Bibliotheken moeten XML-bestanden zijn.
+uploading=Uploaden
+confALibExist=Deze bibliotheek bestaat reeds
+confAUploadSucc=Upload succesvol
+confAUploadFailErr=Upload mislukt (onverwachte fout)
+hiResPreview=Voorbeeld met hoge resolutie
+officeNotLoggedGD=U bent niet ingelogd op Google Drive. Open het draw.io taakvenster en log eerst in.
+officePopupInfo=Voltooi het proces in het pop-upvenster.
+pickODFile=Kies bestand op OneDrive
+pickGDriveFile=Kies bestand op Google Drive
+pickDeviceFile=Kies bestand op apparaat
+vsdNoConfig="vsdurl" is niet geconfigureerd
+ruler=Lineaal
+units=Eenheden
+points=Punt
+inches=Inch
+millimeters=Millimeter

文件差異過大導致無法顯示
+ 285 - 285
src/main/webapp/resources/dia_uk.txt