Bläddra i källkod

20.3.1 release

David Benson 3 år sedan
förälder
incheckning
ea012baba6

+ 12 - 0
ChangeLog

@@ -1,3 +1,15 @@
+15-SEP-2022: 20.3.1
+
+- Multiple commits preparing for live UI switch [DS-909]
+- Disables java proxy by default [DS-912]
+- Removes click to stop drawing freehand [1109]
+- NPE fix [DS-913]
+- NPE fix [DS-914]
+- [conf cloud] Diagram count restrictions on free tier [DFCC-57]
+- Fixes scroll issue for CMD key in Safari 16 [3017]
+- Enables autosize for multiple vertices [1116]
+- Adds ui/safe to fix possible XSS in math [CSP-733]
+
 07-SEP-2022: 20.3.0
 
 - Uses organic as default layout to fix possible NPE in CSV import [DS-910]

+ 1 - 1
VERSION

@@ -1 +1 @@
-20.3.0
+20.3.1

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1868 - 1837
src/main/webapp/js/app.min.js


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

@@ -7080,20 +7080,7 @@ App.prototype.updateUserElement = function()
 	{
 		if (this.userElement == null)
 		{
-			this.userElement = document.createElement('a');
-			this.userElement.className = 'geItem';
-			this.userElement.style.position = 'absolute';
-			this.userElement.style.fontSize = '8pt';
-			this.userElement.style.top = (uiTheme == 'atlas') ? '8px' : '2px';
-			this.userElement.style.right = '30px';
-			this.userElement.style.margin = '4px';
-			this.userElement.style.padding = '2px';
-			this.userElement.style.paddingRight = '16px';
-			this.userElement.style.verticalAlign = 'middle';
-			this.userElement.style.backgroundImage =  'url(' + IMAGE_PATH + '/expanded.gif)';
-			this.userElement.style.backgroundPosition = '100% 60%';
-			this.userElement.style.backgroundRepeat = 'no-repeat';
-			
+			this.userElement = this.createUserElement();
 			this.menubarContainer.appendChild(this.userElement);
 
 			// Prevents focus
@@ -7577,7 +7564,11 @@ App.prototype.updateUserElement = function()
 			
 						if (file != null && file.isRealtimeEnabled() && file.isRealtimeSupported())
 						{
-							div = div.cloneNode(false);
+							var div = document.createElement('div');
+							div.style.padding = '10px';
+							div.style.whiteSpace = 'nowrap';
+							div.style.borderTop = '1px solid rgb(224, 224, 224)';
+							div.style.marginTop = '4px';
 							div.style.textAlign = 'center';
 							div.style.padding = '10px';
 							div.style.fontSize = '9pt';
@@ -7635,12 +7626,13 @@ App.prototype.updateUserElement = function()
 		
 		if (user != null)
 		{
+			EditorUi.removeChildNodes(this.userElement);
 			this.userElement.innerText = '';
-			
-			if (screen.width > 560)
+
+			if (Editor.currentTheme != 'sketch' && screen.width > 560)
 			{
 				mxUtils.write(this.userElement, user.displayName);
-				this.userElement.style.display = 'block';
+				this.userElement.style.display = 'inline-block';
 			}
 		}
 		else
@@ -7648,8 +7640,127 @@ App.prototype.updateUserElement = function()
 			this.userElement.style.display = 'none';
 		}
 	}
+
+	this.updateUserElementStyle();
+	this.updateUserElementIcon();
+};
+
+//TODO Use this function to get the currently logged in user
+App.prototype.updateUserElementIcon = function()
+{
+	var elt = this.userElement;
+
+	if (elt != null)
+	{
+		var title = mxResources.get('changeUser');
+
+		if (elt.style.display != 'none')
+		{
+			var file = this.getCurrentFile();
+
+			if (file != null && file.isRealtimeEnabled() && file.isRealtimeSupported())
+			{
+				var icon = document.createElement('img');
+				icon.setAttribute('border', '0');
+				icon.style.position = 'absolute';
+				icon.style.left = '16px';
+				icon.style.top = '2px';
+				icon.style.width = '12px';
+				icon.style.height = '12px';
+
+				var err = file.getRealtimeError();
+				var state = file.getRealtimeState();
+				title += ' (' + mxResources.get('realtimeCollaboration') + ': ';
+
+				if (state == 1)
+				{
+					icon.src = Editor.syncImage;
+					title += mxResources.get('online');
+				}
+				else
+				{
+					icon.src = Editor.syncProblemImage;
+
+					if (err != null && err.message != null)
+					{
+						title += err.message;
+					}
+					else
+					{
+						title += mxResources.get('disconnected');
+					}
+				}
+				
+				title += ')';
+
+				if (Editor.currentTheme == 'sketch')
+				{
+					elt.style.marginRight = '6px';
+					elt.appendChild(icon);
+				}
+			}
+
+			elt.setAttribute('title', title);
+		}
+	}
 };
 
+//TODO Use this function to get the currently logged in user
+App.prototype.updateUserElementStyle = function()
+{
+	var elt = this.userElement;
+
+	if (elt != null)
+	{
+		if (Editor.currentTheme == 'sketch')
+		{
+    		elt.className = 'geToolbarButton';
+			elt.style.backgroundImage = 'url(' + Editor.userImage + ')';
+        	elt.style.backgroundPosition = 'center center';
+        	elt.style.backgroundRepeat = 'no-repeat';
+        	elt.style.backgroundSize = '100% 100%';
+			elt.style.position = 'relative';
+			elt.style.margin = '0px';
+			elt.style.padding = '0px';
+        	elt.style.height = '24px';
+        	elt.style.width = '24px';
+			elt.style.top = '3px';
+			elt.style.right = '';
+		}
+		else
+		{
+			elt.className = 'geItem';
+			elt.style.backgroundImage =  'url(' + IMAGE_PATH + '/expanded.gif)';
+			elt.style.backgroundPosition = '100% 60%';
+			elt.style.backgroundRepeat = 'no-repeat';
+        	elt.style.backgroundSize = '';
+			elt.style.position = 'absolute';
+			elt.style.margin = '4px';
+			elt.style.padding = '2px';
+			elt.style.paddingRight = '16px';
+			elt.style.width = '';
+			elt.style.height = '';
+			elt.style.right = (Editor.currentTheme == 'atlas' ||
+				urlParams['live-ui'] != '1') ? '8px' : '30px';
+			elt.style.top = (Editor.currentTheme == 'atlas') ? '8px' : '2px';
+		}
+	}
+};
+
+/**
+ * Adds the listener for automatically saving the diagram for local changes.
+ */
+App.prototype.createUserElement = function()
+{
+	var elt = document.createElement('a');
+	mxUtils.setPrefixedStyle(elt.style, 'transition', 'none');
+	elt.style.display = 'inline-block';
+	elt.style.cursor = 'pointer';
+	elt.style.fontSize = '8pt';
+	
+	return elt;
+};
+ 
 //TODO Use this function to get the currently logged in user
 App.prototype.getCurrentUser = function()
 {

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

@@ -32,8 +32,8 @@ if (!mxIsElectron && location.protocol !== 'http:')
 			'; ';
 
 		var styleHashes = '\'sha256-JjkxVHHCCVO0nllPD6hU8bBYSlsikA8TM/o3fhr0bas=\' ' + // index.html
-			'\'sha256-4pUt7OuaoLNo5uDuX+AclpTryPwhRX6uqZWQH/jtOvE=\' ' + // Minimal.js/Light
-			'\'sha256-C26P0UwTt9j3PuMuqZ6wTb7DL6A9c0DoJcT8e2atugc=\' ' + // Minimal.js/Dark
+			'\'sha256-8bAFhdIVH8/EjuHhNVZCG8isp9LZEPSQ23SJ7e54VWI=\' ' + // Minimal.js/Light
+			'\'sha256-fSmyKEwMytIGzQ+V1A8gi8iNvdN+rLOrqJvCL179k8Q=\' ' + // Minimal.js/Dark
 			'\'sha256-7kY8ozVqKLIIBwZ24dhdmZkM26PsOlZmEi72RhmZKoM=\' ' + // mxTooltipHandler.js
 			'\'sha256-kuk5TvxZ/Kwuobo4g6uasb1xRQwr1+nfa1A3YGePO7U=\' ' + // MathJax
 			'\'sha256-ByOXYIXIkfNC3flUR/HoxR4Ak0pjOEF1q8XmtuIa6po=\' ' + // purify.min.js

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

@@ -7695,8 +7695,15 @@ var FreehandWindow = function(editorUi, x, y, w, h, withBrush)
 	{
 		startBtn.innerText = '';
 		mxUtils.write(startBtn, mxResources.get(graph.freehand.isDrawing() ? 'stopDrawing' : 'startDrawing'));
+
+		var shortcut = document.createElement('span');
+		shortcut.style.opacity = '0.7';
+		shortcut.style['float'] = 'right';
+		mxUtils.write(shortcut, 'X');
+		startBtn.appendChild(shortcut);
+
 		startBtn.setAttribute('title', mxResources.get(graph.freehand.isDrawing() ? 'stopDrawing' : 'startDrawing'));
-		startBtn.className = 'geBtn' + (!graph.freehand.isDrawing() ? ' gePrimaryBtn' : '');
+		startBtn.className = 'geBtn' + (graph.freehand.isDrawing() ? ' gePrimaryBtn' : '');
 	}));
 	
 	this.window.addListener('show', mxUtils.bind(this, function()

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

@@ -2388,7 +2388,7 @@
 				{
 					load: [(urlParams['math-output'] == 'html') ?
 						'output/chtml' : 'output/svg', 'input/tex',
-						'input/asciimath']
+						'input/asciimath', 'ui/safe']
 				},
 				startup:
 				{

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 711 - 102
src/main/webapp/js/diagramly/EditorUi.js


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

@@ -77,7 +77,7 @@
 				{
 					load: [(urlParams['math-output'] == 'html') ?
 						'output/chtml' : 'output/svg', 'input/tex',
-						'input/asciimath']
+						'input/asciimath', 'ui/safe']
 				},
 				startup:
 				{

+ 572 - 152
src/main/webapp/js/diagramly/Menus.js

@@ -327,10 +327,12 @@
 			{
 				if (graph.isEnabled())
 				{
-					if (this.freehandWindow == null)
+					if (editorUi.freehandWindow == null)
 					{
 						var withBrush = !mxClient.IS_IE && !mxClient.IS_IE11;
-						this.freehandWindow = new FreehandWindow(editorUi, document.body.offsetWidth - 420, 102, 176, withBrush? 120 : 84, withBrush);
+						editorUi.freehandWindow = new FreehandWindow(
+							editorUi, document.body.offsetWidth - 420, 102, 176,
+							withBrush? 120 : 84, withBrush);
 					}
 					
 					if (graph.freehand.isDrawing())
@@ -342,7 +344,7 @@
 						graph.freehand.startDrawing();
 					}
 					
-					this.freehandWindow.window.setVisible(graph.freehand.isDrawing());
+					editorUi.freehandWindow.window.setVisible(graph.freehand.isDrawing());
 				}
 			}, null, null, 'X')).isEnabled = function()
 			{
@@ -1242,71 +1244,51 @@
 				var menubar = menusCreateMenuBar.apply(this, arguments);
 				
 				if (menubar != null && urlParams['embed'] != '1' &&
-					(uiTheme != 'atlas' || urlParams['live-ui'] == '1'))
+					(uiTheme != 'atlas' && urlParams['live-ui'] == '1'))
 				{
-					var langMenu = this.get((urlParams['live-ui'] == '1') ? 'theme' : 'language');
+					var langMenu = this.get((urlParams['live-ui'] == '1') ?
+						'appearance' : 'language');
 					
 					if (langMenu != null)
 					{
 						var elt = menubar.addMenu('', langMenu.funct);
 						elt.setAttribute('title', mxResources.get(
 							(urlParams['live-ui'] == '1') ?
-							'preferences' : 'language'));
-						elt.className = 'geAdaptiveAsset';
-						elt.style.boxSizing = 'border-box';
-						elt.style.width = '19px';
-						elt.style.height = '19px';
-						elt.style.paddingTop = '2px';
-						elt.style.paddingLeft = '4px';
+							'theme' : 'language'));
+						elt.className = 'geToolbarButton geAdaptiveAsset';
+						elt.style.backgroundImage = 'url(' + Editor.globeImage + ')';
+						elt.style.backgroundPosition = 'center center';
+						elt.style.backgroundRepeat = 'no-repeat';
+						elt.style.backgroundSize = '100% 100%';
+						elt.style.display = 'inline-block';
+						elt.style.verticalAlign = 'top';
+						elt.style.marginLeft = '2px';
+						elt.style.cursor = 'pointer';
 						elt.style.zIndex = '1';
+
+						// Depends on theme
 						elt.style.position = 'absolute';
-						elt.style.display = 'block';
-						elt.style.cursor = 'pointer';
-						elt.style.right = '20px';
-						
-						if (uiTheme == 'min')
+						elt.style.height = '18px';
+						elt.style.width = '18px';
+
+						if (Editor.currentTheme == 'atlas')
 						{
-							elt.style.top = '2px';
+							elt.style.filter = 'invert(100%)';
+							elt.style.right = '11px';
+							elt.style.top = '10px';
 						}
 						else
 						{
-							elt.style.top = '0px';
-						}
-						
-						var icon = document.createElement('div');
-						icon.className = 'geToolbarButton';
-						icon.style.backgroundImage = 'url(' + Editor.globeImage + ')';
-						icon.style.backgroundPosition = 'center center';
-						icon.style.backgroundRepeat = 'no-repeat';
-						icon.style.backgroundSize = '100% 100%';
-						icon.style.filter = 'none';
-						icon.style.position = 'absolute';
-						icon.style.height = '100%';
-						icon.style.width = '100%';
-						icon.style.marginTop = (uiTheme == 'atlas') ? '8px' : '2px';
-						icon.style.marginLeft = '2px';
-						icon.style.zIndex = '1';
-						elt.appendChild(icon);
-
-						if (urlParams['live-ui'] != '1')
-						{
-							mxUtils.setOpacity(elt, 70);
+							elt.style.right = '14px';
+							elt.style.top = '5px';
 						}
 						
 						if (urlParams['winCtrls'] == '1')
 						{
 							elt.style.right = '95px';
-							elt.style.width = '19px';
-							elt.style.height = '19px';
 							elt.style.webkitAppRegion = 'no-drag';
 							icon.style.webkitAppRegion = 'no-drag';
 						}
-						
-						if (uiTheme == 'atlas')
-						{
-							elt.style.filter = 'invert(100%)';
-							elt.style.opacity = '0.85';
-						}
 
 						document.body.appendChild(elt);
 						menubar.langIcon = elt;
@@ -1315,13 +1297,17 @@
 						{
 							var updateThemeElement = mxUtils.bind(this, function()
 							{
-								icon.style.backgroundImage = 'url(\'' + ((Editor.isDarkMode() || uiTheme == 'atlas') ?
-									Editor.lightModeImage : Editor.darkModeImage) + '\')';
+								elt.style.backgroundImage = 'url(\'' + ((Editor.isDarkMode() || uiTheme == 'atlas') ?
+									Editor.darkModeImage : Editor.lightModeImage) + '\')';
 							});
 				
 							this.editorUi.addListener('darkModeChanged', updateThemeElement);
 							updateThemeElement();
 						}
+						else
+						{
+							mxUtils.setOpacity(elt, 40);
+						}
 
 						this.editorUi.switchThemeElt = elt;
 					}
@@ -1398,6 +1384,22 @@
 			editorUi.showDialog(dlg.container, 620, 460, true, true);
 			dlg.init();
 		});
+
+		// Adds outline option to zoom menu
+        var viewZoomMenu = this.get('viewZoom');
+		var viewZoomMenuFunct = viewZoomMenu.funct;
+		
+		viewZoomMenu.funct = mxUtils.bind(this, function(menu, parent)
+		{
+			viewZoomMenuFunct.apply(this, arguments);
+
+			var sketchTheme = Editor.currentTheme == 'sketch' || urlParams['sketch'] == '1';
+			
+			if (sketchTheme || uiTheme == 'min')
+			{
+				this.addMenuItems(menu, ['-', 'outline', 'fullscreen'], parent);
+			}
+		});
 		
 		var layoutMenu = this.get('layout');
 		var layoutMenuFunct = layoutMenu.funct;
@@ -2884,6 +2886,24 @@
 			}
 		}))).isEnabled = isGraphEnabled;
 
+		this.put('appearance', new Menu(mxUtils.bind(this, function(menu, parent)
+		{
+			if (Editor.isDarkMode() || (!mxClient.IS_IE && !mxClient.IS_IE11))
+			{
+				this.addMenuItems(menu, ['toggleDarkMode'], parent);
+			}
+			
+			var item = menu.addItem(mxResources.get('simple'), null, function()
+			{
+				editorUi.setCurrentTheme((Editor.currentTheme == 'sketch') ? '' : 'sketch');
+			}, parent);
+
+			if (Editor.currentTheme == 'sketch')
+			{
+				menu.addCheckmark(item, Editor.checkmarkImage);
+			}
+		})));
+
 		this.put('theme', new Menu(mxUtils.bind(this, function(menu, parent)
 		{
 			var theme = (urlParams['sketch'] == '1') ? 'sketch' : mxSettings.getUi();
@@ -2896,14 +2916,24 @@
 			
 			menu.addSeparator(parent);
 			
-			var item = menu.addItem(mxResources.get('default'), null, function()
+			var item = menu.addItem(mxResources.get('automatic'), null, function()
 			{
 				editorUi.setCurrentTheme('');
 			}, parent);
+			
+			if (theme != 'kennedy' && theme != 'atlas' &&
+				theme != 'dark' && theme != 'min' &&
+				theme != 'sketch')
+			{
+				menu.addCheckmark(item, Editor.checkmarkImage);
+			}
+			
+			item = menu.addItem(mxResources.get('default'), null, function()
+			{
+				editorUi.setCurrentTheme('kennedy');
+			}, parent);
 
-			if (theme == 'kennedy' || theme == 'dark' ||
-				(theme != 'atlas' && theme != 'min' &&
-				theme != 'sketch'))
+			if (theme == 'kennedy' || theme == 'dark')
 			{
 				menu.addCheckmark(item, Editor.checkmarkImage);
 			}
@@ -3320,7 +3350,39 @@
 						graph.getInsertPoint() : null);
 			}
 		}, null, null, 'C')).isEnabled = isGraphEnabled;
+
+		var toggleFormat = editorUi.actions.put('toggleFormat', new Action(mxResources.get('format'), function()
+        {
+			if (editorUi.formatWindow != null)
+			{
+				editorUi.formatWindow.window.setVisible(
+					!editorUi.formatWindow.window.isVisible());
+			}
+        }));
+
+		toggleFormat.shortcut = editorUi.actions.get('formatPanel').shortcut;
+		toggleFormat.setToggleAction(true);
+		toggleFormat.setSelectedCallback(mxUtils.bind(this, function()
+		{
+			return editorUi.formatWindow != null && editorUi.formatWindow.window.isVisible();
+		}));
 		
+		var toggleShapes = editorUi.actions.put('toggleShapes', new Action(mxResources.get('shapes'), function()
+        {
+			if (editorUi.sidebarWindow != null)
+			{
+				editorUi.sidebarWindow.window.setVisible(
+					!editorUi.sidebarWindow.window.isVisible());
+			}
+        }));
+
+		toggleShapes.shortcut = editorUi.actions.get('formatPanel').shortcut;
+		toggleShapes.setToggleAction(true);
+		toggleShapes.setSelectedCallback(mxUtils.bind(this, function()
+		{
+			return editorUi.sidebarWindow != null && editorUi.sidebarWindow.window.isVisible();
+		}));
+
 		editorUi.addInsertMenuItems = mxUtils.bind(this, function(menu, parent, methods)
 		{
 			for (var i = 0; i < methods.length; i++)
@@ -3338,18 +3400,49 @@
 		
 		this.put('insert', new Menu(mxUtils.bind(this, function(menu, parent)
 		{
-			this.addMenuItems(menu, ['insertRectangle', 'insertEllipse', 'insertRhombus',
-				'-', 'insertEdge', 'insertNote', '-', 'insertText', 'insertLink',
-				'-', 'createShape', 'insertFreehand', '-', 'insertImage'], parent);
+			// Compatiblity code for live UI switch and static UI
+			var sketchTheme = Editor.currentTheme == 'sketch' || urlParams['sketch'] == '1';
+			
+			if (sketchTheme)
+			{
+				editorUi.menus.addMenuItems(menu, ['toggleShapes'], parent);
+				editorUi.menus.addSubmenu('table', menu, parent);
+				menu.addSeparator(parent);
 
-			if (editorUi.insertTemplateEnabled && !editorUi.isOffline())
+				if (editorUi.insertTemplateEnabled && !editorUi.isOffline())
+				{
+					editorUi.menus.addMenuItems(menu, ['insertTemplate'], parent);
+				}
+				
+				editorUi.menus.addMenuItems(menu, ['insertImage', 'insertLink', '-'], parent);
+				editorUi.menus.addSubmenu('insertAdvanced', menu, parent, mxResources.get('advanced'));
+				editorUi.menus.addSubmenu('layout', menu, parent);
+			}
+			else
 			{
-				this.addMenuItems(menu, ['insertTemplate'], parent);
+				this.addMenuItems(menu, ['insertRectangle', 'insertEllipse', 'insertRhombus',
+					'-', 'insertEdge', 'insertNote', '-', 'insertText', 'insertLink',
+					'-', 'createShape', 'insertFreehand', '-', 'insertImage'], parent);
+
+				if (editorUi.insertTemplateEnabled && !editorUi.isOffline())
+				{
+					this.addMenuItems(menu, ['insertTemplate'], parent);
+				}
+				
+				menu.addSeparator(parent);
+				this.addSubmenu('insertLayout', menu, parent, mxResources.get('layout'));
+				this.addSubmenu('insertAdvanced', menu, parent, mxResources.get('advanced'));
+
+				if (uiTheme == 'min')
+				{
+					this.addSubmenu('table', menu, parent);
+				}
 			}
-			
-			menu.addSeparator(parent);
-			this.addSubmenu('insertLayout', menu, parent, mxResources.get('layout'));
-			this.addSubmenu('insertAdvanced', menu, parent, mxResources.get('advanced'));
+		})));
+
+        this.put('table', new Menu(mxUtils.bind(this, function(menu, parent)
+		{
+			editorUi.menus.addInsertTableCellItem(menu, parent);
 		})));
 
 		this.put('insertLayout', new Menu(mxUtils.bind(this, function(menu, parent)
@@ -3966,136 +4059,386 @@
 				dlg.init();
 			});
 		}
+		
+		var langMenu = this.get('language');
 
 		this.put('extras', new Menu(mxUtils.bind(this, function(menu, parent)
 		{
-			if (urlParams['embed'] != '1' || urlParams['lang'] == null)
+			// Compatiblity code for live UI switch and static UI
+			var sketchTheme = Editor.currentTheme == 'sketch' || urlParams['sketch'] == '1';
+			
+			if (sketchTheme || uiTheme == 'min')
 			{
-				this.addSubmenu('language', menu, parent);
+				if (langMenu != null && (urlParams['embed'] != '1' || urlParams['lang'] == null))
+				{
+					editorUi.menus.addSubmenu('language', menu, parent);
+				}
+				
+				if (urlParams['embed'] != '1' && urlParams['extAuth'] != '1' && editorUi.mode != App.MODE_ATLAS)
+				{
+					editorUi.menus.addSubmenu('theme', menu, parent);
+				}
+				
+				editorUi.menus.addSubmenu('units', menu, parent);
+				menu.addSeparator(parent);
+	
+				if (!sketchTheme)
+				{
+					editorUi.menus.addMenuItems(menu, ['scrollbars', '-', 'tooltips',
+						'copyConnect', 'collapseExpand'], parent);
+				}
+	
+				if (urlParams['embedInline'] != '1' && !sketchTheme && urlParams['embed'] != '1' &&
+					(isLocalStorage || mxClient.IS_CHROMEAPP) && editorUi.mode != App.MODE_ATLAS)
+				{
+					editorUi.menus.addMenuItems(menu, ['-', 'showStartScreen', 'search', 'scratchpad'], parent);
+				}
+	
+				menu.addSeparator(parent);
+				
+				if (sketchTheme)
+				{
+					editorUi.menus.addMenuItems(menu, ['copyConnect',
+						'collapseExpand', 'tooltips', '-'], parent);
+				}
+				
+				if (EditorUi.isElectronApp)
+				{
+					editorUi.menus.addMenuItems(menu, ['-',
+						'spellCheck', 'autoBkp',
+						'drafts', '-'], parent);
+				}
+	
+				var file = editorUi.getCurrentFile();
+				
+				if (file != null && file.isRealtimeEnabled() && file.isRealtimeSupported())
+				{
+					this.addMenuItems(menu, ['-', 'showRemoteCursors',
+						'shareCursor', '-'], parent);
+				}
+	
+				if (Graph.translateDiagram)
+				{
+					editorUi.menus.addMenuItems(menu, ['diagramLanguage'], parent);
+				}
+				
+				if (editorUi.mode != App.MODE_ATLAS) 
+				{
+					editorUi.menus.addMenuItem(menu, 'configuration', parent);
+				}
+	
+				if (!sketchTheme)
+				{
+					if (!editorUi.isOfflineApp() && isLocalStorage && editorUi.mode != App.MODE_ATLAS)
+					{
+						editorUi.menus.addMenuItem(menu, 'plugins', parent);
+					}
+				}
+				
+				// Adds trailing separator in case new plugin entries are added
+				menu.addSeparator(parent);
 			}
-			
-			if (urlParams['embed'] != '1')
+			else
 			{
-				this.addSubmenu('theme', menu, parent);
+				if (urlParams['embed'] != '1' || urlParams['lang'] == null)
+				{
+					this.addSubmenu('language', menu, parent);
+				}
+				
+				if (urlParams['embed'] != '1')
+				{
+					this.addSubmenu('theme', menu, parent);
+				}
+
+				menu.addSeparator(parent);
+
+				if (typeof(MathJax) !== 'undefined')
+				{
+					var item = this.addMenuItem(menu, 'mathematicalTypesetting', parent);
+					
+					if (!editorUi.isOffline() || mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
+					{
+						this.addLinkToItem(item, 'https://www.diagrams.net/doc/faq/math-typesetting');
+					}
+				}
+		
+				if (EditorUi.isElectronApp)
+				{
+					this.addMenuItems(menu, ['spellCheck', 'autoBkp', 'drafts'], parent);
+				}
+
+				this.addMenuItems(menu, ['copyConnect', 'collapseExpand', '-'], parent);
+				
+				if (urlParams['embed'] != '1')
+				{
+					var file = editorUi.getCurrentFile();
+
+					if (file != null && file.isRealtimeEnabled() && file.isRealtimeSupported())
+					{
+						this.addMenuItems(menu, ['showRemoteCursors',
+							'shareCursor'], parent);
+					}
+
+					this.addMenuItems(menu, ['autosave'], parent);
+				}
+
+				menu.addSeparator(parent);
+				
+				if (!editorUi.isOfflineApp() && isLocalStorage)
+				{
+					this.addMenuItem(menu, 'plugins', parent);
+				}
+
+				this.addMenuItems(menu, ['-', 'editDiagram'], parent);
+		
+				if (Graph.translateDiagram)
+				{
+					this.addMenuItems(menu, ['diagramLanguage']);
+				}
+				
+				menu.addSeparator(parent);
+
+				if (urlParams['embed'] != '1' && (isLocalStorage || mxClient.IS_CHROMEAPP))
+				{
+					this.addMenuItems(menu, ['showStartScreen'], parent);
+				}
+
+				this.addMenuItems(menu, ['configuration'], parent);
+				
+				// Adds trailing separator in case new plugin entries are added
+				menu.addSeparator(parent);
+				
+				if (urlParams['newTempDlg'] == '1')
+				{
+					editorUi.actions.addAction('templates', function()
+					{
+						function driveObjToTempDlg(item)
+						{
+							return {id: item.id, isExt: true, url: item.downloadUrl, title: item.title, imgUrl: item.thumbnailLink,
+									changedBy: item.lastModifyingUserName, lastModifiedOn: item.modifiedDate}
+						};
+						
+						var tempDlg = new TemplatesDialog(editorUi, function(xml){console.log(arguments)}, null,
+								null, null, 'user', function(callback, error, username)
+						{
+							var oneWeek = new Date();
+							oneWeek.setDate(oneWeek.getDate() - 7);
+							
+							editorUi.drive.listFiles(null, oneWeek, username? true : false, function(resp)
+							{
+								var results = [];
+								
+								for (var i = 0; i < resp.items.length; i++)
+								{
+									results.push(driveObjToTempDlg(resp.items[i]));
+								}
+								
+								callback(results);
+							}, error)
+						}, function(str, callback, error, username)
+						{
+							editorUi.drive.listFiles(str, null, username? true : false, function(resp)
+							{
+								var results = [];
+								
+								for (var i = 0; i < resp.items.length; i++)
+								{
+									results.push(driveObjToTempDlg(resp.items[i]));
+								}
+								
+								callback(results);
+							}, error)
+						}, function(obj, callback, error)
+						{
+							editorUi.drive.getFile(obj.id, function(file)
+							{
+								callback(file.data);
+							}, error);
+						}, null, function(callback)
+						{
+							callback({'Test': []}, 1);
+						}, true, false);
+						
+						editorUi.showDialog(tempDlg.container, window.innerWidth, window.innerHeight, true, false, null, false, true);
+					});
+					this.addMenuItem(menu, 'templates', parent);
+				}
 			}
+		})));
 
+		this.put('diagram', new Menu(mxUtils.bind(this, function(menu, parent)
+		{
+			var file = editorUi.getCurrentFile();
+			editorUi.menus.addSubmenu('extras', menu, parent, mxResources.get('preferences'));
 			menu.addSeparator(parent);
 
-			if (typeof(MathJax) !== 'undefined')
+			// Compatiblity code for live UI switch and static UI
+			var sketchTheme = Editor.currentTheme == 'sketch' || urlParams['sketch'] == '1';
+			
+			if (mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
 			{
-				var item = this.addMenuItem(menu, 'mathematicalTypesetting', parent);
+				editorUi.menus.addMenuItems(menu, ['new', 'open', '-', 'synchronize',
+					'-', 'save', 'saveAs', '-'], parent);
+			}
+			else if (urlParams['embed'] == '1' || editorUi.mode == App.MODE_ATLAS)
+			{
+				if (urlParams['noSaveBtn'] != '1' &&
+					urlParams['embedInline'] != '1')
+				{
+					editorUi.menus.addMenuItems(menu, ['-', 'save'], parent);
+				}
 				
-				if (!editorUi.isOffline() || mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
+				if (urlParams['saveAndExit'] == '1' || 
+					(urlParams['noSaveBtn'] == '1' &&
+					urlParams['saveAndExit'] != '0') || editorUi.mode == App.MODE_ATLAS)
 				{
-					this.addLinkToItem(item, 'https://www.diagrams.net/doc/faq/math-typesetting');
+					editorUi.menus.addMenuItems(menu, ['saveAndExit'], parent);
+					
+					if (file != null && file.isRevisionHistorySupported())
+					{
+						editorUi.menus.addMenuItems(menu, ['revisionHistory'], parent);
+					}
 				}
+				
+				menu.addSeparator(parent);
 			}
-	
-			if (EditorUi.isElectronApp)
+			else if (editorUi.mode == App.MODE_ATLAS)
 			{
-				this.addMenuItems(menu, ['spellCheck', 'autoBkp', 'drafts'], parent);
+				editorUi.menus.addMenuItems(menu, ['save', 'synchronize', '-'], parent);
 			}
-
-			this.addMenuItems(menu, ['copyConnect', 'collapseExpand', '-'], parent);
-			
-			if (urlParams['embed'] != '1')
+			else if (urlParams['noFileMenu'] != '1')
 			{
-				var file = editorUi.getCurrentFile();
-
-				if (file != null && file.isRealtimeEnabled() && file.isRealtimeSupported())
+				if (!sketchTheme)
 				{
-					this.addMenuItems(menu, ['showRemoteCursors',
-						'shareCursor'], parent);
+					editorUi.menus.addMenuItems(menu, ['new'], parent);
+					editorUi.menus.addSubmenu('openFrom', menu, parent);
+	
+					if (isLocalStorage)
+					{
+						this.addSubmenu('openRecent', menu, parent);
+					}
+				
+					menu.addSeparator(parent);
+	
+					if (file != null)
+					{		
+						if (file.constructor == DriveFile)
+						{
+							editorUi.menus.addMenuItems(menu, ['share'], parent);
+						}
+						
+						if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp &&
+							file.constructor != LocalFile)
+						{
+							editorUi.menus.addMenuItems(menu, ['synchronize'], parent);
+						}
+					}
+					
+					menu.addSeparator(parent);
+					editorUi.menus.addSubmenu('save', menu, parent);
+				}
+				else
+				{
+					editorUi.menus.addSubmenu('file', menu, parent);
 				}
-
-				this.addMenuItems(menu, ['autosave'], parent);
 			}
-
-			menu.addSeparator(parent);
 			
-			if (!editorUi.isOfflineApp() && isLocalStorage)
+			editorUi.menus.addSubmenu('exportAs', menu, parent);
+			
+			if (mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
 			{
-				this.addMenuItem(menu, 'plugins', parent);
+				editorUi.menus.addMenuItems(menu, ['import'], parent);
 			}
-
-			this.addMenuItems(menu, ['-', 'editDiagram'], parent);
+			else if (urlParams['noFileMenu'] != '1')
+			{
+				editorUi.menus.addSubmenu('importFrom', menu, parent);
+			}
+	
+			editorUi.menus.addMenuItems(menu, ['-',  'findReplace'], parent);
 	
-			if (Graph.translateDiagram)
+			if (editorUi.commentsSupported())
 			{
-				this.addMenuItems(menu, ['diagramLanguage']);
+				editorUi.menus.addMenuItems(menu, ['comments', '-'], parent);
 			}
-			
+	
+			editorUi.menus.addMenuItems(menu, ['toggleFormat', 'layers', 'tags', '-', 'pageSetup'], parent);
+	
+			// Cannot use print in standalone mode on iOS as we cannot open new windows
+			if (urlParams['noFileMenu'] != '1' && (!mxClient.IS_IOS || !navigator.standalone))
+			{
+				editorUi.menus.addMenuItems(menu, ['print'], parent);
+			}
+	
+			if (!sketchTheme)
+			{
+				if (file != null && editorUi.fileNode != null && urlParams['embedInline'] != '1')
+				{
+					var filename = (file.getTitle() != null) ?
+						file.getTitle() : editorUi.defaultFilename;
+					
+					if (!/(\.html)$/i.test(filename) &&
+						!/(\.svg)$/i.test(filename))
+					{
+						this.addMenuItems(menu, ['-', 'properties']);
+					}
+				}
+			}
+	
 			menu.addSeparator(parent);
-
-			if (urlParams['embed'] != '1' && (isLocalStorage || mxClient.IS_CHROMEAPP))
+			editorUi.menus.addSubmenu('help', menu, parent);
+	
+			if (urlParams['embed'] == '1' || editorUi.mode == App.MODE_ATLAS)
 			{
-				this.addMenuItems(menu, ['showStartScreen'], parent);
+				if (urlParams['noExitBtn'] != '1' || editorUi.mode == App.MODE_ATLAS)
+				{
+					editorUi.menus.addMenuItems(menu, ['-', 'exit'], parent);
+				}
+			}
+			else if (urlParams['noFileMenu'] != '1')
+			{
+				editorUi.menus.addMenuItems(menu, ['-', 'close']);
 			}
+		})));
 
-			this.addMenuItems(menu, ['configuration'], parent);
-			
-			// Adds trailing separator in case new plugin entries are added
-			menu.addSeparator(parent);
+		this.put('save', new Menu(mxUtils.bind(this, function(menu, parent)
+		{
+			var file = editorUi.getCurrentFile();
 			
-			if (urlParams['newTempDlg'] == '1')
+			if (file != null && file.constructor == DriveFile)
+			{
+				editorUi.menus.addMenuItems(menu, ['save', 'makeCopy', '-', 'rename', 'moveToFolder'], parent);
+			}
+			else
 			{
-				editorUi.actions.addAction('templates', function()
+				editorUi.menus.addMenuItems(menu, ['save', 'saveAs', '-', 'rename'], parent);
+				
+				if (editorUi.isOfflineApp())
 				{
-					function driveObjToTempDlg(item)
-					{
-						return {id: item.id, isExt: true, url: item.downloadUrl, title: item.title, imgUrl: item.thumbnailLink,
-								changedBy: item.lastModifyingUserName, lastModifiedOn: item.modifiedDate}
-					};
-					
-					var tempDlg = new TemplatesDialog(editorUi, function(xml){console.log(arguments)}, null,
-							null, null, 'user', function(callback, error, username)
-					{
-						var oneWeek = new Date();
-						oneWeek.setDate(oneWeek.getDate() - 7);
-						
-						editorUi.drive.listFiles(null, oneWeek, username? true : false, function(resp)
-						{
-							var results = [];
-							
-							for (var i = 0; i < resp.items.length; i++)
-							{
-								results.push(driveObjToTempDlg(resp.items[i]));
-							}
-							
-							callback(results);
-						}, error)
-					}, function(str, callback, error, username)
-					{
-						editorUi.drive.listFiles(str, null, username? true : false, function(resp)
-						{
-							var results = [];
-							
-							for (var i = 0; i < resp.items.length; i++)
-							{
-								results.push(driveObjToTempDlg(resp.items[i]));
-							}
-							
-							callback(results);
-						}, error)
-					}, function(obj, callback, error)
-					{
-						editorUi.drive.getFile(obj.id, function(file)
-						{
-							callback(file.data);
-						}, error);
-					}, null, function(callback)
+					if (navigator.onLine && urlParams['stealth'] != '1' && urlParams['lockdown'] != '1')
 					{
-						callback({'Test': []}, 1);
-					}, true, false);
-					
-					editorUi.showDialog(tempDlg.container, window.innerWidth, window.innerHeight, true, false, null, false, true);
-				});
-				this.addMenuItem(menu, 'templates', parent);
+						this.addMenuItems(menu, ['upload'], parent);
+					}
+				}
+				else
+				{
+					editorUi.menus.addMenuItems(menu, ['makeCopy'], parent);
+				}
+			}
+			
+			editorUi.menus.addMenuItems(menu, ['-', 'autosave'], parent);
+	
+			if (file != null && file.isRevisionHistorySupported())
+			{
+				editorUi.menus.addMenuItems(menu, ['-', 'revisionHistory'], parent);
 			}
 		})));
 
 		this.put('file', new Menu(mxUtils.bind(this, function(menu, parent)
 		{
+			// Compatiblity code for live UI switch and static UI
+			var minTheme = Editor.currentTheme == 'sketch' || uiTheme == 'min' ||
+				Editor.currentTheme == 'min';
+
 			if (urlParams['embed'] == '1')
 			{
 				this.addSubmenu('importFrom', menu, parent);
@@ -4141,6 +4484,83 @@
 					this.addMenuItems(menu, ['exit'], parent);
 				}
 			}
+			else if (minTheme)
+			{
+				var file = editorUi.getCurrentFile();
+				editorUi.menus.addMenuItems(menu, ['new'], parent);
+				editorUi.menus.addSubmenu('openFrom', menu, parent);
+
+				if (isLocalStorage)
+				{
+					this.addSubmenu('openRecent', menu, parent);
+				}
+				
+				menu.addSeparator(parent);
+
+				editorUi.menus.addMenuItems(menu, ['-', 'save'], parent);
+
+				if (file == null || file.constructor != DriveFile)
+				{
+					editorUi.menus.addMenuItems(menu, ['saveAs'], parent);
+				}
+
+				if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp &&
+					file != null && (file.constructor != LocalFile ||
+					file.fileHandle != null))
+				{
+					editorUi.menus.addMenuItems(menu, ['synchronize'], parent);
+				}
+
+				if (file != null && file.constructor == DriveFile)
+				{
+					editorUi.menus.addMenuItems(menu, ['-', 'rename', 'makeCopy',
+						'-', 'moveToFolder', 'openFolder'], parent);
+				}
+				else
+				{
+					editorUi.menus.addMenuItems(menu, ['-', 'rename'], parent);
+					
+					if (editorUi.isOfflineApp())
+					{
+						if (navigator.onLine && urlParams['stealth'] != '1' && urlParams['lockdown'] != '1')
+						{
+							this.addMenuItems(menu, ['upload'], parent);
+						}
+					}
+					else
+					{
+						editorUi.menus.addMenuItems(menu, ['makeCopy'], parent);
+					}
+				}
+
+				if (file != null && file.isRevisionHistorySupported())
+				{
+					editorUi.menus.addMenuItems(menu, ['-', 'revisionHistory'], parent);
+				}
+
+				if (file != null)
+				{
+					if (editorUi.fileNode != null && urlParams['embedInline'] != '1')
+					{
+						var filename = (file.getTitle() != null) ?
+							file.getTitle() : editorUi.defaultFilename;
+						
+						if ((file.constructor == DriveFile && file.sync != null &&
+							file.sync.isConnected()) || (!/(\.html)$/i.test(filename) &&
+							!/(\.svg)$/i.test(filename)))
+						{
+							this.addMenuItems(menu, ['properties'], parent);
+						}
+					}
+					
+					if (file.constructor == DriveFile)
+					{
+						editorUi.menus.addMenuItems(menu, ['share'], parent);
+					}
+				}
+
+				editorUi.menus.addMenuItems(menu, ['-', 'autosave'], parent);
+			}
 			else
 			{
 				var file = this.editorUi.getCurrentFile();

+ 17 - 499
src/main/webapp/js/diagramly/Minimal.js

@@ -403,7 +403,7 @@ EditorUi.initMinimalTheme = function()
 
 					var err = file.getRealtimeError();
 					var state = file.getRealtimeState();
-					title += ' (' + mxResources.get('realtimeCollaboration');
+					title += ' (' + mxResources.get('realtimeCollaboration') + ': ';
 
 					if (state == 1)
 					{
@@ -531,34 +531,7 @@ EditorUi.initMinimalTheme = function()
 			this.editor.fireEvent(new mxEventObject('statusChanged'));
 		}
 	};
-	
-	// Fixes sidebar tooltips (previews)
-	var sidebarGetTooltipOffset = Sidebar.prototype.getTooltipOffset;
-	
-	Sidebar.prototype.getTooltipOffset = function(elt, bounds)
-	{
-		if (this.editorUi.sidebarWindow == null ||
-			mxUtils.isAncestorNode(this.editorUi.picker, elt))
-		{
-			var off = mxUtils.getOffset(this.editorUi.picker);
-			
-			off.x += this.editorUi.picker.offsetWidth + 4;
-			off.y += elt.offsetTop - bounds.height / 2 + 16;
-			
-			return off;
-		}
-		else
-		{
-			var result = sidebarGetTooltipOffset.apply(this, arguments);
-			var off = mxUtils.getOffset(this.editorUi.sidebarWindow.window.div);
-			
-			result.x += off.x - 16;
-			result.y += off.y;
-	        
-			return result;
-		}
-	};
-    
+
     // Adds context menu items
     var menuCreatePopupMenu = Menus.prototype.createPopupMenu;
     
@@ -649,49 +622,7 @@ EditorUi.initMinimalTheme = function()
 	var editorUiDestroy = EditorUi.prototype.destroy;
 	EditorUi.prototype.destroy = function()
 	{
-        if (this.sidebarWindow != null)
-        {
-            this.sidebarWindow.window.setVisible(false);
-            this.sidebarWindow.window.destroy();
-            this.sidebarWindow = null;
-        }
-        
-        if (this.formatWindow != null)
-        {
-        	this.formatWindow.destroy();
-        	this.formatWindow = null;
-        }
-
-        if (this.actions.outlineWindow != null)
-        {
-        	this.actions.outlineWindow.destroy();
-        	this.actions.outlineWindow = null;
-        }
-
-        if (this.actions.layersWindow != null)
-        {
-        	this.actions.layersWindow.destroy();
-        	this.actions.layersWindow = null;
-        }
-
-        if (this.menus.tagsWindow != null)
-        {
-        	this.menus.tagsWindow.destroy();
-        	this.menus.tagsWindow = null;
-        }
-
-        if (this.menus.findWindow != null)
-        {
-        	this.menus.findWindow.destroy();
-        	this.menus.findWindow = null;
-        }
-
-        if (this.menus.findReplaceWindow != null)
-        {
-        	this.menus.findReplaceWindow.destroy();
-        	this.menus.findReplaceWindow = null;
-        }
-
+		this.destroyWindows();
 		editorUiDestroy.apply(this, arguments);
 	};
 	
@@ -809,247 +740,6 @@ EditorUi.initMinimalTheme = function()
 			this.addSubmenu('editCell', menu, parent, mxResources.get('edit'));
 		};
 
-		this.put('file', new Menu(mxUtils.bind(this, function(menu, parent)
-		{
-			var file = ui.getCurrentFile();
-			ui.menus.addMenuItems(menu, ['new'], parent);
-			ui.menus.addSubmenu('openFrom', menu, parent);
-
-			if (isLocalStorage)
-			{
-				this.addSubmenu('openRecent', menu, parent);
-			}
-			
-			menu.addSeparator(parent);
-
-			ui.menus.addMenuItems(menu, ['-', 'save'], parent);
-
-			if (file == null || file.constructor != DriveFile)
-			{
-				ui.menus.addMenuItems(menu, ['saveAs'], parent);
-			}
-
-			if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp &&
-				(file.constructor != LocalFile || file.fileHandle != null))
-			{
-				ui.menus.addMenuItems(menu, ['synchronize'], parent);
-			}
-
-			if (file != null && file.constructor == DriveFile)
-			{
-				ui.menus.addMenuItems(menu, ['-', 'rename', 'makeCopy',
-					'-', 'moveToFolder', 'openFolder'], parent);
-			}
-			else
-			{
-				ui.menus.addMenuItems(menu, ['-', 'rename'], parent);
-				
-				if (ui.isOfflineApp())
-				{
-					if (navigator.onLine && urlParams['stealth'] != '1' && urlParams['lockdown'] != '1')
-					{
-						this.addMenuItems(menu, ['upload'], parent);
-					}
-				}
-				else
-				{
-					ui.menus.addMenuItems(menu, ['makeCopy'], parent);
-				}
-			}
-
-			if (file != null && file.isRevisionHistorySupported())
-			{
-				ui.menus.addMenuItems(menu, ['-', 'revisionHistory'], parent);
-			}
-
-			if (file != null)
-			{
-				if (ui.fileNode != null && urlParams['embedInline'] != '1')
-				{
-					var filename = (file.getTitle() != null) ?
-						file.getTitle() : ui.defaultFilename;
-					
-					if ((file.constructor == DriveFile && file.sync != null &&
-						file.sync.isConnected()) || (!/(\.html)$/i.test(filename) &&
-						!/(\.svg)$/i.test(filename)))
-					{
-						this.addMenuItems(menu, ['properties'], parent);
-					}
-				}
-				
-				if (file.constructor == DriveFile)
-				{
-					ui.menus.addMenuItems(menu, ['share'], parent);
-				}
-			}
-
-			ui.menus.addMenuItems(menu, ['-', 'autosave'], parent);
-		})));
-
-        this.put('diagram', new Menu(mxUtils.bind(this, function(menu, parent)
-        {
-			var file = ui.getCurrentFile();
-        	ui.menus.addSubmenu('extras', menu, parent, mxResources.get('preferences'));
-			menu.addSeparator(parent);
-			
-			if (mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
-			{
-				ui.menus.addMenuItems(menu, ['new', 'open', '-', 'synchronize',
-					'-', 'save', 'saveAs', '-'], parent);
-			}
-			else if (urlParams['embed'] == '1' || ui.mode == App.MODE_ATLAS)
-			{
-				if (urlParams['noSaveBtn'] != '1' &&
-					urlParams['embedInline'] != '1')
-				{
-					ui.menus.addMenuItems(menu, ['-', 'save'], parent);
-				}
-				
-				if (urlParams['saveAndExit'] == '1' || 
-					(urlParams['noSaveBtn'] == '1' &&
-					urlParams['saveAndExit'] != '0') || ui.mode == App.MODE_ATLAS)
-				{
-					ui.menus.addMenuItems(menu, ['saveAndExit'], parent);
-					
-					if (file != null && file.isRevisionHistorySupported())
-					{
-						ui.menus.addMenuItems(menu, ['revisionHistory'], parent);
-					}
-				}
-				
-				menu.addSeparator(parent);
-			}
-			else if (ui.mode == App.MODE_ATLAS)
-			{
-				ui.menus.addMenuItems(menu, ['save', 'synchronize', '-'], parent);
-			}
-			else if (urlParams['noFileMenu'] != '1')
-			{
-				if (urlParams['sketch'] != '1')
-				{
-					ui.menus.addMenuItems(menu, ['new'], parent);
-					ui.menus.addSubmenu('openFrom', menu, parent);
-
-					if (isLocalStorage)
-					{
-						this.addSubmenu('openRecent', menu, parent);
-					}
-				
-					menu.addSeparator(parent);
-
-					if (file != null)
-					{		
-						if (file.constructor == DriveFile)
-						{
-							ui.menus.addMenuItems(menu, ['share'], parent);
-						}
-						
-						if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp &&
-							file.constructor != LocalFile)
-						{
-							ui.menus.addMenuItems(menu, ['synchronize'], parent);
-						}
-					}
-					
-					menu.addSeparator(parent);
-					ui.menus.addSubmenu('save', menu, parent);
-				}
-				else
-				{
-					ui.menus.addSubmenu('file', menu, parent);
-				}
-			}
-			
-			ui.menus.addSubmenu('exportAs', menu, parent);
-			
-			if (mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
-			{
-				ui.menus.addMenuItems(menu, ['import'], parent);
-			}
-			else if (urlParams['noFileMenu'] != '1')
-			{
-				ui.menus.addSubmenu('importFrom', menu, parent);
-			}
-
-			ui.menus.addMenuItems(menu, ['-',  'findReplace'], parent);
-
-			if (ui.commentsSupported())
-			{
-				ui.menus.addMenuItems(menu, ['comments', '-'], parent);
-			}
-
-			ui.menus.addMenuItems(menu, ['toggleFormat', 'layers', 'tags', '-', 'pageSetup'], parent);
-
-			// Cannot use print in standalone mode on iOS as we cannot open new windows
-			if (urlParams['noFileMenu'] != '1' && (!mxClient.IS_IOS || !navigator.standalone))
-			{
-				ui.menus.addMenuItems(menu, ['print'], parent);
-			}
-
-			if (urlParams['sketch'] != '1')
-			{
-				if (file != null && ui.fileNode != null && urlParams['embedInline'] != '1')
-				{
-					var filename = (file.getTitle() != null) ?
-						file.getTitle() : ui.defaultFilename;
-					
-					if (!/(\.html)$/i.test(filename) &&
-						!/(\.svg)$/i.test(filename))
-					{
-						this.addMenuItems(menu, ['-', 'properties']);
-					}
-				}
-			}
-
-			menu.addSeparator(parent);
-			ui.menus.addSubmenu('help', menu, parent);
-
-            if (urlParams['embed'] == '1' || ui.mode == App.MODE_ATLAS)
-			{
-				if (urlParams['noExitBtn'] != '1' || ui.mode == App.MODE_ATLAS)
-				{
-					ui.menus.addMenuItems(menu, ['-', 'exit'], parent);
-				}
-			}
-			else if (urlParams['noFileMenu'] != '1')
-			{
-				ui.menus.addMenuItems(menu, ['-', 'close']);
-			}
-        })));
-
-		this.put('save', new Menu(mxUtils.bind(this, function(menu, parent)
-        {
-			var file = ui.getCurrentFile();
-			
-			if (file != null && file.constructor == DriveFile)
-			{
-				ui.menus.addMenuItems(menu, ['save', 'makeCopy', '-', 'rename', 'moveToFolder'], parent);
-			}
-			else
-			{
-				ui.menus.addMenuItems(menu, ['save', 'saveAs', '-', 'rename'], parent);
-				
-				if (ui.isOfflineApp())
-				{
-					if (navigator.onLine && urlParams['stealth'] != '1' && urlParams['lockdown'] != '1')
-					{
-						this.addMenuItems(menu, ['upload'], parent);
-					}
-				}
-				else
-				{
-					ui.menus.addMenuItems(menu, ['makeCopy'], parent);
-				}
-			}
-			
-			ui.menus.addMenuItems(menu, ['-', 'autosave'], parent);
-
-			if (file != null && file.isRevisionHistorySupported())
-			{
-				ui.menus.addMenuItems(menu, ['-', 'revisionHistory'], parent);
-			}
-        })));
-        
         // Augments the existing export menu
         var exportAsMenu = this.get('exportAs');
         
@@ -1071,13 +761,6 @@ EditorUi.initMinimalTheme = function()
     		}
         })));
 
-        var langMenu = this.get('language');
-        
-        this.put('table', new Menu(mxUtils.bind(this, function(menu, parent)
-		{
-			ui.menus.addInsertTableCellItem(menu, parent);
-		})));
-
 		var unitsMenu = this.get('units');
 		
 		this.put('units', new Menu(mxUtils.bind(this, function(menu, parent)
@@ -1086,109 +769,6 @@ EditorUi.initMinimalTheme = function()
 			this.addMenuItems(menu, ['-', 'ruler', '-', 'pageScale'], parent);
 		})));
 		
-        // Extras menu is labelled preferences but keeps ID for extensions
-        this.put('extras', new Menu(mxUtils.bind(this, function(menu, parent)
-        {
-			if (langMenu != null && (urlParams['embed'] != '1' || urlParams['lang'] == null))
-			{
-				ui.menus.addSubmenu('language', menu, parent);
-			}
-			
-			if (urlParams['embed'] != '1' && urlParams['extAuth'] != '1' && ui.mode != App.MODE_ATLAS)
-			{
-				ui.menus.addSubmenu('theme', menu, parent);
-			}
-			
-			ui.menus.addSubmenu('units', menu, parent);
-			menu.addSeparator(parent);
-
-			if (urlParams['sketch'] != '1')
-			{
-				ui.menus.addMenuItems(menu, ['scrollbars', '-', 'tooltips',
-					'copyConnect', 'collapseExpand'], parent);
-			}
-
-			if (urlParams['embedInline'] != '1' && urlParams['sketch'] != '1' && urlParams['embed'] != '1' &&
-				(isLocalStorage || mxClient.IS_CHROMEAPP) && ui.mode != App.MODE_ATLAS)
-			{
-				ui.menus.addMenuItems(menu, ['-', 'showStartScreen', 'search', 'scratchpad'], parent);
-			}
-
-			menu.addSeparator(parent);
-			
-			if (urlParams['sketch'] == '1')
-			{
-				ui.menus.addMenuItems(menu, ['copyConnect',
-					'collapseExpand', 'tooltips', '-'], parent);
-			}
-			
-			if (EditorUi.isElectronApp)
-			{
-				ui.menus.addMenuItems(menu, ['-',
-					'spellCheck', 'autoBkp',
-					'drafts', '-'], parent);
-			}
-
-			var file = ui.getCurrentFile();
-			
-			if (file != null && file.isRealtimeEnabled() && file.isRealtimeSupported())
-			{
-				this.addMenuItems(menu, ['-', 'showRemoteCursors',
-					'shareCursor', '-'], parent);
-			}
-
-			if (Graph.translateDiagram)
-			{
-				ui.menus.addMenuItems(menu, ['diagramLanguage'], parent);
-			}
-			
-			if (ui.mode != App.MODE_ATLAS) 
-			{
-				ui.menus.addMenuItem(menu, 'configuration', parent);
-			}
-
-			if (urlParams['sketch'] != '1')
-			{
-				if (!ui.isOfflineApp() && isLocalStorage && ui.mode != App.MODE_ATLAS)
-				{
-					ui.menus.addMenuItem(menu, 'plugins', parent);
-				}
-			}
-			
-			// Adds trailing separator in case new plugin entries are added
-			menu.addSeparator(parent);
-		})));
-
-		(mxUtils.bind(this, function()
-		{
-			var insertMenu = this.get('insert');
-			var insertMenuFunct = insertMenu.funct;
-			
-			insertMenu.funct = function(menu, parent)
-			{
-				if (urlParams['sketch'] == '1')
-				{
-					ui.menus.addMenuItems(menu, ['toggleShapes'], parent);
-					ui.menus.addSubmenu('table', menu, parent);
-					menu.addSeparator(parent);
-
-					if (ui.insertTemplateEnabled && !ui.isOffline())
-					{
-						ui.menus.addMenuItems(menu, ['insertTemplate'], parent);
-					}
-					
-					ui.menus.addMenuItems(menu, ['insertImage', 'insertLink', '-'], parent);
-					ui.menus.addSubmenu('insertAdvanced', menu, parent, mxResources.get('advanced'));
-					ui.menus.addSubmenu('layout', menu, parent);
-				}
-				else
-				{
-					insertMenuFunct.apply(this, arguments);
-					ui.menus.addSubmenu('table', menu, parent);
-				}
-			};
-        }))();
-		
         var methods = ['horizontalFlow', 'verticalFlow', '-', 'horizontalTree', 'verticalTree',
                        'radialTree', '-', 'organic', 'circle'];
 
@@ -1670,16 +1250,6 @@ EditorUi.initMinimalTheme = function()
 			previousParent.appendChild(ui.titlebar);
 		}
 		
-		// Adds outline option to zoom menu
-        var viewZoomMenu = ui.menus.get('viewZoom');
-		var viewZoomMenuFunct = viewZoomMenu.funct;
-		
-		viewZoomMenu.funct = function(menu, parent)
-		{
-			viewZoomMenuFunct.apply(this, arguments);
-			ui.menus.addMenuItems(menu, ['-', 'outline', 'fullscreen'], parent);
-		};
-		
 		var insertImage = (urlParams['sketch'] != '1') ? Editor.plusImage : Editor.shapesImage;
 		var footer = (urlParams['sketch'] == '1') ? document.createElement('div') : null;
 		var picker = (urlParams['sketch'] == '1') ? document.createElement('div') : null;
@@ -1847,6 +1417,10 @@ EditorUi.initMinimalTheme = function()
 			menubar.className = 'geToolbarContainer';
 			
 			ui.picker = picker;
+
+			// Passing to code in Sidebar for live UI
+			ui.sketchPickerMenuElt = picker;
+
 			var statusVisible = false;
 			
 			if (urlParams['embed'] != '1' && ui.getServiceName() != 'atlassian')
@@ -1880,31 +1454,6 @@ EditorUi.initMinimalTheme = function()
 				}
 			});
 
-			if (urlParams['embed'] != '1' && urlParams['live-ui'] == '1')
-			{
-				var themeElt = addMenu('theme', null, Editor.darkModeImage);
-
-				if (themeElt != null)
-				{
-					themeElt.style.position = 'relative';
-					themeElt.style.backgroundPosition = 'top center';
-					themeElt.style.backgroundSize = '22px 22px';
-					themeElt.style.width = '24px';
-					themeElt.style.height = '28px';
-					themeElt.style.top = '4px';
-					menubar.appendChild(themeElt);
-
-					var updateThemeElement = mxUtils.bind(this, function()
-					{
-						themeElt.style.backgroundImage = 'url(\'' + ((Editor.isDarkMode()) ?
-							Editor.lightModeImage : Editor.darkModeImage) + '\')';
-					});
-		
-					ui.addListener('darkModeChanged', updateThemeElement);
-					updateThemeElement();
-				}
-			}
-			
 			// Connects the status bar to the editor status and moves
 			// status to bell icon title for frequent common messages
 			menubar.style.visibility = (menubar.clientWidth < 20) ? 'hidden' : '';
@@ -2169,6 +1718,8 @@ EditorUi.initMinimalTheme = function()
 			}));
 		}
 
+        var viewZoomMenu = ui.menus.get('viewZoom');
+
 		if (viewZoomMenu != null)
 		{
 			var fitFunction = function(evt)
@@ -2200,12 +1751,12 @@ EditorUi.initMinimalTheme = function()
 			{
 				var deleteAction = ui.actions.get('delete');
 				var deleteElt = addMenuItem('', deleteAction.funct, null, mxResources.get('delete'), deleteAction, Editor.trashImage);
-				deleteElt.style.opacity = '0.1';
+				deleteElt.style.opacity = '0.3';
 	        	toolbar.appendChild(deleteElt);
 
 				deleteAction.addListener('stateChanged', function()
 				{
-					deleteElt.style.opacity = (deleteAction.enabled) ? '' : '0.1';
+					deleteElt.style.opacity = (deleteAction.enabled) ? '' : '0.3';
 				});
 				
 				var undoListener = function()
@@ -2214,8 +1765,8 @@ EditorUi.initMinimalTheme = function()
 						graph.isEditing()) ? 'inline-block' : 'none';
 					redoElt.style.display = undoElt.style.display;
 					
-					undoElt.style.opacity = (undoAction.enabled) ? '' : '0.1';
-					redoElt.style.opacity = (redoAction.enabled) ? '' : '0.1';
+					undoElt.style.opacity = (undoAction.enabled) ? '' : '0.3';
+					redoElt.style.opacity = (redoAction.enabled) ? '' : '0.3';
 				};
 				
 				toolbar.appendChild(undoElt);
@@ -2226,26 +1777,8 @@ EditorUi.initMinimalTheme = function()
 				undoListener();
 				
 				var pageMenu = this.createPageMenuTab(false, true);
-				pageMenu.style.display = 'none';
-				pageMenu.style.position = '';
-				pageMenu.style.marginLeft = '';
-				pageMenu.style.top = '';
-				pageMenu.style.left = '';
-				pageMenu.style.height = '100%';
-				pageMenu.style.lineHeight = '';
-				pageMenu.style.borderStyle = 'none';
-				pageMenu.style.padding = '3px 0';
-				pageMenu.style.margin = '0px';
-				pageMenu.style.background = '';
-				pageMenu.style.border = '';
-				pageMenu.style.boxShadow = 'none';
-				pageMenu.style.verticalAlign = 'top';
-				pageMenu.style.width = 'auto';
-				pageMenu.style.maxWidth = '160px';
-				pageMenu.style.position = 'relative';
-				pageMenu.style.padding = '6px';
-				pageMenu.style.textOverflow = 'ellipsis';
-				pageMenu.style.opacity = '0.8';
+				pageMenu.style.cssText = 'display:inline-block;white-space:nowrap;overflow:hidden;' +
+					'padding:6px;cursor:pointer;max-width:160px;text-overflow:ellipsis;';
 				footer.appendChild(pageMenu);
 
 				function updatePageName()
@@ -2302,7 +1835,6 @@ EditorUi.initMinimalTheme = function()
 				elt.style.padding = '6px 0';
 				elt.style.fontSize = '14px';
 				elt.style.width = '40px';
-				elt.style.opacity = '0.4';
 				footer.appendChild(elt);
 				
 				var zoomInElt = addMenuItem('', zoomInAction.funct, true, mxResources.get('zoomIn') +
@@ -2522,8 +2054,7 @@ EditorUi.initMinimalTheme = function()
 				}), null, null);
 			}
 	        
-			var langMenu = ui.menus.get((urlParams['live-ui'] == '1') ?
-				'theme' : 'language');
+			var langMenu = ui.menus.get('language');
 
 			if (langMenu != null && !mxClient.IS_CHROMEAPP &&
 				!EditorUi.isElectronApp && iw >= 600 &&
@@ -2533,8 +2064,7 @@ EditorUi.initMinimalTheme = function()
 				if (langMenuElt == null)
 				{
 					var elt = menuObj.addMenu('', langMenu.funct);
-					elt.setAttribute('title', mxResources.get((urlParams['live-ui'] == '1') ?
-						'preferences' : 'language'));
+					elt.setAttribute('title', 'language');
 					elt.className = 'geToolbarButton';
 					elt.style.backgroundImage = 'url(' + Editor.globeImage + ')';
 					elt.style.backgroundPosition = 'center center';
@@ -2549,18 +2079,6 @@ EditorUi.initMinimalTheme = function()
 					elt.style.top = '12px';
 					menubar.appendChild(elt);
 					langMenuElt = elt;
-
-					if (urlParams['live-ui'] == '1')
-					{
-						var updateThemeElement = mxUtils.bind(this, function()
-						{
-							elt.style.backgroundImage = 'url(\'' + ((Editor.isDarkMode()) ?
-								Editor.lightModeImage : Editor.darkModeImage) + '\')';
-						});
-			
-						ui.addListener('darkModeChanged', updateThemeElement);
-						updateThemeElement();
-					}
 				}
 				
 				ui.buttonContainer.style.paddingRight = '34px';

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

@@ -28,7 +28,7 @@ function mxFreehand(graph)
 	var openFill = true;
 	var buffer = []; // Contains the last positions of the mouse cursor
 	var enabled = false;
-	var stopClickEnabled = true;
+	var stopClickEnabled = false;
 	var selectInserted = false;
 	var perfectFreehandOptions = {
 		size: 5,
@@ -139,7 +139,7 @@ function mxFreehand(graph)
 	    	// Click stops drawing
 	    	var doStop = stopClickEnabled && drawPoints.length > 0 &&
 	    		lastPart != null && lastPart.length < 2;
-	    	
+			
 			if (!doStop)
 			{
 				drawPoints.push.apply(drawPoints, lastPart);
@@ -155,7 +155,7 @@ function mxFreehand(graph)
 				this.stopDrawing();
 			}
 			
-			if (autoInsert && lastLength >= 2)
+			if (autoInsert && (!doStop || lastLength >= 2))
 			{
 				this.startDrawing();
 			}

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

@@ -1417,7 +1417,41 @@
 		
 		sidebarSearchEntries.apply(this, arguments);
 	};
-
+	
+	// Fixes sidebar tooltips (previews)
+	var sidebarGetTooltipOffset = Sidebar.prototype.getTooltipOffset;
+	
+	Sidebar.prototype.getTooltipOffset = function(elt, bounds)
+	{
+		if (Editor.currentTheme == 'sketch' || uiTheme == 'min')
+		{
+			if (this.editorUi.sidebarWindow == null ||
+				mxUtils.isAncestorNode(this.editorUi.sketchPickerMenuElt, elt))
+			{
+				var off = mxUtils.getOffset(this.editorUi.sketchPickerMenuElt);
+				
+				off.x += this.editorUi.sketchPickerMenuElt.offsetWidth + 4;
+				off.y += elt.offsetTop - bounds.height / 2 + 16;
+				
+				return off;
+			}
+			else
+			{
+				var result = sidebarGetTooltipOffset.apply(this, arguments);
+				var off = mxUtils.getOffset(this.editorUi.sidebarWindow.window.div);
+				
+				result.x += off.x - 16;
+				result.y += off.y;
+				
+				return result;
+			}
+		}
+		else
+		{
+			return sidebarGetTooltipOffset.apply(this, arguments);
+		}
+	};
+    
 	/**
 	 * Adds a click handler for inserting the cell as target for dangling edge.
 	 */

+ 1 - 1
src/main/webapp/js/embed.dev.js

@@ -77,7 +77,7 @@
 				{
 					load: [(urlParams['math-output'] == 'html') ?
 						'output/chtml' : 'output/svg', 'input/tex',
-						'input/asciimath']
+						'input/asciimath', 'ui/safe']
 				},
 				startup:
 				{

+ 10 - 7
src/main/webapp/js/grapheditor/Actions.js

@@ -874,14 +874,17 @@ Actions.prototype.init = function()
 				for (var i = 0; i < cells.length; i++)
 				{
 					var cell = cells[i];
-					
-					if (graph.getModel().getChildCount(cell) > 0)
-					{
-						graph.updateGroupBounds([cell], 0, true);
-					}
-					else
+
+					if (graph.getModel().isVertex(cell))
 					{
-						graph.updateCellSize(cell);
+						if (graph.getModel().getChildCount(cell) > 0)
+						{
+							graph.updateGroupBounds([cell], 0, true);
+						}
+						else
+						{
+							graph.updateCellSize(cell);
+						}
 					}
 				}
 			}

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

@@ -4234,7 +4234,7 @@ EditorUi.prototype.updateActionStates = function()
 	this.actions.get('sendBackward').setEnabled(ss.cells.length == 1);
 	this.actions.get('rotation').setEnabled(ss.vertices.length == 1);
 	this.actions.get('wordWrap').setEnabled(ss.vertices.length == 1);
-	this.actions.get('autosize').setEnabled(ss.vertices.length == 1);
+	this.actions.get('autosize').setEnabled(ss.vertices.length > 0);
 	this.actions.get('copySize').setEnabled(ss.vertices.length == 1);
 	this.actions.get('clearWaypoints').setEnabled(ss.connections);
 	this.actions.get('curved').setEnabled(ss.edges.length > 0);
@@ -4296,6 +4296,17 @@ EditorUi.prototype.getDiagramContainerOffset = function()
  */
 EditorUi.prototype.refresh = function(sizeDidChange)
 {
+	if (this.formatContainer != null && this.formatContainer.parentNode != null &&
+		this.formatContainer.parentNode.className != 'geEditor')
+	{
+		this.diagramContainer.style.left = '0';
+		this.diagramContainer.style.top = '0';
+		this.diagramContainer.style.right = '0';
+		this.diagramContainer.style.bottom = '0';
+
+		return;
+	}
+
 	sizeDidChange = (sizeDidChange != null) ? sizeDidChange : true;
 	
 	var w = this.container.clientWidth;

+ 2 - 2
src/main/webapp/js/grapheditor/Menus.js

@@ -49,7 +49,7 @@ Menus.prototype.init = function()
 
 	this.customFonts = [];
 	this.customFontSizes = [];
-
+	
 	this.put('fontFamily', new Menu(mxUtils.bind(this, function(menu, parent)
 	{
 		var addItem = mxUtils.bind(this, function(fontFamily)
@@ -604,7 +604,7 @@ Menus.prototype.addMenu = function(name, popupMenu, parent)
 	
 	if (menu != null && (popupMenu.showDisabled || menu.isEnabled()))
 	{
-		this.get(name).execute(popupMenu, parent);
+		menu.execute(popupMenu, parent);
 	}
 };
 

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1885 - 1854
src/main/webapp/js/integrate.min.js


+ 1 - 1
src/main/webapp/js/math-print.js

@@ -10,7 +10,7 @@
 		{
 			load: [(window.opener.urlParams['math-output'] == 'html') ?
 				'output/chtml' : 'output/svg', 'input/tex',
-				'input/asciimath']
+				'input/asciimath', 'ui/safe']
 		},
 		startup:
 		{

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1486 - 1475
src/main/webapp/js/viewer-static.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1486 - 1475
src/main/webapp/js/viewer.min.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
src/main/webapp/mxgraph/mxClient.js


+ 1 - 1
src/main/webapp/resources/dia_de.txt

@@ -735,7 +735,7 @@ templates=Vorlagen
 text=Text
 textAlignment=Text Ausrichtung
 textOpacity=Text Deckkraft
-theme=Thema
+theme=Darstellung
 timeout=Zeitüberschreitung
 title=Titel
 to=bis

+ 23 - 23
src/main/webapp/resources/dia_fr.txt

@@ -67,7 +67,7 @@ blockquote=Bloc de citation
 blog=Blogue
 bold=Gras
 bootstrap=Bootstrap
-border=Border
+border=Bordure
 borderColor=Couleur de la bordure
 borderWidth=Largeur de la bordure
 bottom=En bas
@@ -75,7 +75,7 @@ bottomAlign=Aligner en bas
 bottomLeft=Aligner en bas à gauche
 bottomRight=Aligner en bas à droite
 bpmn=BPMN
-bringForward=Bring Forward
+bringForward=Faire avancer
 browser=Navigateur
 bulletedList=Liste à puces
 business=Entreprise
@@ -126,7 +126,7 @@ clearWaypoints=Effacer les repères
 clipart=Clipart
 close=Fermer
 closingFile=Fermeture du fichier
-realtimeCollaboration=Real-Time Collaboration
+realtimeCollaboration=Collaboration en temps réel
 collaborator=Collaborateur
 collaborators=Collaborateurs
 collapse=Réduire
@@ -150,7 +150,7 @@ copiedToClipboard=Copié au presse-papier
 copy=Copier
 copyConnect=Copier à la connexion
 copyCreated=Une copie du fichier a été créée.
-copyData=Copy Data
+copyData=Copie des données
 copyOf=Copie de {1}
 copyOfDrawing=Copie d'un dessin
 copySize=Copie de la taille
@@ -304,7 +304,7 @@ filetypeSvg=.svg causes file to save as SVG with embedded data
 fileWillBeSavedInAppFolder={1} sera enregistré dans le dossier de l'application.
 fill=Remplir
 fillColor=Couleur de remplissage
-filterCards=Filter Cards
+filterCards=Cartes de filtre
 find=Chercher
 fit=Ajuster
 fitContainer=Redimensionner le conteneur
@@ -354,7 +354,7 @@ fullscreen=Plein écran
 gap=Espace
 gcp=GCP
 general=Général
-getNotionChromeExtension=Get the Notion Chrome Extension
+getNotionChromeExtension=Obtenir l'extension Notion pour Chrome
 github=GitHub
 gitlab=GitLab
 gliffy=Gliffy
@@ -677,7 +677,7 @@ selectFont=Sélectionner une police
 selectNone=Tout désélectionner
 selectTemplate=Choisir un modèle
 selectVertices=Sélectionner des sommets
-sendBackward=Send Backward
+sendBackward=Envoyer en arrière
 sendMessage=Envoyer
 sendYourFeedback=Envoyer votre commentaire
 serviceUnavailableOrBlocked=Le service est indisponible ou bloqué
@@ -693,7 +693,7 @@ shareLink=Lien pour l'édition partagée
 sharingAvailable=Sharing available for Google Drive and OneDrive files.
 sharp=Dur
 show=Montrer
-showRemoteCursors=Show Remote Mouse Cursors
+showRemoteCursors=Afficher les curseurs de la souris distante
 showStartScreen=Montrer écran de démarrage
 sidebarTooltip=Cliquer pour agrandir. Glisser et déposer les formes sur le diagramme. Maj+clic pour changer la sélection. Alt+clic pour insérer et connecter.
 signs=Signes
@@ -728,7 +728,7 @@ sysml=SysML
 tags=Tags
 table=Tableau
 tables=Tables
-takeOver=Take Over
+takeOver=Prendre le contrôle
 targetSpacing=Espacement de la cible
 template=Modèle
 templates=Modèles
@@ -775,7 +775,7 @@ updatingSelection=Mise à jour de la sélection. Veuillez patienter...
 upload=Télécharger
 url=URL
 useOffline=Utiliser hors-ligne
-useRootFolder=Use root folder?
+useRootFolder=Utiliser le dossier racine ?
 userManual=Manuel d'utilisation
 vertical=Vertical
 verticalFlow=Flux vertical
@@ -814,8 +814,8 @@ webLink=Hyperlien
 wireframes=Maquettes conceptuelles
 property=Propriétés
 value=Valeur
-showMore=Show More
-showLess=Show Less
+showMore=Afficher plus
+showLess=Afficher moins
 myDiagrams=My Diagrams
 allDiagrams=All Diagrams
 recentlyUsed=Recently used
@@ -860,7 +860,7 @@ selectSiblings=Sélectionner les co-latéraux
 selectParent=Sélectionner le parent
 selectDescendants=Sélectionner les descendants
 lastSaved=Last saved {1} ago
-resolve=Resolve
+resolve=Résoudre
 reopen=Ré-ouvrir
 showResolved=Show Resolved
 reply=Reply
@@ -965,10 +965,10 @@ 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 occurred!
-savedSucc=Saved successfully
+confAErrOccured=Une erreur est survenue !
+savedSucc=Sauvegardé avec succès
 confASaveFailedErr=Saving Failed (Unexpected Error)
-character=Character
+character=Caractère
 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
@@ -1067,7 +1067,7 @@ confAReimportStarted=Re-import {1} diagrams started...
 spaceFilter=Filter by spaces
 curViewState=Current Viewer State
 pageLayers=Page and Layers
-customize=Customize
+customize=Personnaliser
 firstPage=First Page (All Layers)
 curEditorState=Current Editor State
 noAnchorsFound=No anchors found
@@ -1075,13 +1075,13 @@ attachment=Attachment
 curDiagram=Current Diagram
 recentDiags=Recent Diagrams
 csvImport=CSV Import
-chooseFile=Choose a file...
-choose=Choose
+chooseFile=Choisir un fichier...
+choose=Choisir
 gdriveFname=Google Drive filename
 widthOfViewer=Width of the viewer (px)
 heightOfViewer=Height of the viewer (px)
 autoSetViewerSize=Automatically set the size of the viewer
-thumbnail=Thumbnail
+thumbnail=Miniature
 prevInDraw=Preview in draw.io
 onedriveFname=OneDrive filename
 diagFname=Diagram filename
@@ -1109,7 +1109,7 @@ errGAuthWinBlocked=Error: Google Authentication window blocked
 authDrawAccess=Authorize draw.io to access {1}
 connTimeout=The connection has timed out
 errAuthSrvc=Error authenticating to {1}
-plsSelectFile=Please select a file
+plsSelectFile=Veuillez sélectionner un fichier
 mustBgtZ={1} must be greater than zero
 cantLoadPrev=Cannot load file preview.
 errAccessFile=Error: Access Denied. You do not have permission to access "{1}".
@@ -1144,7 +1144,7 @@ notifications=Notifications
 drawioImp=draw.io Import
 confALibsImp=Importing draw.io Libraries
 confALibsImpFailed=Importing {1} library failed
-contributors=Contributors
+contributors=Contributeurs
 drawDiagrams=draw.io Diagrams
 errFileNotFoundOrNoPer=Error: Access Denied. File not found or you do not have permission to access "{1}" on {2}.
 confACheckPagesWEmbed=Checking pages having embedded draw.io diagrams.
@@ -1182,7 +1182,7 @@ confPartialPageList=We couldn't fetch all pages due to an error in Confluence. C
 spellCheck=Spell checker
 noChange=No Change
 lblToSvg=Convert labels to SVG
-txtSettings=Text Settings
+txtSettings=Paramètres du texte
 LinksLost=Links will be lost
 arcSize=Arc Size
 editConnectionPoints=Edit Connection Points

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
src/main/webapp/service-worker.js


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 1
src/main/webapp/service-worker.js.map


+ 1 - 1
src/main/webapp/styles/grapheditor.css

@@ -289,7 +289,7 @@
 	opacity: 0.6;
 }
 .geToolbarButton:active {
-	opacity: 0.2;
+	opacity: 0.2 !important;
 }
 .mxDisabled:hover {
 	background:inherit !important;