11.0.0 release

This commit is contained in:
Gaudenz Alder 2019-07-19 10:51:19 +02:00
parent 1ef0322a77
commit bff06f60f4
85 changed files with 4993 additions and 2704 deletions

View file

@ -1,3 +1,10 @@
19-JUL-2019: 11.0.0
- Adds Show more option in splash screen
- Adds uncompressed XML support (beta)
- Adds support for GitLab (beta)
- Uses mxGraph 4.0.3 beta 1
16-JUL-2019: 10.9.8
- Adds Extras, Insert, Freehand

View file

@ -1 +1 @@
10.9.8
11.0.0

View file

@ -359,6 +359,9 @@
<file name="TrelloFile.js" />
<file name="TrelloLibrary.js" />
<file name="TrelloClient.js" />
<file name="GitLabFile.js" />
<file name="GitLabLibrary.js" />
<file name="GitLabClient.js" />
<file name="DrawioComment.js" />
<file name="DriveComment.js" />
</sources>

View file

@ -1,4 +1,4 @@
var mxClient={VERSION:"4.0.2",IS_IE:0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&
var mxClient={VERSION:"4.0.3",IS_IE:0<=navigator.userAgent.indexOf("MSIE"),IS_IE6:0<=navigator.userAgent.indexOf("MSIE 6"),IS_IE11:!!navigator.userAgent.match(/Trident\/7\./),IS_EDGE:!!navigator.userAgent.match(/Edge\//),IS_QUIRKS:0<=navigator.userAgent.indexOf("MSIE")&&(null==document.documentMode||5==document.documentMode),IS_EM:"spellcheck"in document.createElement("textarea")&&8==document.documentMode,VML_PREFIX:"v",OFFICE_PREFIX:"o",IS_NS:0<=navigator.userAgent.indexOf("Mozilla/")&&0>navigator.userAgent.indexOf("MSIE")&&
0>navigator.userAgent.indexOf("Edge/"),IS_OP:0<=navigator.userAgent.indexOf("Opera/")||0<=navigator.userAgent.indexOf("OPR/"),IS_OT:0<=navigator.userAgent.indexOf("Presto/")&&0>navigator.userAgent.indexOf("Presto/2.4.")&&0>navigator.userAgent.indexOf("Presto/2.3.")&&0>navigator.userAgent.indexOf("Presto/2.2.")&&0>navigator.userAgent.indexOf("Presto/2.1.")&&0>navigator.userAgent.indexOf("Presto/2.0.")&&0>navigator.userAgent.indexOf("Presto/1."),IS_SF:0<=navigator.userAgent.indexOf("AppleWebKit/")&&
0>navigator.userAgent.indexOf("Chrome/")&&0>navigator.userAgent.indexOf("Edge/"),IS_IOS:navigator.userAgent.match(/(iPad|iPhone|iPod)/g)?!0:!1,IS_GC:0<=navigator.userAgent.indexOf("Chrome/")&&0>navigator.userAgent.indexOf("Edge/"),IS_CHROMEAPP:null!=window.chrome&&null!=chrome.app&&null!=chrome.app.runtime,IS_FF:0<=navigator.userAgent.indexOf("Firefox/"),IS_MT:0<=navigator.userAgent.indexOf("Firefox/")&&0>navigator.userAgent.indexOf("Firefox/1.")&&0>navigator.userAgent.indexOf("Firefox/2.")||0<=navigator.userAgent.indexOf("Iceweasel/")&&
0>navigator.userAgent.indexOf("Iceweasel/1.")&&0>navigator.userAgent.indexOf("Iceweasel/2.")||0<=navigator.userAgent.indexOf("SeaMonkey/")&&0>navigator.userAgent.indexOf("SeaMonkey/1.")||0<=navigator.userAgent.indexOf("Iceape/")&&0>navigator.userAgent.indexOf("Iceape/1."),IS_VML:"MICROSOFT INTERNET EXPLORER"==navigator.appName.toUpperCase(),IS_SVG:"MICROSOFT INTERNET EXPLORER"!=navigator.appName.toUpperCase(),NO_FO:!document.createElementNS||"[object SVGForeignObjectElement]"!=document.createElementNS("http://www.w3.org/2000/svg",
@ -1392,8 +1392,8 @@ mxGraphHandler.prototype.selectDelayed=function(a){this.graph.isCellSelected(thi
mxGraphHandler.prototype.shouldRemoveCellsFromParent=function(a,b,c){if(this.graph.getModel().isVertex(a)&&(a=this.graph.getView().getState(a),null!=a)){c=mxUtils.convertPoint(this.graph.container,mxEvent.getClientX(c),mxEvent.getClientY(c));var d=mxUtils.toRadians(mxUtils.getValue(a.style,mxConstants.STYLE_ROTATION)||0);if(0!=d){b=Math.cos(-d);var d=Math.sin(-d),e=new mxPoint(a.getCenterX(),a.getCenterY());c=mxUtils.getRotatedPoint(c,b,d,e)}return!mxUtils.contains(a,c.x,c.y)}return!1};
mxGraphHandler.prototype.moveCells=function(a,b,c,d,e,f){d&&(a=this.graph.getCloneableCells(a));var g=this.graph.getModel().getParent(this.cell);null==e&&this.isRemoveCellsFromParent()&&this.shouldRemoveCellsFromParent(g,a,f)&&(e=this.graph.getDefaultParent());d=d&&!this.graph.isCellLocked(e||this.graph.getDefaultParent());this.graph.getModel().beginUpdate();try{g=[];if(!d&&null!=e&&this.removeEmptyParents){for(var k=new mxDictionary,l=0;l<a.length;l++)k.put(a[l],!0);for(l=0;l<a.length;l++){var m=
this.graph.model.getParent(a[l]);null==m||k.get(m)||(k.put(m,!0),g.push(m))}}a=this.graph.moveCells(a,b-this.graph.panDx/this.graph.view.scale,c-this.graph.panDy/this.graph.view.scale,d,e,f);b=[];for(l=0;l<g.length;l++)this.shouldRemoveParent(g[l])&&b.push(g[l]);this.graph.removeCells(b,!1)}finally{this.graph.getModel().endUpdate()}d&&this.graph.setSelectionCells(a);this.isSelectEnabled()&&this.scrollOnMove&&this.graph.scrollCellToVisible(a[0])};
mxGraphHandler.prototype.shouldRemoveParent=function(a){var b=this.graph.view.getState(a);console.log("state",b,this.graph.model.getChildCount(b.cell));return null!=b&&(this.graph.model.isEdge(b.cell)||this.graph.model.isVertex(b.cell))&&this.graph.isCellDeletable(b.cell)&&0==this.graph.model.getChildCount(b.cell)?(a=mxUtils.getValue(b.style,mxConstants.STYLE_STROKECOLOR,mxConstants.NONE),b=mxUtils.getValue(b.style,mxConstants.STYLE_FILLCOLOR,mxConstants.NONE),a==mxConstants.NONE&&b==mxConstants.NONE):
!1};mxGraphHandler.prototype.destroyShapes=function(){null!=this.shape&&(this.shape.destroy(),this.shape=null);null!=this.guide&&(this.guide.destroy(),this.guide=null);null!=this.highlight&&(this.highlight.destroy(),this.highlight=null)};
mxGraphHandler.prototype.shouldRemoveParent=function(a){var b=this.graph.view.getState(a);return null!=b&&(this.graph.model.isEdge(b.cell)||this.graph.model.isVertex(b.cell))&&this.graph.isCellDeletable(b.cell)&&0==this.graph.model.getChildCount(b.cell)?(a=mxUtils.getValue(b.style,mxConstants.STYLE_STROKECOLOR,mxConstants.NONE),b=mxUtils.getValue(b.style,mxConstants.STYLE_FILLCOLOR,mxConstants.NONE),a==mxConstants.NONE&&b==mxConstants.NONE):!1};
mxGraphHandler.prototype.destroyShapes=function(){null!=this.shape&&(this.shape.destroy(),this.shape=null);null!=this.guide&&(this.guide.destroy(),this.guide=null);null!=this.highlight&&(this.highlight.destroy(),this.highlight=null)};
mxGraphHandler.prototype.destroy=function(){this.graph.removeMouseListener(this);this.graph.removeListener(this.panHandler);null!=this.escapeHandler&&(this.graph.removeListener(this.escapeHandler),this.escapeHandler=null);null!=this.refreshHandler&&(this.graph.getModel().removeListener(this.refreshHandler),this.refreshHandler=null);this.destroyShapes();this.removeHint()};
function mxPanningHandler(a){null!=a&&(this.graph=a,this.graph.addMouseListener(this),this.forcePanningHandler=mxUtils.bind(this,function(a,c){var b=c.getProperty("eventName"),e=c.getProperty("event");b==mxEvent.MOUSE_DOWN&&this.isForcePanningEvent(e)&&(this.start(e),this.active=!0,this.fireEvent(new mxEventObject(mxEvent.PAN_START,"event",e)),e.consume())}),this.graph.addListener(mxEvent.FIRE_MOUSE_EVENT,this.forcePanningHandler),this.gestureHandler=mxUtils.bind(this,function(a,c){if(this.isPinchEnabled()){var b=
c.getProperty("event");mxEvent.isConsumed(b)||"gesturestart"!=b.type?"gestureend"==b.type&&null!=this.initialScale&&(this.initialScale=null):(this.initialScale=this.graph.view.scale,this.active||null==this.mouseDownEvent||(this.start(this.mouseDownEvent),this.mouseDownEvent=null));if(null!=this.initialScale){var e=Math.round(this.initialScale*b.scale*100)/100;null!=this.minScale&&(e=Math.max(this.minScale,e));null!=this.maxScale&&(e=Math.min(this.maxScale,e));this.graph.view.scale!=e&&(this.graph.zoomTo(e),

View file

@ -1,7 +1,7 @@
CACHE MANIFEST
# THIS FILE WAS GENERATED. DO NOT MODIFY!
# 07/16/2019 01:41 PM
# 07/19/2019 10:46 AM
app.html
index.html?offline=1

View file

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
This window will be closed automatically.
<script>
if (window.opener != null && window.opener.onGitLabCallback != null)
{
try
{
var search = window.location.href;
var idx1 = search.indexOf('access_token=');
var code = null;
if (idx1 >= 0)
{
var idx2 = search.indexOf('&', idx1);
code = search.substring(idx1 + 13, idx2);
}
// Continues execution of main program flow
window.opener.onGitLabCallback(code, window);
window.close();
}
catch (e)
{
alert('GitLab error: ' + e.toString());
window.close();
}
}
</script>
</body>
</html>

View file

@ -0,0 +1 @@
<svg id="logo_art" data-name="logo art" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 586 559"><defs><style>.cls-1{fill:#fff;}</style></defs><title>gitlab-icon-1-color-white-rgb</title><path class="cls-1" d="M461.48,298.35,443.7,243.72a7.72,7.72,0,0,0-.43-1.47L407.6,132.45a14.18,14.18,0,0,0-13.54-9.67,13.94,13.94,0,0,0-13.38,9.75l-34,104.63H239.37L205.32,132.53A13.94,13.94,0,0,0,192,122.78h-.08a14.22,14.22,0,0,0-13.5,9.76L142.72,242.47c0,.1-.08.18-.11.28l-18.1,55.61a20.29,20.29,0,0,0,7.37,22.71L288.26,434.7a8,8,0,0,0,9.45-.05l0,0L454.12,321.07A20.28,20.28,0,0,0,461.48,298.35ZM227.73,253.22l43.59,134.16L166.68,253.22Zm87,134.19,41.8-128.62,1.8-5.57h61.1L324.76,374.5Zm79.47-244.58,30.63,94.33H363.52ZM341.49,253.16l-30.37,93.46L293,402.28,244.58,253.16ZM191.85,142.83l30.69,94.33H161.27Zm-50.56,165.3a4.31,4.31,0,0,1-1.56-4.83L153.17,262l98.57,126.37Zm303.43,0L334.26,388.34l.37-.48L432.83,262l13.44,41.28A4.31,4.31,0,0,1,444.72,308.12Z"/></svg>

After

Width:  |  Height:  |  Size: 954 B

View file

@ -0,0 +1 @@
<svg id="logo_art" data-name="logo art" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 586 559"><defs><style>.cls-1{fill:#fc6d26;}.cls-2{fill:#e24329;}.cls-3{fill:#fca326;}</style></defs><title>gitlab-icon-rgb</title><g id="g44"><path id="path46" class="cls-1" d="M461.17,301.83l-18.91-58.12L404.84,128.43a6.47,6.47,0,0,0-12.27,0L355.15,243.64H230.82L193.4,128.43a6.46,6.46,0,0,0-12.26,0L143.78,243.64l-18.91,58.19a12.88,12.88,0,0,0,4.66,14.39L293,435,456.44,316.22a12.9,12.9,0,0,0,4.73-14.39"/></g><g id="g48"><path id="path50" class="cls-2" d="M293,434.91h0l62.16-191.28H230.87L293,434.91Z"/></g><g id="g56"><path id="path58" class="cls-1" d="M293,434.91,230.82,243.63h-87L293,434.91Z"/></g><g id="g64"><path id="path66" class="cls-3" d="M143.75,243.69h0l-18.91,58.12a12.88,12.88,0,0,0,4.66,14.39L293,435,143.75,243.69Z"/></g><g id="g72"><path id="path74" class="cls-2" d="M143.78,243.69h87.11L193.4,128.49a6.47,6.47,0,0,0-12.27,0l-37.35,115.2Z"/></g><g id="g76"><path id="path78" class="cls-1" d="M293,434.91l62.16-191.28H442.3L293,434.91Z"/></g><g id="g80"><path id="path82" class="cls-3" d="M442.24,243.69h0l18.91,58.12a12.85,12.85,0,0,1-4.66,14.39L293,434.91l149.2-191.22Z"/></g><g id="g84"><path id="path86" class="cls-2" d="M442.28,243.69h-87.1l37.42-115.2a6.46,6.46,0,0,1,12.26,0l37.42,115.2Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because one or more lines are too long

View file

@ -174,47 +174,52 @@ App = function(editor, container, lightbox)
};
/**
* Executes the first step for connecting to Google Drive.
* Timeout error
*/
App.ERROR_TIMEOUT = 'timeout';
/**
* Executes the first step for connecting to Google Drive.
* Busy error
*/
App.ERROR_BUSY = 'busy';
/**
* Executes the first step for connecting to Google Drive.
* Unknown error
*/
App.ERROR_UNKNOWN = 'unknown';
/**
* Sets the delay for autosave in milliseconds. Default is 2000.
* Google drive mode
*/
App.MODE_GOOGLE = 'google';
/**
* Sets the delay for autosave in milliseconds. Default is 2000.
* Dropbox mode
*/
App.MODE_DROPBOX = 'dropbox';
/**
* Sets the delay for autosave in milliseconds. Default is 2000.
* OneDrive Mode
*/
App.MODE_ONEDRIVE = 'onedrive';
/**
* Sets the delay for autosave in milliseconds. Default is 2000.
* Github Mode
*/
App.MODE_GITHUB = 'github';
/**
* Sets the delay for autosave in milliseconds. Default is 2000.
* Gitlab mode
*/
App.MODE_GITLAB = 'gitlab';
/**
* Device Mode
*/
App.MODE_DEVICE = 'device';
/**
* Sets the delay for autosave in milliseconds. Default is 2000.
* Browser Mode
*/
App.MODE_BROWSER = 'browser';
@ -280,6 +285,11 @@ App.PUSHER_URL = 'https://js.pusher.com/4.3/pusher.min.js';
*/
App.GOOGLE_APIS = 'client,drive-share';
/**
* Google Realtime API export endpoint end of life on 09/27/2019.
*/
App.GOOGLE_REALTIME_EOL = 1569535200000;
/**
* Function: authorize
*
@ -1082,6 +1092,23 @@ App.prototype.init = function()
}))
}
/**
* Creates gitlab client.
*/
this.gitLab = (!mxClient.IS_IE || document.documentMode == 10 ||
mxClient.IS_IE11 || mxClient.IS_EDGE) &&
(urlParams['gl'] != '0' && (urlParams['embed'] != '1' ||
urlParams['gl'] == '1')) ? new GitLabClient(this) : null;
if (this.gitLab != null)
{
this.gitLab.addListener('userChanged', mxUtils.bind(this, function()
{
this.updateUserElement();
this.restoreLibraries();
}));
}
var createFooter = mxUtils.bind(this, function(label, link, className, closeHandler, helpLink)
{
var footer = document.createElement('div');
@ -1234,39 +1261,39 @@ App.prototype.init = function()
this.restoreLibraries();
this.checkLicense();
if (this.drive.user != null && (!isLocalStorage || mxSettings.settings == null ||
mxSettings.settings.closeRealtimeWarning == null || mxSettings.settings.closeRealtimeWarning <
new Date().getTime() - (7 * 24 * 60 * 60 * 1000)) &&
(!this.editor.chromeless || this.editor.editable))
if (App.GOOGLE_REALTIME_EOL - Date.now() >= 0)
{
this.drive.checkRealtimeFiles(mxUtils.bind(this, function()
if (this.drive.user != null && (!isLocalStorage || mxSettings.settings == null ||
mxSettings.settings.closeRealtimeWarning == null || mxSettings.settings.closeRealtimeWarning <
new Date().getTime() - (4 * 24 * 60 * 60 * 1000)) &&
(!this.editor.chromeless || this.editor.editable))
{
// Remaining days before 09/27/2019 where Google real time JSON will be disabled
var days = Math.round((1569535200000 - Date.now()) / (1000 * 60 * 60 * 24));
var footer = createFooter(days + ' days left to convert your files. Click here!',
'https://www.draw.io/?mode=google&convert-realtime=1',
'geStatusAlert',
mxUtils.bind(this, function()
{
footer.parentNode.removeChild(footer);
this.hideFooter();
// Close permanently
if (isLocalStorage && mxSettings.settings != null)
{
mxSettings.settings.closeRealtimeWarning = Date.now();
mxSettings.save();
}
}), 'https://desk.draw.io/support/solutions/articles/16000092210');
document.body.appendChild(footer);
window.setTimeout(mxUtils.bind(this, function()
this.drive.checkRealtimeFiles(mxUtils.bind(this, function()
{
mxUtils.setPrefixedStyle(footer.style, 'transform', 'translate(-50%,0%)');
}), 1500);
}));
var footer = createFooter('You need to take action to convert legacy files. Click here.',
'https://desk.draw.io/support/solutions/articles/16000092210',
'geStatusAlert',
mxUtils.bind(this, function()
{
footer.parentNode.removeChild(footer);
this.hideFooter();
// Close permanently
if (isLocalStorage && mxSettings.settings != null)
{
mxSettings.settings.closeRealtimeWarning = Date.now();
mxSettings.save();
}
}));
document.body.appendChild(footer);
window.setTimeout(mxUtils.bind(this, function()
{
mxUtils.setPrefixedStyle(footer.style, 'transform', 'translate(-50%,0%)');
}), 1500);
}));
}
}
}))
@ -1399,48 +1426,48 @@ App.prototype.init = function()
// req.getStatus() + '.' + (new Date().getTime() - t0)});
// }
}));
}
this.editor.addListener('fileLoaded', mxUtils.bind(this, function()
{
var file = this.getCurrentFile();
if (file.mode == App.MODE_DEVICE && (!isLocalStorage || mxSettings.settings == null ||
mxSettings.settings.closeDesktopFooter == null) &&
(!this.editor.chromeless || this.editor.editable) &&
!this.footerShowing && urlParams['open'] == null)
this.editor.addListener('fileLoaded', mxUtils.bind(this, function()
{
var footer = createFooter(mxResources.get('downloadDesktop') + '...',
'https://get.draw.io/',
'geStatusMessage',
mxUtils.bind(this, function()
{
footer.parentNode.removeChild(footer);
this.hideFooter();
// Close permanently
if (isLocalStorage && mxSettings.settings != null)
var file = this.getCurrentFile();
if (file.mode == App.MODE_DEVICE && (!isLocalStorage || mxSettings.settings == null ||
mxSettings.settings.closeDesktopFooter == null) &&
(!this.editor.chromeless || this.editor.editable) &&
!this.footerShowing && urlParams['open'] == null)
{
var footer = createFooter(mxResources.get('downloadDesktop') + '...',
'https://get.draw.io/',
'geStatusMessage',
mxUtils.bind(this, function()
{
mxSettings.settings.closeDesktopFooter = Date.now();
mxSettings.save();
}
}));
footer.parentNode.removeChild(footer);
this.hideFooter();
document.body.appendChild(footer);
this.footerShowing = true;
window.setTimeout(mxUtils.bind(this, function()
{
mxUtils.setPrefixedStyle(footer.style, 'transform', 'translate(-50%,0%)');
}), 1500);
window.setTimeout(mxUtils.bind(this, function()
{
mxUtils.setPrefixedStyle(footer.style, 'transform', 'translate(-50%,110%)');
this.footerShowing = false;
}), 15000);
}
}));
// Close permanently
if (isLocalStorage && mxSettings.settings != null)
{
mxSettings.settings.closeDesktopFooter = Date.now();
mxSettings.save();
}
}));
document.body.appendChild(footer);
this.footerShowing = true;
window.setTimeout(mxUtils.bind(this, function()
{
mxUtils.setPrefixedStyle(footer.style, 'transform', 'translate(-50%,0%)');
}), 1500);
window.setTimeout(mxUtils.bind(this, function()
{
mxUtils.setPrefixedStyle(footer.style, 'transform', 'translate(-50%,110%)');
this.footerShowing = false;
}), 15000);
}
}));
}
}
else if (this.menubar != null)
{
@ -2247,6 +2274,17 @@ App.prototype.appIconClicked = function(evt)
this.openLink('https://github.com/');
}
}
else if (mode == App.MODE_GITLAB)
{
if (file != null && file.constructor == GitLabFile)
{
this.openLink(file.meta.html_url);
}
else
{
this.openLink('https://gitlab.com/');
}
}
else if (mode == App.MODE_DEVICE)
{
this.openLink('https://get.draw.io/');
@ -2962,7 +3000,7 @@ App.prototype.showSplash = function(force)
}), rowLimit);
this.showDialog(dlg.container, (rowLimit < 3) ? 260 : 300,
(serviceCount >= 4) ? 420 : 300, true, false);
(serviceCount >= 4) ? 440 : 320, true, false);
dlg.init();
}
else if (urlParams['create'] == null)
@ -3006,6 +3044,8 @@ App.prototype.addLanguageMenu = function(elt, addLabel)
label.style.fontSize = '12px';
label.style.margin = '5px 24px 0 0';
label.style.color = 'gray';
label.style.userSelect = 'none';
mxUtils.write(label, mxResources.get('language'));
img.appendChild(label);
}
@ -3157,7 +3197,8 @@ App.prototype.pickLibrary = function(mode)
{
mode = (mode != null) ? mode : this.mode;
if (mode == App.MODE_GOOGLE || mode == App.MODE_DROPBOX || mode == App.MODE_ONEDRIVE || mode == App.MODE_GITHUB || mode == App.MODE_TRELLO)
if (mode == App.MODE_GOOGLE || mode == App.MODE_DROPBOX || mode == App.MODE_ONEDRIVE ||
mode == App.MODE_GITHUB || mode == App.MODE_GITLAB || mode == App.MODE_TRELLO)
{
var peer = (mode == App.MODE_GOOGLE) ? this.drive :
((mode == App.MODE_ONEDRIVE) ? this.oneDrive :
@ -3344,6 +3385,15 @@ App.prototype.saveLibrary = function(name, images, file, mode, noSpin, noReload,
this.libraryLoaded(newFile, images);
}), error, folderId);
}
else if (mode == App.MODE_GITLAB && this.gitLab != null && this.spinner.spin(document.body, mxResources.get('inserting')))
{
this.gitLab.insertLibrary(name, xml, mxUtils.bind(this, function(newFile)
{
this.spinner.stop();
this.hideDialog(true);
this.libraryLoaded(newFile, images);
}), error, folderId);
}
else if (mode == App.MODE_TRELLO && this.trello != null && this.spinner.spin(document.body, mxResources.get('inserting')))
{
this.trello.insertLibrary(name, xml, mxUtils.bind(this, function(newFile)
@ -3650,6 +3700,10 @@ App.prototype.getPeerForMode = function(mode)
{
return this.gitHub;
}
else if (mode == App.MODE_GITLAB)
{
return this.gitLab;
}
else if (mode == App.MODE_DROPBOX)
{
return this.dropbox;
@ -3724,6 +3778,14 @@ App.prototype.createFile = function(title, data, libs, mode, done, replace, fold
this.fileCreated(file, libs, replace, done, clibs);
}), error, false, folderId);
}
else if (mode == App.MODE_GITLAB && this.gitLab != null)
{
this.gitLab.insertFile(title, data, mxUtils.bind(this, function(file)
{
complete();
this.fileCreated(file, libs, replace, done, clibs);
}), error, false, folderId);
}
else if (mode == App.MODE_TRELLO && this.trello != null)
{
this.trello.insertFile(title, data, mxUtils.bind(this, function(file)
@ -4215,6 +4277,10 @@ App.prototype.loadFile = function(id, sameWindow, file, success, force)
{
peer = this.gitHub;
}
else if (id.charAt(0) == 'A')
{
peer = this.gitLab;
}
else if (id.charAt(0) == 'T')
{
peer = this.trello;
@ -4868,6 +4934,14 @@ App.prototype.pickFolder = function(mode, fn, enabled, direct, force)
fn(folderPath);
}));
}
else if (enabled && mode == App.MODE_GITLAB && this.gitLab != null)
{
this.gitLab.pickFolder(mxUtils.bind(this, function(folderPath)
{
resume();
fn(folderPath);
}));
}
else if (enabled && mode == App.MODE_TRELLO && this.trello != null)
{
this.trello.pickFolder(mxUtils.bind(this, function(cardId)
@ -5330,6 +5404,10 @@ App.prototype.updateHeader = function()
{
this.appIcon.style.backgroundImage = 'url(' + IMAGE_PATH + '/github-logo-white.svg)';
}
else if (mode == App.MODE_GITLAB)
{
this.appIcon.style.backgroundImage = 'url(' + IMAGE_PATH + '/gitlab-logo-white.svg)';
}
else if (mode == App.MODE_TRELLO)
{
this.appIcon.style.backgroundImage = 'url(' + IMAGE_PATH + '/trello-logo-white-orange.svg)';
@ -5609,6 +5687,7 @@ App.prototype.updateUserElement = function()
(this.oneDrive == null || this.oneDrive.getUser() == null) &&
(this.dropbox == null || this.dropbox.getUser() == null) &&
(this.gitHub == null || this.gitHub.getUser() == null) &&
(this.gitLab == null || this.gitLab.getUser() == null) &&
(this.trello == null || !this.trello.isAuthorized())) //TODO Trello no user issue
{
if (this.userElement != null)
@ -5695,15 +5774,16 @@ App.prototype.updateUserElement = function()
connected = true;
this.userPanel.innerHTML += '<table title="User ID: ' + driveUser.id +
'" style="font-size:10pt;padding:20px 20px 10px 10px;">' +
'<tr><td valign="top">' +
'<tr><td valign="middle">' +
((driveUser.pictureUrl != null) ?
'<img width="80" height="80" style="margin-right:10px;border-radius:50%;" src="' + driveUser.pictureUrl + '"/>' :
'<img width="80" height="80" style="margin-right:4px;margin-top:2px;" src="' + this.defaultUserPicture + '"/>') +
'<img width="50" height="50" style="margin-right:8px;border-radius:50%;" src="' + driveUser.pictureUrl + '"/>' :
'<img width="46" height="46" style="margin-right:4px;margin-top:0px;" src="' + this.defaultUserPicture + '"/>') +
'</td><td valign="top" style="white-space:nowrap;' +
((driveUser.pictureUrl != null) ? 'padding-top:14px;' : '') +
'"><b>' + mxUtils.htmlEntities(driveUser.displayName) + '</b><br>' +
'<small>' + mxUtils.htmlEntities(driveUser.email) + '</small><br><br>' +
'<small>' + mxResources.get('googleDrive') + '</small></tr></table>';
((driveUser.pictureUrl != null) ? 'padding-top:4px;' : '') +
'">' + mxUtils.htmlEntities(driveUser.displayName) + '<br>' +
'<small style="color:gray;">' + mxUtils.htmlEntities(driveUser.email) +
'</small><div style="margin-top:4px;"><i>' +
mxResources.get('googleDrive') + '</i></div></tr></table>';
var div = document.createElement('div');
div.style.textAlign = 'center';
div.style.paddingBottom = '12px';
@ -5711,7 +5791,7 @@ App.prototype.updateUserElement = function()
// LATER: Cannot change user while file is open since close will not work with new
// credentials and closing the file using fileLoaded(null) will show splash dialog.
div.appendChild(mxUtils.button(mxResources.get('signOut'), mxUtils.bind(this, function()
var btn = mxUtils.button(mxResources.get('signOut'), mxUtils.bind(this, function()
{
var file = this.getCurrentFile();
@ -5754,8 +5834,9 @@ App.prototype.updateUserElement = function()
this.drive.setUser(null);
gapi.auth.signOut();
}
})));
}));
btn.className = 'geBtn';
div.appendChild(btn);
this.userPanel.appendChild(div);
}
}
@ -5771,10 +5852,10 @@ App.prototype.updateUserElement = function()
connected = true;
this.userPanel.innerHTML += '<table style="font-size:10pt;padding:20px 20px 10px 10px;"><tr><td valign="top">' +
((logo != null) ? '<img style="margin-right:10px;" src="' + logo + '" width="40" height="40"/></td>' : '') +
'<td valign="middle" style="white-space:nowrap;"><b>' + mxUtils.htmlEntities(user.displayName) + '</b>' +
((user.email != null) ? '<br><font color="gray">' + mxUtils.htmlEntities(user.email) + '</font>' : '') +
((label != null) ? '<br><br><small>' + mxUtils.htmlEntities(label) + '</small>' : '') +
((logo != null) ? '<img style="margin-right:6px;" src="' + logo + '" width="40" height="40"/></td>' : '') +
'<td valign="middle" style="white-space:nowrap;">' + mxUtils.htmlEntities(user.displayName) +
((user.email != null) ? '<br><small style="color:gray;">' + mxUtils.htmlEntities(user.email) + '</small>' : '') +
((label != null) ? '<div style="margin-top:4px;"><i>' + mxUtils.htmlEntities(label) + '</i></div>' : '') +
'</td></tr></table>';
var div = document.createElement('div');
div.style.textAlign = 'center';
@ -5783,7 +5864,9 @@ App.prototype.updateUserElement = function()
if (logout != null)
{
div.appendChild(mxUtils.button(mxResources.get('signOut'), logout));
var btn = mxUtils.button(mxResources.get('signOut'), logout);
btn.className = 'geBtn';
div.appendChild(btn);
}
this.userPanel.appendChild(div);
@ -5883,6 +5966,37 @@ App.prototype.updateUserElement = function()
}), mxResources.get('github'));
}
if (this.gitLab != null)
{
addUser(this.gitLab.getUser(), IMAGE_PATH + '/gitlab-logo.svg', mxUtils.bind(this, function()
{
var file = this.getCurrentFile();
if (file != null && file.constructor == GitLabFile)
{
var doLogout = mxUtils.bind(this, function()
{
this.gitLab.logout();
window.location.hash = '';
});
if (!file.isModified())
{
doLogout();
}
else
{
this.confirm(mxResources.get('allChangesLost'), null, doLogout,
mxResources.get('cancel'), mxResources.get('discardChanges'));
}
}
else
{
this.gitLab.logout();
}
}), mxResources.get('gitlab'));
}
//TODO We have no user info from Trello, how we can create a user?
if (this.trello != null)
{
@ -5939,6 +6053,7 @@ App.prototype.updateUserElement = function()
this.userPanel.parentNode.removeChild(this.userPanel);
}
}));
btn.className = 'geBtn';
div.appendChild(btn);
this.userPanel.appendChild(div);
@ -5975,6 +6090,10 @@ App.prototype.updateUserElement = function()
{
user = this.gitHub.getUser();
}
else if (this.gitLab != null && this.gitLab.getUser() != null)
{
user = this.gitLab.getUser();
}
//TODO Trello no user issue
if (user != null)

View file

@ -116,6 +116,9 @@ mxscript(drawDevUrl + 'js/diagramly/OneDriveClient.js');
mxscript(drawDevUrl + 'js/diagramly/TrelloFile.js');
mxscript(drawDevUrl + 'js/diagramly/TrelloLibrary.js');
mxscript(drawDevUrl + 'js/diagramly/TrelloClient.js');
mxscript(drawDevUrl + 'js/diagramly/GitLabFile.js');
mxscript(drawDevUrl + 'js/diagramly/GitLabLibrary.js');
mxscript(drawDevUrl + 'js/diagramly/GitLabClient.js');
mxscript(drawDevUrl + 'js/diagramly/App.js');
mxscript(drawDevUrl + 'js/diagramly/Menus.js');

View file

@ -27,6 +27,7 @@ var StorageDialog = function(editorUi, fn, rowLimit)
help.setAttribute('title', mxResources.get('help'));
help.setAttribute('target', '_blank');
help.style.position = 'absolute';
help.style.userSelect = 'none';
help.style.textDecoration = 'none';
help.style.cursor = 'pointer';
help.style.fontSize = '12px';
@ -55,6 +56,8 @@ var StorageDialog = function(editorUi, fn, rowLimit)
demo.style.fontSize = '12px';
demo.style.bottom = bottom;
demo.style.color = 'gray';
demo.style.userSelect = 'none';
mxUtils.write(demo, mxResources.get('decideLater'));
if (editorUi.isOfflineApp())
@ -102,11 +105,20 @@ var StorageDialog = function(editorUi, fn, rowLimit)
cb.setAttribute('checked', 'checked');
cb.defaultChecked = true;
var count = 0;
var container = document.createElement('div');
container.style.paddingTop = '2px';
buttons.appendChild(container);
var p3 = document.createElement('p');
function addLogo(img, title, mode, clientName, labels, clientFn)
{
if (++count > rowLimit)
{
mxUtils.br(container);
count = 0;
}
var button = document.createElement('a');
button.style.overflow = 'hidden';
button.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
@ -115,9 +127,10 @@ var StorageDialog = function(editorUi, fn, rowLimit)
button.style.fontSize = '11px';
button.style.position = 'relative';
button.style.margin = '4px';
button.style.marginTop = '2px';
button.style.padding = '8px 10px 12px 10px';
button.style.width = '88px';
button.style.height = '100px';
button.style.height = (StorageDialog.extended) ? '50px' : '100px';
button.style.whiteSpace = 'nowrap';
button.setAttribute('title', title);
@ -138,9 +151,9 @@ var StorageDialog = function(editorUi, fn, rowLimit)
logo.setAttribute('src', img);
logo.setAttribute('border', '0');
logo.setAttribute('align', 'absmiddle');
logo.style.width = '60px';
logo.style.height = '60px';
logo.style.paddingBottom = '6px';
logo.style.width = (StorageDialog.extended) ? '24px' : '60px';
logo.style.height = (StorageDialog.extended) ? '24px' : '60px';
logo.style.paddingBottom = (StorageDialog.extended) ? '4px' : '6px';
button.appendChild(logo);
}
@ -162,6 +175,21 @@ var StorageDialog = function(editorUi, fn, rowLimit)
}
}
if (StorageDialog.extended)
{
button.style.paddingTop = '4px';
button.style.marginBottom = '0px';
label.display = 'inline-block';
if (rowLimit == 2)
{
logo.style.width = '38px';
logo.style.height = '38px';
button.style.width = '80px';
button.style.height = '68px';
}
}
button.appendChild(label);
mxUtils.write(label, title);
@ -266,13 +294,7 @@ var StorageDialog = function(editorUi, fn, rowLimit)
initButton();
}
buttons.appendChild(button);
if (++count >= rowLimit)
{
mxUtils.br(buttons);
count = 0;
}
container.appendChild(button);
};
var hd = document.createElement('p');
@ -285,37 +307,85 @@ var StorageDialog = function(editorUi, fn, rowLimit)
mxUtils.write(hd, mxResources.get('saveDiagramsTo') + ':');
div.appendChild(hd);
if (typeof window.DriveClient === 'function')
var addButtons = function()
{
addLogo(IMAGE_PATH + '/google-drive-logo.svg', mxResources.get('googleDrive'), App.MODE_GOOGLE, 'drive');
}
if (typeof window.OneDriveClient === 'function')
{
addLogo(IMAGE_PATH + '/onedrive-logo.svg', mxResources.get('oneDrive'), App.MODE_ONEDRIVE, 'oneDrive');
}
addLogo(IMAGE_PATH + '/osa_drive-harddisk.png', mxResources.get('device'), App.MODE_DEVICE);
count = 0;
if (typeof window.DriveClient === 'function')
{
addLogo(IMAGE_PATH + '/google-drive-logo.svg', mxResources.get('googleDrive'), App.MODE_GOOGLE, 'drive');
}
if (isLocalStorage && (urlParams['browser'] == '1' || urlParams['offline'] == '1'))
{
addLogo(IMAGE_PATH + '/osa_database.png', mxResources.get('browser'), App.MODE_BROWSER);
}
if (typeof window.OneDriveClient === 'function')
{
addLogo(IMAGE_PATH + '/onedrive-logo.svg', mxResources.get('oneDrive'), App.MODE_ONEDRIVE, 'oneDrive');
}
addLogo(IMAGE_PATH + '/osa_drive-harddisk.png', mxResources.get('device'), App.MODE_DEVICE);
if (isLocalStorage && (urlParams['browser'] == '1' || urlParams['offline'] == '1'))
{
addLogo(IMAGE_PATH + '/osa_database.png', mxResources.get('browser'), App.MODE_BROWSER);
}
if (StorageDialog.extended)
{
if (typeof window.DropboxClient === 'function')
{
addLogo(IMAGE_PATH + '/dropbox-logo.svg', mxResources.get('dropbox'), App.MODE_DROPBOX, 'dropbox');
}
if (editorUi.gitHub != null)
{
addLogo(IMAGE_PATH + '/github-logo.svg', mxResources.get('github'), App.MODE_GITHUB, 'gitHub');
}
if (editorUi.gitLab != null)
{
addLogo(IMAGE_PATH + '/gitlab-logo.svg', mxResources.get('gitlab'), App.MODE_GITLAB, 'gitLab');
}
}
};
div.appendChild(buttons);
addButtons();
var p2 = document.createElement('p');
p2.style.marginTop = '12px';
p2.style.marginTop = '8px';
p2.style.marginBottom = '6px';
var temp = document.createElement('div');
temp.style.marginBottom = '10px';
var showMore = document.createElement('a');
showMore.style.color = 'gray';
showMore.style.fontSize = '12px';
showMore.style.cursor = 'pointer';
showMore.style.userSelect = 'none';
mxUtils.write(showMore, ((StorageDialog.extended) ? mxResources.get('showLess') : mxResources.get('showMore')) + '...');
temp.appendChild(showMore);
p2.appendChild(temp);
p2.appendChild(cb);
mxEvent.addListener(showMore, 'click', function(evt)
{
container.innerHTML = '';
showMore.innerHTML = '';
StorageDialog.extended = !StorageDialog.extended;
addButtons();
mxUtils.write(showMore, ((StorageDialog.extended) ? mxResources.get('showLess') : mxResources.get('showMore')) + '...');
mxEvent.consume(evt);
});
var span = document.createElement('span');
span.style.color = 'gray';
span.style.fontSize = '12px';
span.style.userSelect = 'none';
mxUtils.write(span, ' ' + mxResources.get('rememberThisSetting'));
p2.appendChild(span);
mxUtils.br(p2);
var recent = editorUi.getRecent();
if (recent != null && recent.length > 0)
@ -372,11 +442,16 @@ var StorageDialog = function(editorUi, fn, rowLimit)
if (Graph.fileSupport)
{
var link = document.createElement('div');
var temp = document.createElement('div');
temp.style.marginBottom = '10px';
temp.style.padding = '18px 0px 6px 0px';
var link = document.createElement('a');
link.style.cursor = 'pointer';
link.style.padding = '18px 0px 6px 0px';
link.style.fontSize = '12px';
link.style.color = 'gray';
link.style.userSelect = 'none';
mxUtils.write(link, mxResources.get('import') + ': ' + mxResources.get('gliffy') + ', ' +
mxResources.get('formatVssx') + ', ' + mxResources.get('formatVsdx') + ', ' +
mxResources.get('lucidchart') + '...');
@ -411,7 +486,8 @@ var StorageDialog = function(editorUi, fn, rowLimit)
editorUi.storageFileInputElt.click();
});
p2.appendChild(link);
temp.appendChild(link);
p2.appendChild(temp);
buttons.style.paddingBottom = '4px';
}
@ -448,6 +524,11 @@ var StorageDialog = function(editorUi, fn, rowLimit)
this.container = div;
};
/**
*
*/
StorageDialog.extended = false;
/**
* Constructs a dialog for creating new files from templates.
*/
@ -532,10 +613,10 @@ var SplashDialog = function(editorUi)
logo.src = IMAGE_PATH + '/github-logo.svg';
service = mxResources.get('github');
}
else if (editorUi.mode == App.MODE_TRELLO)
else if (editorUi.mode == App.MODE_GITLAB)
{
logo.src = IMAGE_PATH + '/trello-logo.svg';
service = mxResources.get('trello');
logo.src = IMAGE_PATH + '/gitlab-logo.svg';
service = mxResources.get('gitlab');
}
else if (editorUi.mode == App.MODE_BROWSER)
{
@ -632,6 +713,10 @@ var SplashDialog = function(editorUi)
{
storage = mxResources.get('github');
}
else if (editorUi.mode == App.MODE_GITLAB)
{
storage = mxResources.get('gitlab');
}
else if (editorUi.mode == App.MODE_TRELLO)
{
storage = mxResources.get('trello');
@ -732,6 +817,14 @@ var SplashDialog = function(editorUi)
editorUi.openLink('https://www.github.com/logout');
});
}
else if (editorUi.mode == App.MODE_GITLAB && editorUi.gitLab != null)
{
addLogout(function()
{
editorUi.gitLab.logout();
editorUi.openLink('https://gitlab.com/users/sign_out');
});
}
else if (editorUi.mode == App.MODE_TRELLO && editorUi.trello != null)
{
if (editorUi.trello.isAuthorized())
@ -1888,8 +1981,6 @@ var BackgroundImageDialog = function(editorUi, applyFn)
.setAppId(editorUi.drive.appId)
.setLocale(mxLanguage)
.setOAuthToken(token)
.addView(google.picker.ViewId.PHOTOS)
.addView(google.picker.ViewId.PHOTO_ALBUMS)
.addView(google.picker.ViewId.PHOTO_UPLOAD);
editorUi.photoPicker = picker.setCallback(function(data)
@ -2643,6 +2734,10 @@ var NewDialog = function(editorUi, compact, showName, callback, createOnly, canc
{
logo.src = IMAGE_PATH + '/github-logo.svg';
}
else if (editorUi.mode == App.MODE_GITLAB)
{
logo.src = IMAGE_PATH + '/gitlab-logo.svg';
}
else if (editorUi.mode == App.MODE_TRELLO)
{
logo.src = IMAGE_PATH + '/trello-logo.svg';
@ -2685,6 +2780,10 @@ var NewDialog = function(editorUi, compact, showName, callback, createOnly, canc
{
ext = editorUi.gitHub.extension;
}
else if (editorUi.mode == App.MODE_GITLAB && editorUi.gitLab != null)
{
ext = editorUi.gitLab.extension;
}
else if (editorUi.mode == App.MODE_TRELLO && editorUi.trello != null)
{
ext = editorUi.trello.extension;
@ -3303,34 +3402,61 @@ var NewDialog = function(editorUi, compact, showName, callback, createOnly, canc
indexLoaded = true;
var tmpDoc = req.getXml();
var node = tmpDoc.documentElement.firstChild;
var clibs = {};
while (node != null)
{
if (typeof(node.getAttribute) !== 'undefined')
{
var url = node.getAttribute('url');
if (url != null)
if (node.nodeName == 'clibs')
{
var category = node.getAttribute('section');
var name = node.getAttribute('name');
var adds = node.getElementsByTagName('add');
var temp = [];
if (category == null)
for (var i = 0; i < adds.length; i++)
{
var slash = url.indexOf('/');
category = url.substring(0, slash);
temp.push(encodeURIComponent(mxUtils.getTextContent(adds[i])));
}
var list = categories[category];
if (list == null)
if (name != null && temp.length > 0)
{
list = [];
categories[category] = list;
clibs[name] = temp.join(';');
}
}
else
{
var url = node.getAttribute('url');
list.push({url: node.getAttribute('url'), libs: node.getAttribute('libs'),
title: node.getAttribute('title'), tooltip: node.getAttribute('url'),
preview: node.getAttribute('preview'), clibs: node.getAttribute('clibs')});
if (url != null)
{
var category = node.getAttribute('section');
if (category == null)
{
var slash = url.indexOf('/');
category = url.substring(0, slash);
}
var list = categories[category];
if (list == null)
{
list = [];
categories[category] = list;
}
var tempLibs = node.getAttribute('clibs');
if (clibs[tempLibs] != null)
{
tempLibs = clibs[tempLibs];
}
list.push({url: node.getAttribute('url'), libs: node.getAttribute('libs'),
title: node.getAttribute('title'), tooltip: node.getAttribute('url'),
preview: node.getAttribute('preview'), clibs: tempLibs});
}
}
}
@ -3754,6 +3880,16 @@ var CreateDialog = function(editorUi, title, createFn, cancelFn, dlgTitle, btnLa
addLogo(IMAGE_PATH + '/github-logo.svg', mxResources.get('github'), App.MODE_GITHUB, 'gitHub');
}
if (editorUi.gitLab != null)
{
var gitLabOption = document.createElement('option');
gitLabOption.setAttribute('value', App.MODE_GITLAB);
mxUtils.write(gitLabOption, mxResources.get('gitlab'));
serviceSelect.appendChild(gitLabOption);
addLogo(IMAGE_PATH + '/gitlab-logo.svg', mxResources.get('gitlab'), App.MODE_GITLAB, 'gitLab');
}
if (typeof window.TrelloClient === 'function')
{
@ -3820,6 +3956,10 @@ var CreateDialog = function(editorUi, title, createFn, cancelFn, dlgTitle, btnLa
{
ext = editorUi.gitHub.extension;
}
else if (newMode == App.MODE_GITLAB)
{
ext = editorUi.gitLab.extension;
}
else if (newMode == App.MODE_TRELLO)
{
ext = editorUi.trello.extension;
@ -4401,8 +4541,6 @@ var ImageDialog = function(editorUi, title, initialValue, fn, ignoreExisting, co
.setAppId(editorUi.drive.appId)
.setLocale(mxLanguage)
.setOAuthToken(token)
.addView(google.picker.ViewId.PHOTOS)
.addView(google.picker.ViewId.PHOTO_ALBUMS)
.addView(google.picker.ViewId.PHOTO_UPLOAD);
editorUi.photoPicker = picker.setCallback(function(data)
@ -4815,9 +4953,7 @@ var LinkDialog = function(editorUi, initialValue, btnLabel, fn, showPages)
if (urlParams['photos'] == '1')
{
picker.addView(google.picker.ViewId.PHOTOS)
.addView(google.picker.ViewId.PHOTO_ALBUMS)
.addView(google.picker.ViewId.PHOTO_UPLOAD)
picker.addView(google.picker.ViewId.PHOTO_UPLOAD)
}
editorUi.linkPicker = picker.setCallback(function(data)
@ -4888,6 +5024,28 @@ var LinkDialog = function(editorUi, initialValue, btnLabel, fn, showPages)
});
});
}
if (editorUi.gitLab != null)
{
addButton(IMAGE_PATH + '/gitlab-logo.svg', mxResources.get('gitlab'), function()
{
editorUi.gitLab.pickFile(function(path)
{
if (path != null)
{
var tokens = path.split('/');
var org = tokens[0];
var repo = tokens[1];
var ref = tokens[2];
var path = tokens.slice(3, tokens.length).join('/');
linkInput.value = 'https://gitlab.com/' + org + '/' +
repo + '/blob/' + ref + '/' + path;
linkInput.focus();
}
});
});
}
//TODO should Trello support this?
mxEvent.addListener(linkInput, 'keypress', function(e)
@ -6380,6 +6538,107 @@ var FindWindow = function(ui, x, y, w, h)
}
};
/**
*
*/
var FreehandWindow = function(editorUi, x, y, w, h)
{
var graph = editorUi.editor.graph;
var propertyName = 'tags';
var div = document.createElement('div');
div.style.userSelect = 'none';
div.style.overflow = 'hidden';
div.style.height = '100%';
var startBtn = mxUtils.button(mxResources.get('startDrawing'), function()
{
if (graph.freehand.isDrawing())
{
graph.freehand.stopDrawing();
}
graph.freehand.startDrawing();
});
startBtn.setAttribute('title', mxResources.get('startDrawing'));
startBtn.style.marginTop = '8px';
startBtn.style.marginRight = '4px';
startBtn.style.width = '160px';
startBtn.style.overflow = 'hidden';
startBtn.style.textOverflow = 'ellipsis';
startBtn.style.textAlign = 'center';
startBtn.className = 'geBtn gePrimaryBtn';
div.appendChild(startBtn);
var stopBtn = startBtn.cloneNode(false);
mxUtils.write(stopBtn, mxResources.get('stopDrawing'));
stopBtn.setAttribute('title', mxResources.get('stopDrawing'));
stopBtn.style.marginTop = '4px';
mxEvent.addListener(stopBtn, 'click', function()
{
graph.freehand.stopDrawing();
});
div.appendChild(stopBtn);
this.window = new mxWindow(mxResources.get('freehand'), div, x, y, w, h, true, true);
this.window.destroyOnClose = false;
this.window.setMaximizable(false);
this.window.setResizable(false);
this.window.setClosable(true);
graph.addListener('freehandStateChanged', mxUtils.bind(this, function()
{
stopBtn.className = 'geBtn' + (graph.freehand.isDrawing() ? ' gePrimaryBtn' : '');
}));
this.window.addListener('show', mxUtils.bind(this, function()
{
this.window.fit();
}));
this.window.addListener('hide', mxUtils.bind(this, function()
{
if (graph.freehand.isDrawing())
{
graph.freehand.stopDrawing();
}
}));
this.window.setLocation = function(x, y)
{
var iw = window.innerWidth || document.body.clientWidth || document.documentElement.clientWidth;
var ih = window.innerHeight || document.body.clientHeight || document.documentElement.clientHeight;
x = Math.max(0, Math.min(x, iw - this.table.clientWidth));
y = Math.max(0, Math.min(y, ih - this.table.clientHeight - 48));
if (this.getX() != x || this.getY() != y)
{
mxWindow.prototype.setLocation.apply(this, arguments);
}
};
var resizeListener = mxUtils.bind(this, function()
{
var x = this.window.getX();
var y = this.window.getY();
this.window.setLocation(x, y);
});
mxEvent.addListener(window, 'resize', resizeListener);
this.destroy = function()
{
mxEvent.removeListener(window, 'resize', resizeListener);
this.window.destroy();
}
};
/**
*
*/
@ -6613,6 +6872,12 @@ var AuthDialog = function(editorUi, peer, showRememberOption, fn)
service = mxResources.get('github');
img.src = IMAGE_PATH + '/github-logo-white.svg';
}
else if (peer == editorUi.gitLab)
{
service = mxResources.get('gitlab');
img.src = IMAGE_PATH + '/gitlab-logo.svg';
img.style.width = '32px';
}
else if (peer == editorUi.trello)
{
service = mxResources.get('trello');
@ -6718,6 +6983,114 @@ var MoreShapesDialog = function(editorUi, expanded, entries)
if (expanded)
{
var addEntries = mxUtils.bind(this, function(e)
{
for (var i = 0; i < e.length; i++)
{
(function(section)
{
var title = listEntry.cloneNode(false);
title.style.fontWeight = 'bold';
title.style.backgroundColor = (uiTheme == 'dark') ? '#505759' : '#e5e5e5';
title.style.padding = '6px 0px 6px 20px';
mxUtils.write(title, section.title);
list.appendChild(title);
for (var j = 0; j < section.entries.length; j++)
{
(function(entry)
{
var option = listEntry.cloneNode(false);
option.style.cursor = 'pointer';
option.style.padding = '4px 0px 4px 20px';
option.style.whiteSpace = 'nowrap';
option.style.overflow = 'hidden';
option.style.textOverflow = 'ellipsis';
option.setAttribute('title', entry.title + ' (' + entry.id + ')');
var checkbox = document.createElement('input');
checkbox.setAttribute('type', 'checkbox');
checkbox.checked = editorUi.sidebar.isEntryVisible(entry.id);
checkbox.defaultChecked = checkbox.checked;
option.appendChild(checkbox);
mxUtils.write(option, ' ' + entry.title);
list.appendChild(option);
var itemClicked = function(evt)
{
if (evt == null || mxEvent.getSource(evt).nodeName != 'INPUT')
{
preview.style.textAlign = 'center';
preview.style.padding = '0px';
preview.style.color = '';
preview.innerHTML = '';
if (entry.desc != null)
{
var pre = document.createElement('pre');
pre.style.boxSizing = 'border-box';
pre.style.fontFamily = 'inherit';
pre.style.margin = '20px';
pre.style.right = '0px';
pre.style.textAlign = 'left';
mxUtils.write(pre, entry.desc);
preview.appendChild(pre);
}
if (entry.imageCallback != null)
{
entry.imageCallback(preview);
}
else if (entry.image != null)
{
preview.innerHTML += '<img border="0" src="' + entry.image + '"/>';
}
else if (entry.desc == null)
{
preview.style.padding = '20px';
preview.style.color = 'rgb(179, 179, 179)';
mxUtils.write(preview, mxResources.get('noPreview'));
}
if (currentListItem != null)
{
currentListItem.style.backgroundColor = '';
}
currentListItem = option;
currentListItem.style.backgroundColor = (uiTheme == 'dark') ? '#505759' : '#ebf2f9';
if (evt != null)
{
mxEvent.consume(evt);
}
}
};
mxEvent.addListener(option, 'click', itemClicked);
mxEvent.addListener(option, 'dblclick', function(evt)
{
checkbox.checked = !checkbox.checked;
mxEvent.consume(evt);
});
applyFunctions.push(function()
{
return (checkbox.checked) ? entry.id : null;
});
// Selects first entry
if (i == 0 && j == 0)
{
itemClicked();
}
})(section.entries[j]);
}
})(e[i]);
}
});
var hd = document.createElement('div');
hd.className = 'geDialogTitle';
mxUtils.write(hd, mxResources.get('shapes'));
@ -6773,108 +7146,7 @@ var MoreShapesDialog = function(editorUi, expanded, entries)
listEntry.style.left = '0px';
listEntry.style.right = '0px';
for (var i = 0; i < entries.length; i++)
{
(function(section)
{
var title = listEntry.cloneNode(false);
title.style.fontWeight = 'bold';
title.style.backgroundColor = (uiTheme == 'dark') ? '#505759' : '#e5e5e5';
title.style.padding = '6px 0px 6px 20px';
mxUtils.write(title, section.title);
list.appendChild(title);
for (var j = 0; j < section.entries.length; j++)
{
(function(entry)
{
var option = listEntry.cloneNode(false);
option.style.cursor = 'pointer';
option.style.padding = '4px 0px 4px 20px';
option.setAttribute('title', entry.title + ' (' + entry.id + ')');
var checkbox = document.createElement('input');
checkbox.setAttribute('type', 'checkbox');
checkbox.checked = editorUi.sidebar.isEntryVisible(entry.id);
checkbox.defaultChecked = checkbox.checked;
option.appendChild(checkbox);
mxUtils.write(option, ' ' + entry.title);
list.appendChild(option);
var itemClicked = function(evt)
{
if (evt == null || mxEvent.getSource(evt).nodeName != 'INPUT')
{
preview.style.textAlign = 'center';
preview.style.padding = '0px';
preview.style.color = '';
preview.innerHTML = '';
if (entry.desc != null)
{
var pre = document.createElement('pre');
pre.style.boxSizing = 'border-box';
pre.style.fontFamily = 'inherit';
pre.style.margin = '20px';
pre.style.right = '0px';
pre.style.textAlign = 'left';
mxUtils.write(pre, entry.desc);
preview.appendChild(pre);
}
if (entry.imageCallback != null)
{
entry.imageCallback(preview);
}
else if (entry.image != null)
{
preview.innerHTML += '<img border="0" src="' + entry.image + '"/>';
}
else if (entry.desc == null)
{
preview.style.padding = '20px';
preview.style.color = 'rgb(179, 179, 179)';
mxUtils.write(preview, mxResources.get('noPreview'));
}
if (currentListItem != null)
{
currentListItem.style.backgroundColor = '';
}
currentListItem = option;
currentListItem.style.backgroundColor = (uiTheme == 'dark') ? '#505759' : '#ebf2f9';
if (evt != null)
{
mxEvent.consume(evt);
}
}
};
mxEvent.addListener(option, 'click', itemClicked);
mxEvent.addListener(option, 'dblclick', function(evt)
{
checkbox.checked = !checkbox.checked;
mxEvent.consume(evt);
});
applyFunctions.push(function()
{
return (checkbox.checked) ? entry.id : null;
});
// Selects first entry
if (i == 0 && j == 0)
{
itemClicked();
}
})(section.entries[j]);
}
})(entries[i]);
}
addEntries(entries);
div.style.padding = '30px';
div.appendChild(hd);
@ -9692,6 +9964,11 @@ var BtnDialog = function(editorUi, peer, btnLbl, fn)
service = mxResources.get('github');
img.src = IMAGE_PATH + '/github-logo-white.svg';
}
else if (peer == editorUi.gitLab)
{
service = mxResources.get('gitlab');
img.src = IMAGE_PATH + '/gitlab-logo.svg';
}
else if (peer == editorUi.trello)
{
service = mxResources.get('trello');

View file

@ -837,7 +837,9 @@ DrawioFile.prototype.save = function(revision, success, error, unloading, overwr
*/
DrawioFile.prototype.updateFileData = function()
{
this.setData(this.ui.getFileData(null, null, null, null, null, null, null, null, this));
var nonCompressed = (this.ui.fileNode != null) ? this.ui.fileNode.getAttribute('compressed') == 'false' : false;
this.setData(this.ui.getFileData(null, null, null, null, null, null, null, null, this, nonCompressed));
};
/**
@ -1636,8 +1638,8 @@ DrawioFile.prototype.handleConflictError = function(err, manual)
if (this.ui.spinner.spin(document.body, mxResources.get('saving')))
{
this.ui.editor.setStatus('');
this.save(true, success, error, null, true, (this.constructor ==
GitHubFile && err != null) ? err.commitMessage : null)
var isRepoFile = (this.constructor == GitHubFile) || (this.constructor == GitLabFile);
this.save(true, success, error, null, true, (isRepoFile && err != null) ? err.commitMessage : null)
}
});

View file

@ -32,6 +32,11 @@ DriveClient = function(editorUi)
this.mimeTypes = this.xmlMimeType + 'application/mxe,application/mxr,' +
'application/vnd.jgraph.mxfile.realtime,application/vnd.jgraph.mxfile.rtlegacy';
if (urlParams['photos'] == '1')
{
this.scopes.push('https://www.googleapis.com/auth/photos.upload');
}
};
// Extends mxEventSource
@ -40,15 +45,9 @@ mxUtils.extend(DriveClient, mxEventSource);
/**
* OAuth 2.0 scopes for installing Drive Apps.
*/
DriveClient.prototype.scopes = (urlParams['photos'] == '1') ?
['https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive.install',
'https://www.googleapis.com/auth/photos',
'https://www.googleapis.com/auth/photos.upload',
'https://www.googleapis.com/auth/userinfo.profile'] :
['https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive.install',
'https://www.googleapis.com/auth/userinfo.profile'];
DriveClient.prototype.scopes = ['https://www.googleapis.com/auth/drive.file',
'https://www.googleapis.com/auth/drive.install',
'https://www.googleapis.com/auth/userinfo.profile'];
/**
* Contains the hostname of the old app.
@ -869,38 +868,45 @@ DriveClient.prototype.isGoogleRealtimeMimeType = function(mimeType)
*/
DriveClient.prototype.getRealtimeData = function(id, success, error, retryCount)
{
this.executeRequest(gapi.client.drive.realtime.get({'fileId': id,
'supportsTeamDrives': true}), mxUtils.bind(this, function(resp)
if (App.GOOGLE_REALTIME_EOL - Date.now() < 0)
{
var json = (resp.result != null) ? resp.result.data : null;
if (json != null && json.value != null && json.value.diagrams != null)
{
success(json);
}
else if (error != null)
{
error({message: 'realtime.get returned invalid data for ' + id});
}
}), mxUtils.bind(this, function(resp)
error({message: 'Google Realtime API export endpoint no longer available'});
}
else
{
if (retryCount == null)
this.executeRequest(gapi.client.drive.realtime.get({'fileId': id,
'supportsTeamDrives': true}), mxUtils.bind(this, function(resp)
{
retryCount = 0;
}
if (retryCount < 3)
{
window.setTimeout(mxUtils.bind(this, function()
var json = (resp.result != null) ? resp.result.data : null;
if (json != null && json.value != null && json.value.diagrams != null)
{
this.getRealtimeData(id, success, error, retryCount + 1);
}), (retryCount + 1) * 100);
}
else if (error != null)
success(json);
}
else if (error != null)
{
error({message: 'realtime.get returned invalid data for ' + id});
}
}), mxUtils.bind(this, function(resp)
{
error({message: 'realtime.get failed for ' + id});
}
}));
if (retryCount == null)
{
retryCount = 0;
}
if (retryCount < 3)
{
window.setTimeout(mxUtils.bind(this, function()
{
this.getRealtimeData(id, success, error, retryCount + 1);
}), (retryCount + 1) * 100);
}
else if (error != null)
{
error({message: 'realtime.get failed for ' + id});
}
}));
}
};
/**
@ -2599,299 +2605,306 @@ DriveClient.prototype.convertRealtimeFiles = function()
output.scrollTop = output.scrollHeight;
});
print('draw.io (' + EditorUi.VERSION + ') is searching files to be converted...');
print('<a href="https://desk.draw.io/support/solutions/articles/16000092210" target="_blank">Click here for help</a>');
if (this.ui.spinner.spin(document.body, 'Searching files...'))
if (App.GOOGLE_REALTIME_EOL - Date.now() < 0)
{
this.checkToken(mxUtils.bind(this, function()
print('draw.io (' + EditorUi.VERSION + '): Google Realtime API export endpoint no longer available');
}
else
{
print('draw.io (' + EditorUi.VERSION + ') is searching files to be converted...');
print('<a href="https://desk.draw.io/support/solutions/articles/16000092210" target="_blank">Click here for help</a>');
if (this.ui.spinner.spin(document.body, 'Searching files...'))
{
var convertDelay = 2000;
var convertedIds = {};
var converted = 0;
var fromJson = 0;
var fromXml = 0;
var loadFail = 0;
var invalid = 0;
var saveFail = 0;
var failed = 0;
var total = 0;
var queryFail = 0;
var email = (this.user != null && this.user.email != null) ? this.user.email : null;
var q = 'mimeType=\'application/vnd.jgraph.mxfile.realtime\'' +
((email != null) ? ' and \'' + email + '\' in writers' : '');
var done = mxUtils.bind(this, function()
this.checkToken(mxUtils.bind(this, function()
{
this.ui.spinner.stop();
print('<br>Conversion complete. Successfully converted ' + converted + ' file(s).', true);
if (failed > 0)
var convertDelay = 2000;
var convertedIds = {};
var converted = 0;
var fromJson = 0;
var fromXml = 0;
var loadFail = 0;
var invalid = 0;
var saveFail = 0;
var failed = 0;
var total = 0;
var queryFail = 0;
var email = (this.user != null && this.user.email != null) ? this.user.email : null;
var q = 'mimeType=\'application/vnd.jgraph.mxfile.realtime\'' +
((email != null) ? ' and \'' + email + '\' in writers' : '');
var done = mxUtils.bind(this, function()
{
print(' Failed to convert ' + failed + ' file(s).<br><br><b>ACTION REQUIRED:</b><br><ul><li>Click ' +
'<a target="_blank" href="https://drive.google.com/drive/u/0/search?q=type:application/vnd.jgraph.mxfile.realtime">here</a> ' +
'to list all affected files</li><li>Open each file in turn by right-clicking the file and selecting open with draw.io</li>' +
'<li>Open each file in turn. When loaded, select File->Save</li></ul>');
}
else
{
print('<br><br>This window can now be closed.')
}
try
{
var dt = Date.now() - t0;
this.ui.spinner.stop();
print('<br>Conversion complete. Successfully converted ' + converted + ' file(s).', true);
// Logs conversion
EditorUi.logEvent({category: 'AUTO-CONVERT',
action: 'total_' + total + '-done_' + converted +
'-fail_' + failed + '-xml_' + fromXml + '-json_' + fromJson +
'-load_' + loadFail + '-save_' + saveFail +
'-invalid_' + invalid + '-dt-' + Math.round(dt / 1000),
label: (this.user != null) ? ('user_' + this.user.id) : '-nouser'});
}
catch (e)
{
// ignore
}
});
var getMessage = function(err)
{
return (err == null) ? '' : ((err.message != null) ? err.message : ((err.error != null &&
err.error.message != null) ? err.error.message : ''));
};
var doConvert = mxUtils.bind(this, function()
{
if (this.ui.spinner.spin(document.body, 'Converting ' + total + ' file(s)'))
{
print('Found ' + total + ' file(s). This will take up to ' + Math.ceil((total * (convertDelay + 3000)) / 60000) +
' minute(s). <b>Please do not close this window!</b><br>');
var counter = 0;
// Does not show picker if there are no folders in the root
var nextPage = mxUtils.bind(this, function(token, delay)
if (failed > 0)
{
var query = {'maxResults': 1, 'q': q, 'includeTeamDriveItems': true, 'supportsTeamDrives': true};
print(' Failed to convert ' + failed + ' file(s).<br><br><b>ACTION REQUIRED:</b><br><ul><li>Click ' +
'<a target="_blank" href="https://drive.google.com/drive/u/0/search?q=type:application/vnd.jgraph.mxfile.realtime">here</a> ' +
'to list all affected files</li><li>Open each file in turn by right-clicking the file and selecting open with draw.io</li>' +
'<li>Open each file in turn. When loaded, select File->Save</li></ul>');
}
else
{
print('<br><br>This window can now be closed.')
}
try
{
var dt = Date.now() - t0;
if (token != null)
// Logs conversion
EditorUi.logEvent({category: 'AUTO-CONVERT',
action: 'total_' + total + '-done_' + converted +
'-fail_' + failed + '-xml_' + fromXml + '-json_' + fromJson +
'-load_' + loadFail + '-save_' + saveFail +
'-invalid_' + invalid + '-dt-' + Math.round(dt / 1000),
label: (this.user != null) ? ('user_' + this.user.id) : '-nouser'});
}
catch (e)
{
// ignore
}
});
var getMessage = function(err)
{
return (err == null) ? '' : ((err.message != null) ? err.message : ((err.error != null &&
err.error.message != null) ? err.error.message : ''));
};
var doConvert = mxUtils.bind(this, function()
{
if (this.ui.spinner.spin(document.body, 'Converting ' + total + ' file(s)'))
{
print('Found ' + total + ' file(s). This will take up to ' + Math.ceil((total * (convertDelay + 3000)) / 60000) +
' minute(s). <b>Please do not close this window!</b><br>');
var counter = 0;
// Does not show picker if there are no folders in the root
var nextPage = mxUtils.bind(this, function(token, delay)
{
query.pageToken = token;
}
var acceptResponse = true;
var timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
nextPage(token, delay);
}), this.ui.timeout);
this.executeRequest(gapi.client.drive.files.list(query), mxUtils.bind(this, function(res)
{
window.clearTimeout(timeoutThread);
var query = {'maxResults': 1, 'q': q, 'includeTeamDriveItems': true, 'supportsTeamDrives': true};
if (acceptResponse)
if (token != null)
{
var doNextPage = mxUtils.bind(this, function()
query.pageToken = token;
}
var acceptResponse = true;
var timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
nextPage(token, delay);
}), this.ui.timeout);
this.executeRequest(gapi.client.drive.files.list(query), mxUtils.bind(this, function(res)
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
if (res.nextPageToken != null)
var doNextPage = mxUtils.bind(this, function()
{
nextPage(res.nextPageToken);
if (res.nextPageToken != null)
{
nextPage(res.nextPageToken);
}
else
{
done();
}
});
if (res != null && res.error != null)
{
queryFail++;
if (queryFail < 4)
{
nextPage(token, delay);
}
else
{
this.ui.spinner.stop();
print('Query for next file failed multiple times. Exiting.<br><br>This window can now be closed.');
}
}
else if (res != null && (res.items == null || res.items.length == 0) &&
res.nextPageToken != null)
{
// Next page can still contain results, see
// https://stackoverflow.com/questions/23741845
nextPage(res.nextPageToken, 10000);
}
else if (res != null && res.items != null && res.items.length > 0)
{
var fileId = res.items[0].id;
this.ui.spinner.stop();
counter++;
if (this.ui.spinner.spin(document.body, 'Converting file ' + counter + ' of ' + total))
{
print('Converting ' + counter + ' of ' + total + ': "' + mxUtils.htmlEntities(res.items[0].title) +
'" (<a href="https://drive.google.com/open?id=' + fileId + '" target="_blank">' + fileId + '</a>)... ', true);
window.setTimeout(mxUtils.bind(this, function()
{
// Exits if same file is returned twice
if (convertedIds[fileId] == null)
{
convertedIds[fileId] = true;
acceptResponse = true;
timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
failed++;
loadFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> Timeout');
doNextPage();
}), this.ui.timeout);
this.getFile(fileId, mxUtils.bind(this, function(file)
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
if (file.constructor == DriveFile)
{
if (file.convertedFrom == 'json')
{
fromJson++;
}
else
{
fromXml++;
}
acceptResponse = true;
timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
failed++;
saveFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> Timeout');
doNextPage();
}), this.ui.timeout);
this.saveFile(file, null, mxUtils.bind(this, function()
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
converted++;
print('OK <img src="' + Editor.checkmarkImage + '" border="0" valign="middle"/>');
doNextPage();
}
}), mxUtils.bind(this, function(err)
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
var msg = getMessage(err);
failed++;
saveFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> ' + msg);
doNextPage();
}
}));
}
else
{
failed++;
invalid++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> Invalid file');
doNextPage();
}
}
}), mxUtils.bind(this, function(err)
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
var msg = getMessage(err);
failed++;
loadFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> ' + msg);
doNextPage();
}
}));
}
else
{
this.ui.spinner.stop();
print('Search returned duplicate file ' + fileId + '. Exiting.<br><br>This window can now be closed.');
}
}), (delay != null) ? delay : convertDelay)
}
}
else
{
done();
}
});
if (res != null && res.error != null)
{
queryFail++;
if (queryFail < 4)
{
nextPage(token, delay);
}
else
{
this.ui.spinner.stop();
print('Query for next file failed multiple times. Exiting.<br><br>This window can now be closed.');
}
}
else if (res != null && (res.items == null || res.items.length == 0) &&
res.nextPageToken != null)
{
// Next page can still contain results, see
// https://stackoverflow.com/questions/23741845
nextPage(res.nextPageToken, 10000);
}
else if (res != null && res.items != null && res.items.length > 0)
{
var fileId = res.items[0].id;
this.ui.spinner.stop();
counter++;
if (this.ui.spinner.spin(document.body, 'Converting file ' + counter + ' of ' + total))
{
print('Converting ' + counter + ' of ' + total + ': "' + mxUtils.htmlEntities(res.items[0].title) +
'" (<a href="https://drive.google.com/open?id=' + fileId + '" target="_blank">' + fileId + '</a>)... ', true);
window.setTimeout(mxUtils.bind(this, function()
{
// Exits if same file is returned twice
if (convertedIds[fileId] == null)
{
convertedIds[fileId] = true;
acceptResponse = true;
timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
failed++;
loadFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> Timeout');
doNextPage();
}), this.ui.timeout);
this.getFile(fileId, mxUtils.bind(this, function(file)
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
if (file.constructor == DriveFile)
{
if (file.convertedFrom == 'json')
{
fromJson++;
}
else
{
fromXml++;
}
acceptResponse = true;
timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
failed++;
saveFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> Timeout');
doNextPage();
}), this.ui.timeout);
this.saveFile(file, null, mxUtils.bind(this, function()
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
converted++;
print('OK <img src="' + Editor.checkmarkImage + '" border="0" valign="middle"/>');
doNextPage();
}
}), mxUtils.bind(this, function(err)
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
var msg = getMessage(err);
failed++;
saveFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> ' + msg);
doNextPage();
}
}));
}
else
{
failed++;
invalid++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> Invalid file');
doNextPage();
}
}
}), mxUtils.bind(this, function(err)
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
var msg = getMessage(err);
failed++;
loadFail++;
print('<img src="' + this.ui.editor.graph.warningImage.src + '" border="0" valign="absmiddle"/> ' + msg);
doNextPage();
}
}));
}
else
{
this.ui.spinner.stop();
print('Search returned duplicate file ' + fileId + '. Exiting.<br><br>This window can now be closed.');
}
}), (delay != null) ? delay : convertDelay)
}
}
else
{
done();
}
}
}));
});
nextPage();
}
});
var totals = {'maxResults': 10000, 'q': q, 'includeTeamDriveItems': true, 'supportsTeamDrives': true};
var count = mxUtils.bind(this, function(token)
{
if (token != null)
{
totals.pageToken = token;
}
this.executeRequest(gapi.client.drive.files.list(totals), mxUtils.bind(this, function(res)
{
total += (res != null && res.items != null) ? res.items.length : 0;
if (res.nextPageToken != null)
{
count(res.nextPageToken);
}
else
{
this.ui.spinner.stop();
}));
});
this.ui.showError('Confirm', 'You are about to convert ' + total + ' file(s)',
'Cancel', mxUtils.bind(this, function()
{
print('Cancelled by user.<br><br>This window can now be closed.');
}), null, 'OK', doConvert, 'Help', function()
{
window.open('https://desk.draw.io/support/solutions/articles/16000092210');
}, 340, 120);
nextPage();
}
}));
});
count();
}));
}
else
{
this.ui.spinner.stop();
print('Busy. <br><br>This window can now be closed.');
});
var totals = {'maxResults': 10000, 'q': q, 'includeTeamDriveItems': true, 'supportsTeamDrives': true};
var count = mxUtils.bind(this, function(token)
{
if (token != null)
{
totals.pageToken = token;
}
this.executeRequest(gapi.client.drive.files.list(totals), mxUtils.bind(this, function(res)
{
total += (res != null && res.items != null) ? res.items.length : 0;
if (res.nextPageToken != null)
{
count(res.nextPageToken);
}
else
{
this.ui.spinner.stop();
this.ui.showError('Confirm', 'You are about to convert ' + total + ' file(s)',
'Cancel', mxUtils.bind(this, function()
{
print('Cancelled by user.<br><br>This window can now be closed.');
}), null, 'OK', doConvert, 'Help', function()
{
window.open('https://desk.draw.io/support/solutions/articles/16000092210');
}, 340, 120);
}
}));
});
count();
}));
}
else
{
this.ui.spinner.stop();
print('Busy. <br><br>This window can now be closed.');
}
}
};

View file

@ -435,12 +435,7 @@
if (diagramNode != null)
{
var tmp = Graph.decompress(mxUtils.getTextContent(diagramNode));
if (tmp != null && tmp.length > 0)
{
node = mxUtils.parseXml(tmp).documentElement;
}
node = Editor.parseDiagramNode(diagramNode);
}
}
@ -452,6 +447,59 @@
return node;
};
/**
* Extracts the XML from the compressed or non-compressed text chunk.
*/
Editor.parseDiagramNode = function(diagramNode)
{
var text = mxUtils.trim(mxUtils.getTextContent(diagramNode));
var node = null;
if (text.length > 0)
{
var tmp = Graph.decompress(text);
if (tmp != null && tmp.length > 0)
{
node = mxUtils.parseXml(tmp).documentElement;
}
}
else
{
var temp = mxUtils.getChildNodes(diagramNode);
if (temp.length > 0)
{
// Creates new document for unique IDs within mxGraphModel
var doc = mxUtils.createXmlDocument();
doc.appendChild(doc.importNode(temp[0], true));
node = doc.documentElement;
}
}
return node;
};
/**
* Extracts the XML from the compressed or non-compressed text chunk.
*/
Editor.getDiagramNodeXml = function(diagramNode)
{
var text = mxUtils.getTextContent(diagramNode);
var xml = null;
if (text.length > 0)
{
xml = Graph.decompress(text);
}
else if (diagramNode.firstChild != null)
{
xml = mxUtils.getXml(diagramNode.firstChild);
}
return xml;
};
/**
* Extracts the XML from the compressed or non-compressed text chunk.
*/
@ -3620,8 +3668,18 @@
{
var rackLayout = new mxStackLayout(this.graph, false);
var unitSize = 20;
if (style['rackUnitSize'] != null)
{
rackLayout.gridSize = parseFloat(style['rackUnitSize']);
}
else
{
rackLayout.gridSize = (typeof mxRackContainer !== 'undefined') ? mxRackContainer.unitSize : unitSize;
}
rackLayout.fill = true;
rackLayout.gridSize = (typeof mxRackContainer !== 'undefined') ? mxRackContainer.unitSize : 20;
rackLayout.marginLeft = style['marginLeft'] || 0;
rackLayout.marginRight = style['marginRight'] || 0;
rackLayout.marginTop = style['marginTop'] || 0;

View file

@ -262,7 +262,18 @@
}
while (n);
};
/**
* Removes any values, styles and geometries from the given XML node.
*/
EditorUi.removeChildNodes = function(node)
{
while (node.firstChild != null)
{
node.removeChild(node.firstChild);
}
};
/**
* Contains the default XML for an empty diagram.
*/
@ -834,7 +845,8 @@
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
EditorUi.prototype.createFileData = function(node, graph, file, url, forceXml, forceSvg, forceHtml, embeddedCallback, ignoreSelection, compact)
EditorUi.prototype.createFileData = function(node, graph, file, url, forceXml, forceSvg, forceHtml,
embeddedCallback, ignoreSelection, compact, nonCompressed)
{
graph = (graph != null) ? graph : this.editor.graph;
forceXml = (forceXml != null) ? forceXml : false;
@ -864,25 +876,37 @@
// Ignores case for possible HTML or XML nodes
if (fileNode.nodeName.toLowerCase() != 'mxfile')
{
// Removes control chars in input for correct roundtrip check
var text = Graph.zapGremlins(mxUtils.getXml(node));
var data = Graph.compress(text);
// Fallback to plain XML for invalid compression
// TODO: Remove this fallback with active pages
if (Graph.decompress(data) != text)
{
return text;
}
else
if (nonCompressed)
{
var diagramNode = node.ownerDocument.createElement('diagram');
diagramNode.setAttribute('id', Editor.guid());
mxUtils.setTextContent(diagramNode, data);
diagramNode.appendChild(node);
fileNode = node.ownerDocument.createElement('mxfile');
fileNode.appendChild(diagramNode);
}
else
{
// Removes control chars in input for correct roundtrip check
var text = Graph.zapGremlins(mxUtils.getXml(node));
var data = Graph.compress(text);
// Fallback to plain XML for invalid compression
// TODO: Remove this fallback with active pages
if (Graph.decompress(data) != text)
{
return text;
}
else
{
var diagramNode = node.ownerDocument.createElement('diagram');
diagramNode.setAttribute('id', Editor.guid());
mxUtils.setTextContent(diagramNode, data);
fileNode = node.ownerDocument.createElement('mxfile');
fileNode.appendChild(diagramNode);
}
}
}
if (!compact)
@ -906,6 +930,11 @@
{
fileNode.setAttribute('type', md);
}
if (nonCompressed)
{
fileNode.setAttribute('compressed', 'false');
}
}
else
{
@ -916,7 +945,7 @@
fileNode.removeAttribute('type');
}
var xml = mxUtils.getXml(fileNode);
var xml = (nonCompressed) ? mxUtils.getPrettyXml(fileNode) : mxUtils.getXml(fileNode);
// Writes the file as an embedded HTML file
if (!forceSvg && !forceXml && (forceHtml || (file != null && /(\.html)$/i.test(file.getTitle()))))
@ -944,7 +973,7 @@
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
EditorUi.prototype.getXmlFileData = function(ignoreSelection, currentPage)
EditorUi.prototype.getXmlFileData = function(ignoreSelection, currentPage, nonCompressed)
{
ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true;
currentPage = (currentPage != null) ? currentPage : false;
@ -953,8 +982,17 @@
if (ignoreSelection && this.fileNode != null && this.currentPage != null)
{
var data = Graph.compressNode(node);
mxUtils.setTextContent(this.currentPage.node, data);
if (nonCompressed)
{
EditorUi.removeChildNodes(this.currentPage.node);
this.currentPage.node.appendChild(node);
}
else
{
var data = Graph.compressNode(node);
mxUtils.setTextContent(this.currentPage.node, data);
}
node = this.fileNode.cloneNode(false);
if (currentPage)
@ -966,15 +1004,33 @@
// Restores order of pages
for (var i = 0; i < this.pages.length; i++)
{
if (this.currentPage != this.pages[i] && this.pages[i].needsUpdate)
if (this.currentPage != this.pages[i])
{
var enc = new mxCodec(mxUtils.createXmlDocument());
var temp = enc.encode(new mxGraphModel(this.pages[i].root));
this.editor.graph.saveViewState(this.pages[i].viewState, temp);
mxUtils.setTextContent(this.pages[i].node, Graph.compressNode(temp));
// Marks the page as up-to-date
delete this.pages[i].needsUpdate;
if (this.pages[i].needsUpdate)
{
var enc = new mxCodec(mxUtils.createXmlDocument());
var temp = enc.encode(new mxGraphModel(this.pages[i].root));
this.editor.graph.saveViewState(this.pages[i].viewState, temp);
if (nonCompressed)
{
EditorUi.removeChildNodes(this.pages[i].node);
this.pages[i].node.appendChild(temp);
}
else
{
mxUtils.setTextContent(this.pages[i].node, Graph.compressNode(temp));
}
// Marks the page as up-to-date
delete this.pages[i].needsUpdate;
}
else if (nonCompressed)
{
var temp = Editor.parseDiagramNode(this.pages[i].node);
EditorUi.removeChildNodes(this.pages[i].node);
this.pages[i].node.appendChild(temp);
}
}
node.appendChild(this.pages[i].node);
@ -1247,12 +1303,13 @@
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
EditorUi.prototype.getFileData = function(forceXml, forceSvg, forceHtml, embeddedCallback, ignoreSelection, currentPage, node, compact, file)
EditorUi.prototype.getFileData = function(forceXml, forceSvg, forceHtml, embeddedCallback, ignoreSelection,
currentPage, node, compact, file, nonCompressed)
{
ignoreSelection = (ignoreSelection != null) ? ignoreSelection : true;
currentPage = (currentPage != null) ? currentPage : false;
node = (node != null) ? node : this.getXmlFileData(ignoreSelection, currentPage);
node = (node != null) ? node : this.getXmlFileData(ignoreSelection, currentPage, nonCompressed);
file = (file != null) ? file : this.getCurrentFile();
var graph = this.editor.graph;
@ -1284,7 +1341,8 @@
}
var result = this.createFileData(node, graph, file, window.location.href,
forceXml, forceSvg, forceHtml, embeddedCallback, ignoreSelection, compact);
forceXml, forceSvg, forceHtml, embeddedCallback, ignoreSelection, compact,
nonCompressed);
// Removes temporary graph from DOM
if (graph != this.editor.graph)
@ -1433,7 +1491,7 @@
this.pages = null;
var node = (data != null && data.length > 0) ? mxUtils.parseXml(data).documentElement : null;
// Checks for parser errors
var errors = (node != null) ? node.getElementsByTagName('parsererror') : null;
@ -1459,7 +1517,7 @@
{
node = tmp;
}
if (node != null && node.nodeName == 'mxfile')
{
var nodes = node.getElementsByTagName('diagram');
@ -1568,8 +1626,8 @@
if (format == 'xml')
{
var data = '<?xml version="1.0" encoding="UTF-8"?>\n' +
((nonCompressed) ? mxUtils.getXml(this.editor.getGraphXml(ignoreSelection)) :
this.getFileData(true, null, null, null, ignoreSelection, currentPage));
this.getFileData(true, null, null, null, ignoreSelection, currentPage,
null, null, null, nonCompressed);
this.saveData(filename, format, data, 'text/xml');
}
@ -2343,6 +2401,7 @@
// Makes sure the file does not save the invalid UI model and overwrites anything important
if (window.console != null)
{
console.error(e);
console.log('error in fileLoaded:', file, e);
}
@ -3137,8 +3196,7 @@
for (var i = 0; i < pages.length; i++)
{
var temp = mxUtils.getTextContent(pages[i]);
var cells = this.stringToCells(Graph.decompress(temp));
var cells = this.stringToCells(Editor.getDiagramNodeXml(pages[i]));
var size = this.editor.graph.getBoundingBoxFromGeometry(cells);
addCells(cells, new mxRectangle(0, 0, size.width, size.height), evt);
}
@ -3988,7 +4046,7 @@
}
else
{
win.document.write(mxUtils.htmlEntities(data, false));
win.document.write('<pre>' + mxUtils.htmlEntities(data, false) + '<pre>');
win.document.close();
}
}
@ -5736,12 +5794,7 @@
if (diagramNode != null)
{
var tmp = Graph.decompress(mxUtils.getTextContent(diagramNode));
if (tmp != null && tmp.length > 0)
{
node = mxUtils.parseXml(tmp).documentElement;
}
node = Editor.parseDiagramNode(diagramNode);
}
}
@ -6570,7 +6623,7 @@
if (diagrams.length == 1)
{
node = mxUtils.parseXml(Graph.decompress(mxUtils.getTextContent(diagrams[0]))).documentElement;
node = Editor.parseDiagramNode(diagrams[0]);
}
else if (diagrams.length > 1)
{
@ -6581,7 +6634,7 @@
// Adds first page to current page if current page is only page and empty
if (this.pages != null && this.pages.length == 1 && this.isDiagramEmpty())
{
node = mxUtils.parseXml(Graph.decompress(mxUtils.getTextContent(diagrams[0]))).documentElement;
node = Editor.parseDiagramNode(diagrams[0]);
crop = false;
i0 = 1;
}
@ -10810,7 +10863,8 @@
Editor.defaultCsvValue, mxUtils.bind(this, function(newValue)
{
this.importCsv(newValue);
}), null, null, 620, 430, null, true, true, mxResources.get('import'));
}), null, null, 620, 430, null, true, true, mxResources.get('import'),
!this.isOffline() ? 'https://about.draw.io/import-from-csv-to-drawio/' : null);
}
this.showDialog(this.importCsvDialog.container, 640, 520, true, true, null, null, null, null, true);
@ -11663,7 +11717,7 @@
*/
EditorUi.prototype.getServiceCount = function(allowBrowser, splash)
{
var serviceCount = 0;
var serviceCount = 1;
if (this.drive != null || typeof window.DriveClient === 'function')
{
@ -11685,16 +11739,12 @@
serviceCount++
}
if (!splash && (this.trello != null || typeof window.TrelloClient === 'function'))
if (!splash && (this.gitLab != null))
{
serviceCount++
}
if (allowBrowser && isLocalStorage && urlParams['browser'] == '1')
{
serviceCount++
}
else
if (splash && allowBrowser && isLocalStorage && urlParams['browser'] == '1')
{
serviceCount++
}
@ -12159,7 +12209,7 @@
var libsSection = document.createElement('div');
libsSection.style.cssText = 'border:1px solid lightGray;overflow: auto;height:300px';
libsSection.innerHTML = '<img src="/images/spin.gif">';
libsSection.innerHTML = '<div style="text-align:center;padding:8px;"><img src="/images/spin.gif"></div>';
var loadedLibs = {};
@ -12222,10 +12272,17 @@
})(lib, libCheck)
}
}
}, function()
}, mxUtils.bind(this, function(e)
{
this.handleError(null, mxResources.get('errorLoadingFile'));
});
libsSection.innerHTML = '';
var status = document.createElement('div');
status.style.padding = '8px';
status.style.textAlign = 'center';
mxUtils.write(status, mxResources.get('error') + ': ');
mxUtils.write(status, (e != null && e.message != null) ?
e.message : mxResources.get('unknownError'));
libsSection.appendChild(status);
}));
div.appendChild(libsSection);
@ -12277,7 +12334,7 @@
if (pendingLibs == 0) this.spinner.stop();
}), null, null, 'https://desk.draw.io/support/solutions/articles/16000092763');
this.showDialog(dlg.container, 340, 375, true, true);
this.showDialog(dlg.container, 340, 375, true, true, null, null, null, null, true);
};
//Remote invokation, currently limited to functions in EditorUi (and its sub objects) for security reasons
@ -12320,9 +12377,27 @@
EditorUi.prototype.remoteInvoke = function(remoteFn, remoteFnArgs, msgMarkers, callback, error)
{
var acceptResponse = true;
var timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
error({code: App.ERROR_TIMEOUT, message: mxResources.get('timeout')});
}), this.timeout);
var wrapper = mxUtils.bind(this, function()
{
window.clearTimeout(timeoutThread);
if (acceptResponse)
{
callback.apply(this, arguments);
}
});
msgMarkers = msgMarkers || {};
msgMarkers.callbackId = this.remoteInvokeCallbacks.length;
this.remoteInvokeCallbacks.push({callback: callback, error: error});
this.remoteInvokeCallbacks.push({callback: wrapper, error: error});
var msg = JSON.stringify({event: 'remoteInvoke', funtionName: remoteFn, functionArgs: remoteFnArgs, msgMarkers: msgMarkers});
if (this.remoteWin != null) //remote invoke is ready

View file

@ -2,9 +2,9 @@
* Copyright (c) 2006-2017, JGraph Ltd
* Copyright (c) 2006-2017, Gaudenz Alder
*/
GitHubClient = function(editorUi)
GitHubClient = function(editorUi, authName)
{
DrawioClient.call(this, editorUi, 'ghauth');
DrawioClient.call(this, editorUi, authName || 'ghauth');
};
// Extends DrawioClient
@ -47,7 +47,7 @@ GitHubClient.prototype.updateUser = function(success, error, failOnAuth)
var timeoutThread = window.setTimeout(mxUtils.bind(this, function()
{
acceptResponse = false;
error({code: App.ERROR_TIMEOUT});
error({code: App.ERROR_TIMEOUT, message: mxResources.get('timeout')});
}), this.ui.timeout);
mxUtils.get(this.baseUrl + '/user?access_token=' + this.token, mxUtils.bind(this, function(userReq)
@ -78,14 +78,21 @@ GitHubClient.prototype.updateUser = function(success, error, failOnAuth)
}
else
{
var userInfo = JSON.parse(userReq.getText());
this.setUser(new DrawioUser(userInfo.id, userInfo.email, userInfo.name));
this.setUser(this.createUser(JSON.parse(userReq.getText())));
success();
}
}
}));
};
/**
* Authorizes the client, gets the userId and calls <open>.
*/
GitHubClient.prototype.createUser = function(userInfo)
{
return new DrawioUser(userInfo.id, userInfo.email, userInfo.name);
};
/**
* Authorizes the client, gets the userId and calls <open>.
*/
@ -552,8 +559,9 @@ GitHubClient.prototype.showCommitDialog = function(filename, isNew, success, can
}), mxResources.get('commitMessage'), null, null, null, null, mxUtils.bind(this, function()
{
cancel();
}));
this.ui.showDialog(dlg.container, 300, 80, true, false);
}), null, 280);
this.ui.showDialog(dlg.container, 400, 80, true, false);
dlg.init();
};
@ -739,6 +747,9 @@ GitHubClient.prototype.showGitHubDialog = function(showFiles, fn)
var div = document.createElement('div');
div.style.whiteSpace = 'nowrap';
div.style.border = '1px solid lightgray';
div.style.boxSizing = 'border-box';
div.style.padding = '4px';
div.style.overflow = 'auto';
div.style.lineHeight = '1.2em';
div.style.height = '194px';
@ -759,6 +770,7 @@ GitHubClient.prototype.showGitHubDialog = function(showFiles, fn)
{
var link = document.createElement('a');
link.setAttribute('href', 'javascript:void(0);');
link.setAttribute('title', label);
mxUtils.write(link, label);
mxEvent.addListener(link, 'click', fn);
@ -864,15 +876,35 @@ GitHubClient.prototype.showGitHubDialog = function(showFiles, fn)
}
else
{
var gray = true;
var listFiles = mxUtils.bind(this, function(showFolders)
{
for (var i = 0; i < files.length; i++)
{
(mxUtils.bind(this, function(file)
(mxUtils.bind(this, function(file, idx)
{
if (showFolders == (file.type == 'dir'))
{
div.appendChild(createLink(file.name + ((file.type == 'dir') ? '/' : ''), mxUtils.bind(this, function()
var temp = document.createElement('div');
temp.style.textOverflow = 'ellipsis';
temp.style.boxSizing = 'border-box';
temp.style.overflow = 'hidden';
temp.style.padding = '4px';
temp.style.width = '100%';
temp.style.backgroundColor = (gray) ? '#eeeeee' : '';
gray = !gray;
var typeImg = document.createElement('img');
typeImg.src = IMAGE_PATH + '/' + (file.type == 'dir'? 'folder.png' : 'file.png');
typeImg.setAttribute('align', 'absmiddle');
typeImg.style.marginRight = '4px';
typeImg.style.marginTop = '-4px';
typeImg.width = 20;
temp.appendChild(typeImg);
temp.appendChild(createLink(file.name + ((file.type == 'dir') ? '/' : ''), mxUtils.bind(this, function()
{
if (file.type == 'dir')
{
@ -885,9 +917,10 @@ GitHubClient.prototype.showGitHubDialog = function(showFiles, fn)
fn(org + '/' + repo + '/' + encodeURIComponent(ref) + '/' + file.path);
}
})));
mxUtils.br(div);
div.appendChild(temp);
}
}))(files[i]);
}))(files[i], i);
}
});
@ -1097,9 +1130,18 @@ GitHubClient.prototype.showGitHubDialog = function(showFiles, fn)
for (var i = 0; i < repos.length; i++)
{
(mxUtils.bind(this, function(repository)
(mxUtils.bind(this, function(repository, idx)
{
div.appendChild(createLink(repository.full_name, mxUtils.bind(this, function()
var temp = document.createElement('div');
temp.style.textOverflow = 'ellipsis';
temp.style.boxSizing = 'border-box';
temp.style.overflow = 'hidden';
temp.style.padding = '4px';
temp.style.width = '100%';
temp.style.backgroundColor = (idx % 2 == 0) ? '#eeeeee' : '';
temp.appendChild(createLink(repository.full_name, mxUtils.bind(this, function()
{
org = repository.owner.login;
repo = repository.name;
@ -1108,8 +1150,9 @@ GitHubClient.prototype.showGitHubDialog = function(showFiles, fn)
selectFile();
})));
mxUtils.br(div);
}))(repos[i]);
div.appendChild(temp);
}))(repos[i], i);
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,278 @@
/**
* Copyright (c) 2006-2017, JGraph Ltd
* Copyright (c) 2006-2017, Gaudenz Alder
*/
GitLabFile = function(ui, data, meta)
{
DrawioFile.call(this, ui, data);
this.meta = meta;
};
//Extends mxEventSource
mxUtils.extend(GitLabFile, GitHubFile);
/**
* Translates this point by the given vector.
*
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
GitLabFile.prototype.getId = function()
{
return encodeURIComponent(this.meta.org) + '/' +
((this.meta.repo != null) ? encodeURIComponent(this.meta.repo) + '/' +
((this.meta.ref != null) ? this.meta.ref +
((this.meta.path != null) ? '/' + this.meta.path : '') : '') : '');
};
/**
* Translates this point by the given vector.
*
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
GitLabFile.prototype.getHash = function()
{
return encodeURIComponent('A' + this.getId());
};
/**
* Returns true if copy, export and print are not allowed for this file.
*/
GitLabFile.prototype.getPublicUrl = function(fn)
{
// LATER: Check if download_url is always null for private repos
if (this.meta.download_url != null)
{
mxUtils.get(this.meta.download_url, mxUtils.bind(this, function(req)
{
fn((req.getStatus() >= 200 && req.getStatus() <= 299) ? this.meta.download_url : null);
}), mxUtils.bind(this, function()
{
fn(null);
}));
}
else
{
fn(null);
}
};
/**
* Adds the listener for automatically saving the diagram for local changes.
*/
GitLabFile.prototype.isConflict = function(err)
{
return err != null && err.status == 400;
};
/**
* Translates this point by the given vector.
*
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
GitLabFile.prototype.getMode = function()
{
return App.MODE_GITLAB;
};
/**
* Adds the listener for automatically saving the diagram for local changes.
*/
GitLabFile.prototype.getLatestVersion = function(success, error)
{
this.ui.gitLab.getFile(this.getId(), success, error);
};
/**
* Adds all listeners.
*/
GitLabFile.prototype.getDescriptorEtag = function(desc)
{
return desc.last_commit_id;
};
/**
* Adds the listener for automatically saving the diagram for local changes.
*/
GitLabFile.prototype.setDescriptorEtag = function(desc, etag)
{
desc.last_commit_id = etag;
};
/**
* Translates this point by the given vector.
*
* @param {number} dx X-coordinate of the translation.
* @param {number} dy Y-coordinate of the translation.
*/
GitLabFile.prototype.saveFile = function(title, revision, success, error, unloading, overwrite, message)
{
if (!this.isEditable())
{
if (success != null)
{
success();
}
}
else if (!this.savingFile)
{
var doSave = mxUtils.bind(this, function(message)
{
if (this.getTitle() == title)
{
var prevModified = null;
var modified = null;
try
{
// Makes sure no changes get lost while the file is saved
prevModified = this.isModified;
modified = this.isModified();
this.savingFile = true;
this.savingFileTime = new Date();
// Makes sure no changes get lost while the file is saved
var prepare = mxUtils.bind(this, function()
{
this.setModified(false);
this.isModified = function()
{
return modified;
};
});
var savedEtag = this.getCurrentEtag();
var savedData = this.data;
prepare();
this.ui.gitLab.saveFile(this, mxUtils.bind(this, function(commit)
{
this.isModified = prevModified;
this.savingFile = false;
this.meta.sha = commit.content.sha;
this.meta.html_url = commit.content.html_url;
this.meta.download_url = commit.content.download_url;
this.meta.last_commit_id = commit.content.last_commit_id;
this.fileSaved(savedData, savedEtag, mxUtils.bind(this, function()
{
this.contentChanged();
if (success != null)
{
success();
}
}), error);
}),
mxUtils.bind(this, function(err)
{
this.savingFile = false;
this.isModified = prevModified;
this.setModified(modified || this.isModified());
if (this.isConflict(err))
{
this.inConflictState = true;
if (error != null)
{
// Passes current commit message to avoid
// multiple dialogs after synchronize
error({commitMessage: message});
}
}
else if (error != null)
{
// Handles modified state for retries
if (err != null && err.retry != null)
{
var retry = err.retry;
err.retry = function()
{
prepare();
retry();
};
}
error(err);
}
}), overwrite, message);
}
catch (e)
{
this.savingFile = false;
if (prevModified != null)
{
this.isModified = prevModified;
}
if (modified != null)
{
this.setModified(modified || this.isModified());
}
if (error != null)
{
error(e);
}
else
{
throw e;
}
}
}
else
{
this.savingFile = true;
this.ui.pickFolder(App.MODE_GITLAB, mxUtils.bind(this, function(folderId)
{
this.ui.gitLab.insertFile(title, this.getData(), mxUtils.bind(this, function(file)
{
this.savingFile = false;
if (success != null)
{
success();
}
this.ui.fileLoaded(file);
}), mxUtils.bind(this, function()
{
this.savingFile = false;
if (error != null)
{
error();
}
}), false, folderId, message);
}));
}
});
if (message != null)
{
doSave(message);
}
else
{
this.ui.gitLab.showCommitDialog(this.meta.name,
this.meta.last_commit_id == null || this.meta.isNew,
mxUtils.bind(this, function(message)
{
doSave(message);
}), error);
}
}
else if (error != null)
{
error({code: App.ERROR_BUSY});
}
};

View file

@ -0,0 +1,28 @@
/**
* Copyright (c) 2006-2017, JGraph Ltd
* Copyright (c) 2006-2017, Gaudenz Alder
*/
GitLabLibrary = function(ui, data, meta)
{
GitLabFile.call(this, ui, data, meta);
};
//Extends mxEventSource
mxUtils.extend(GitLabLibrary, GitLabFile);
/**
* Overridden to avoid updating data with current file.
*/
GitLabLibrary.prototype.doSave = function(title, success, error)
{
this.saveFile(title, false, success, error);
};
/**
* Returns the location as a new object.
* @type mx.Point
*/
GitLabLibrary.prototype.open = function()
{
// Do nothing - this should never be called
};

View file

@ -213,8 +213,7 @@ GraphViewer.prototype.init = function(container, xmlNode, graphConfig)
return;
this.currentPage = mxUtils.mod(number, this.diagrams.length);
this.updateGraphXml(mxUtils.parseXml(Graph.decompress(mxUtils.getTextContent(
this.diagrams[this.currentPage]))).documentElement);
this.updateGraphXml(Editor.parseDiagramNode(this.diagrams[this.currentPage]));
};
this.selectPageById = function(id)

View file

@ -133,21 +133,26 @@
})).isEnabled = isGraphEnabled;
if (window.mxFreehand)
{
graph.addListener('freehandInserted', function()
{
graph.container.style.cursor = '';
editorUi.editor.setStatus('');
});
{
editorUi.actions.put('insertFreehand', new Action(mxResources.get('freehand') + '...', function(evt)
{
if (graph.isEnabled())
{
graph.freehand.setEnabled(true);
graph.freehand.setClosedPath(evt != null && mxEvent.isShiftDown(evt));
editorUi.editor.setStatus(mxResources.get('startDrawing'));
graph.container.style.cursor = 'crosshair';
if (this.freehandWindow == null)
{
this.freehandWindow = new FreehandWindow(editorUi, document.body.offsetWidth - 420, 102, 176, 104);
}
if (graph.freehand.isDrawing())
{
graph.freehand.stopDrawing();
}
else
{
graph.freehand.startDrawing();
}
this.freehandWindow.window.setVisible(graph.freehand.isDrawing());
}
})).isEnabled = isGraphEnabled;
}
@ -165,7 +170,10 @@
var selection = editorUi.addCheckbox(div, mxResources.get('selectionOnly'),
false, graph.isSelectionEmpty());
var pages = editorUi.addCheckbox(div, mxResources.get((noPages) ? 'compressed' : 'allPages'), true);
var compressed = editorUi.addCheckbox(div, mxResources.get('compressed'),
!noPages, noPages);
var pages = editorUi.addCheckbox(div, mxResources.get('allPages'),
true, noPages);
pages.style.marginBottom = '16px';
mxEvent.addListener(selection, 'change', function()
@ -182,11 +190,11 @@
var dlg = new CustomDialog(editorUi, div, mxUtils.bind(this, function()
{
editorUi.downloadFile('xml', (noPages) ? !pages.checked : null, null,
!selection.checked, (!noPages) ? !pages.checked : null);
editorUi.downloadFile('xml', noPages || !compressed.checked, null,
!selection.checked, noPages || !pages.checked);
}), null, mxResources.get('export'));
editorUi.showDialog(dlg.container, 300, 146, true, true);
editorUi.showDialog(dlg.container, 300, 176, true, true);
}));
editorUi.actions.put('exportUrl', new Action(mxResources.get('url') + '...', function()
@ -1968,6 +1976,14 @@
pickFileFromService(editorUi.gitHub);
}, parent);
}
if (editorUi.gitLab != null)
{
menu.addItem(mxResources.get('gitlab') + '...', null, function()
{
pickFileFromService(editorUi.gitLab);
}, parent);
}
if (editorUi.trello != null)
{
@ -2544,6 +2560,14 @@
editorUi.pickFile(App.MODE_GITHUB);
}, parent);
}
if (editorUi.gitLab != null)
{
menu.addItem(mxResources.get('gitlab') + '...', null, function()
{
editorUi.pickFile(App.MODE_GITLAB);
}, parent);
}
if (editorUi.trello != null)
{
@ -2666,6 +2690,14 @@
}, parent);
}
if (editorUi.gitLab != null)
{
menu.addItem(mxResources.get('gitlab') + '...', null, function()
{
editorUi.showLibraryDialog(null, null, null, null, App.MODE_GITLAB);
}, parent);
}
if (editorUi.trello != null)
{
menu.addItem(mxResources.get('trello') + '...', null, function()
@ -2758,6 +2790,14 @@
}, parent);
}
if (editorUi.gitLab != null)
{
menu.addItem(mxResources.get('gitlab') + '...', null, function()
{
editorUi.pickLibrary(App.MODE_GITLAB);
}, parent);
}
if (editorUi.trello != null)
{
menu.addItem(mxResources.get('trello') + '...', null, function()

View file

@ -1165,6 +1165,10 @@ EditorUi.initMinimalTheme = function()
{
mode = 'gitHub';
}
else if (mode == 'gitlab')
{
mode = 'gitLab';
}
else if (mode == 'onedrive')
{
mode = 'oneDrive';

View file

@ -11,10 +11,12 @@ function mxFreehand(graph)
var bufferSize = mxFreehand.prototype.NORMAL_SMOOTHING;
var path = null;
var partPathes = [];
var strPath;
var drawPoints;
var drawPoints = [];
var lastPart;
var closedPath = false;
var autoClose = true;
var buffer = []; // Contains the last positions of the mouse cursor
var enabled = false;
@ -23,6 +25,11 @@ function mxFreehand(graph)
closedPath = isClosed;
};
this.setAutoClose = function(isAutoClose)//TODO add auto closed settings
{
autoClose = isAutoClose;
};
this.setSmoothing = function(smoothing)//TODO add smoothing settings
{
bufferSize = smoothing;
@ -34,19 +41,56 @@ function mxFreehand(graph)
graph.getRubberband().setEnabled(!isEnabled);
graph.graphHandler.setSelectEnabled(!isEnabled);
graph.graphHandler.setMoveEnabled(!isEnabled);
graph.container.style.cursor = (isEnabled) ? 'crosshair' : '';
graph.fireEvent(new mxEventObject('freehandStateChanged'));
};
this.setEnabled = setEnabled;
var finishPath = function (e)
this.startDrawing = function()
{
setEnabled(true);
}
this.isDrawing = function()
{
return enabled;
};
var endPath = mxUtils.bind(this, function(e)
{
if (path)
{
drawPoints.push.apply(drawPoints, lastPart);
// Click stops drawing
var doStop = drawPoints.length > 0 && lastPart != null && lastPart.length < 2;
if (!doStop)
{
drawPoints.push.apply(drawPoints, lastPart);
}
lastPart = [];
drawPoints.push(null);
partPathes.push(path);
path = null;
if (doStop)
{
this.stopDrawing();
}
mxEvent.consume(e);
}
});
this.stopDrawing = function()
{
if (partPathes.length > 0)
{
var maxX = drawPoints[0].x, minX = drawPoints[0].x, maxY = drawPoints[0].y, minY = drawPoints[0].y;
for (var i = 1; i < drawPoints.length; i++)
{
if (drawPoints[i] == null) continue;
maxX = Math.max(maxX, drawPoints[i].x);
minX = Math.min(minX, drawPoints[i].x);
maxY = Math.max(maxY, drawPoints[i].y);
@ -62,28 +106,56 @@ function mxFreehand(graph)
drawPoints.map(function(p)
{
if (p == null) return p;
p.x = (p.x - minX) * xScale;
p.y = (p.y - minY) * yScale;
return p;
});
if (closedPath)
{
drawPoints.push(drawPoints[0]);
}
//toFixed(2) to reduce size of output
var drawShape = '<shape strokewidth="inherit"><foreground><path><move x="'+ drawPoints[0].x.toFixed(2) + '" y="' + drawPoints[0].y.toFixed(2) + '"/>';
var drawShape = '<shape strokewidth="inherit"><foreground>';
for (var i = 1; i < drawPoints.length; i++)
var start = 0;
for (var i = 0; i < drawPoints.length; i++)
{
var p = drawPoints[i];
drawShape += '<line x="'+ p.x.toFixed(2) + '" y="' + p.y.toFixed(2) + '"/>';
if (p == null)
{
var tmpClosedPath = false;
var startP = drawPoints[start], endP = drawPoints[i - 1];
if (!closedPath && autoClose)
{
var xdiff = startP.x - endP.x, ydiff = startP.y - endP.y;
var startEndDist = Math.sqrt(xdiff * xdiff + ydiff * ydiff);
tmpClosedPath = startEndDist <= graph.tolerance;
}
if (closedPath || tmpClosedPath)
{
drawShape += '<line x="'+ startP.x.toFixed(2) + '" y="' + startP.y.toFixed(2) + '"/>';
}
drawShape += '</path>' + ((closedPath || tmpClosedPath)? '<fillstroke/>' : '<stroke/>');
start = i + 1;
}
else if (i == start)
{
drawShape += '<path><move x="'+ p.x.toFixed(2) + '" y="' + p.y.toFixed(2) + '"/>'
}
else
{
drawShape += '<line x="'+ p.x.toFixed(2) + '" y="' + p.y.toFixed(2) + '"/>';
}
}
drawShape += '</path>' + (closedPath? '<fillstroke/>' : '<stroke/>') + '</foreground></shape>';
drawShape += '</foreground></shape>';
var style = mxConstants.STYLE_SHAPE + '=stencil(' + Graph.compress(drawShape) + ')';
var style = mxConstants.STYLE_SHAPE + '=stencil(' + Graph.compress(drawShape) + ');fillColor=none;';
var s = graph.view.scale;
var tr = graph.view.translate;
@ -106,11 +178,17 @@ function mxFreehand(graph)
setTimeout(function(){graph.setSelectionCells([cell]); }, 10);
}
path.parentNode.removeChild(path);
for (var i = 0; i < partPathes.length; i++)
{
partPathes[i].parentNode.removeChild(partPathes[i]);
}
path = null;
setEnabled(false);
mxEvent.consume(e);
partPathes = [];
drawPoints = [];
}
setEnabled(false);
};
mxEvent.addGestureListeners(svgElement, function (e)
@ -122,7 +200,6 @@ function mxFreehand(graph)
var strokeWidth = parseFloat(graph.currentVertexStyle[mxConstants.STYLE_STROKEWIDTH] || 1);
strokeWidth = Math.max(1, strokeWidth * graph.view.scale);
finishPath();
path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
path.setAttribute("fill", "none");
path.setAttribute("stroke", graph.currentVertexStyle[mxConstants.STYLE_STROKECOLOR] || "#000");
@ -143,7 +220,7 @@ function mxFreehand(graph)
var pt = getMousePosition(e);
appendToBuffer(pt);
strPath = "M" + pt.x + " " + pt.y;
drawPoints = [pt];
drawPoints.push(pt);
lastPart = [];
path.setAttribute("d", strPath);
svgElement.appendChild(path);
@ -156,7 +233,7 @@ function mxFreehand(graph)
updateSvgPath();
mxEvent.consume(e);
}
}, finishPath);
}, endPath);
var getMousePosition = function (e)
{

View file

@ -374,7 +374,7 @@ var AboutDialog = function(editorUi)
/**
* Constructs a new filename dialog.
*/
var FilenameDialog = function(editorUi, filename, buttonText, fn, label, validateFn, content, helpLink, closeOnBtn, cancelFn, hints)
var FilenameDialog = function(editorUi, filename, buttonText, fn, label, validateFn, content, helpLink, closeOnBtn, cancelFn, hints, w)
{
closeOnBtn = (closeOnBtn != null) ? closeOnBtn : true;
var row, td;
@ -396,7 +396,7 @@ var FilenameDialog = function(editorUi, filename, buttonText, fn, label, validat
var nameInput = document.createElement('input');
nameInput.setAttribute('value', filename || '');
nameInput.style.marginLeft = '4px';
nameInput.style.width = '180px';
nameInput.style.width = (w != null) ? w + 'px' : '180px';
var genericBtn = mxUtils.button(buttonText, function()
{
@ -628,7 +628,8 @@ FilenameDialog.createTypeHint = function(ui, nameInput, hints)
/**
* Constructs a new textarea dialog.
*/
var TextareaDialog = function(editorUi, title, url, fn, cancelFn, cancelTitle, w, h, addButtons, noHide, noWrap, applyTitle)
var TextareaDialog = function(editorUi, title, url, fn, cancelFn, cancelTitle, w, h,
addButtons, noHide, noWrap, applyTitle, helpLink)
{
w = (w != null) ? w : 300;
h = (h != null) ? h : 120;
@ -687,6 +688,17 @@ var TextareaDialog = function(editorUi, title, url, fn, cancelFn, cancelTitle, w
td.style.whiteSpace = 'nowrap';
td.setAttribute('align', 'right');
if (helpLink != null)
{
var helpBtn = mxUtils.button(mxResources.get('help'), function()
{
editorUi.editor.graph.openLink(helpLink);
});
helpBtn.className = 'geBtn';
td.appendChild(helpBtn);
}
var cancelBtn = mxUtils.button(cancelTitle || mxResources.get('cancel'), function()
{
editorUi.hideDialog();

View file

@ -3287,7 +3287,7 @@ TextFormatPanel.prototype.addFont = function(container)
{
if (currentTable != null)
{
graph.selectNode(graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex : 0));
graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex : 0);
}
}
catch (e)
@ -3302,7 +3302,7 @@ TextFormatPanel.prototype.addFont = function(container)
{
if (currentTable != null)
{
graph.selectNode(graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex + 1 : -1));
graph.insertColumn(currentTable, (tableCell != null) ? tableCell.cellIndex + 1 : -1);
}
}
catch (e)
@ -3332,7 +3332,7 @@ TextFormatPanel.prototype.addFont = function(container)
{
if (currentTable != null && tableRow != null)
{
graph.selectNode(graph.insertRow(currentTable, tableRow.sectionRowIndex));
graph.insertRow(currentTable, tableRow.sectionRowIndex);
}
}
catch (e)
@ -3347,7 +3347,7 @@ TextFormatPanel.prototype.addFont = function(container)
{
if (currentTable != null && tableRow != null)
{
graph.selectNode(graph.insertRow(currentTable, tableRow.sectionRowIndex + 1));
graph.insertRow(currentTable, tableRow.sectionRowIndex + 1);
}
}
catch (e)

File diff suppressed because one or more lines are too long

View file

@ -5,6 +5,7 @@ Draw.loadPlugin(function(ui)
{
ui.oneDrive = null;
ui.dropbox = null;
ui.gitLab = null;
ui.gitHub = null;
ui.trello = null;

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=‫عام‬
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=‫عالمي‬
googleDocs=‫وثائق Google
@ -665,6 +666,7 @@ spacing=‫التباعد‬
specialLink=‫رابط خاص‬
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=‫يتم البدء‬
straight=‫مستقيم‬
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Общи
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Глобален
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Интервал
specialLink=Специален линк
standard=Стандартен
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Стартиране
straight=Прав
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Opšti
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globalan
googleDocs=Google dokumenti
@ -665,6 +666,7 @@ spacing=Prored
specialLink=Poseban link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Početak
straight=Pravo
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Espaiat
specialLink=Enllaç especial
standard=Estàndard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Iniciant
straight=Recte
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Obecné
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globální
googleDocs=Google dokumenty
@ -665,6 +666,7 @@ spacing=Odsazení
specialLink=Speciální odkaz
standard=Standardní
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Začínám
straight=Přímý
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Generelt
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Mellemrum
specialLink=Specielt link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Startes
straight=Lige
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Lücke
gcp=GCP
general=Allgemein
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Abstand
specialLink=Besondere Verknüpfung
standard=Standard
startDrawing=Beginne zu zeichnen
stopDrawing=Zeichnen beenden
starting=Wird gestartet
straight=Gerade
strikethrough=Durchgestrichen

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Γενικά
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Συνολικά
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Απόσταση
specialLink=Ειδικός σύνδεσμος
standard=Πρότυπο
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Έναρξη
straight=Ευθεία
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Espaciado
specialLink=Enlace especial
standard=Estándar
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Iniciando
straight=Recto
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Üldine
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globaalne
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Vahekaugus
specialLink=Erilink
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Algab
straight=Sirge
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=‫عمومی‬
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=‫جهانی‬
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=‫فاصله‬
specialLink=‫لینک مخصوص‬
standard=‫استاندارد‬
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=‫شروع‬
straight=‫مستقیم‬
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Yleinen
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globaali
googleDocs=Google Dokumentit
@ -665,6 +666,7 @@ spacing=Väli
specialLink=Erityislinkki
standard=Standardi
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Käynnistys
straight=Suora
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Pangkalahatan
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Pag-eespasyo
specialLink=Espesyal na paguugnay
standard=Pamantayan
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Nagsisimula
straight=Diresto
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Général
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Espacement
specialLink=Lien Spécial
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Démarrage
straight=Droit
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=‫כללי‬
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=‫גלובלי‬
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=‫מרווח‬
specialLink=‫קישור מיוחד‬
standard=‫בסיס‬
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=‫מתחיל‬
straight=‫ישר‬
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Általános
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globális
googleDocs=Google Dokumentumok
@ -665,6 +666,7 @@ spacing=Térköz
specialLink=Különleges link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Kezdés
straight=Egyenes
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=gap
gcp=gcp
general=general
github=github
gitlab=gitlab
gliffy=gliffy
global=global
googleDocs=googleDocs
@ -665,6 +666,7 @@ spacing=spacing
specialLink=specialLink
standard=standard
startDrawing=startDrawing
stopDrawing=stopDrawing
starting=starting
straight=straight
strikethrough=strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Umum
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spasi
specialLink=Tautan Khusus
standard=Standar
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Memulai
straight=Lurus
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Generale
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globale
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spaziatura
specialLink=Link speciale
standard=Normale
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Avvio in corso
straight=Diritta
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=一般
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=全体
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=間隔
specialLink=特別なリンク
standard=標準
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=起動中
straight=直線
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=일반
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=전체
googleDocs=구글 문서
@ -665,6 +666,7 @@ spacing=간격
specialLink=특수 링크
standard=기본
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=시작하는중
straight=직선
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Umum
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Jarak
specialLink=Pautan Khas
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Bermula
straight=Lurus
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Opening
gcp=GCP
general=Algemeen
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globaal
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Afstand
specialLink=Speciale Link
standard=Standaard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Opstarten
straight=Recht
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Generell
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Avstand
specialLink=Spesial lenke
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starter
straight=Rett
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Ogólny
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globalny
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Rozmieszczenie
specialLink=Łącze specjalne
standard=Standardowe
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Uruchamianie
straight=Prosty
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Geral
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global 
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Espaçamento 
specialLink=Link especial
standard=Padrão
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Começando
straight=Reto
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Geral
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global 
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Espaçamento 
specialLink=Link especial
standard=Padrão
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=A iniciar
straight=Reto
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spațiere
specialLink=Link special
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Începe
straight=Drept
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Общие
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Глобальный
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Интервал
specialLink=Специальная ссылка
standard=Стандарт
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Запуск
straight=Прямая
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Opšti
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Globalan
googleDocs=Google dokumenti
@ -665,6 +666,7 @@ spacing=Proređivanje
specialLink=Posebna veza
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Startovanje
straight=Pravo
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Allmänt
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Avstånd
specialLink=Särskild länk
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Börjar
straight=Rak
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=General
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Global
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Spacing
specialLink=Special Link
standard=Standard
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Starting
straight=Straight
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=ทั่วไป
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=ทั่วโลก
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=การเว้นวรรค
specialLink=การเชื่อมโยงพิเศษ
standard=มาตรฐาน
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=กำลังเริ่ม
straight=ตรง
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Genel
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Küresel
googleDocs=Google Dökümanları
@ -665,6 +666,7 @@ spacing=Boşluk oluşturuluyor
specialLink=Özel link
standard=Standart
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Başlatılıyor
straight=Düz
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Загальний
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Глобальний
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Інтервал
specialLink=Спеціальне посилання
standard=Стандартний
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Запуск
straight=Прямий
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=Chung
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=Toàn cầu
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=Khoảng cách
specialLink=Đường dẫn đặc biệt
standard=Tiêu chuẩn
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=Khởi động
straight=Thẳng
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=通用
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=全域
googleDocs=Google 文件
@ -665,6 +666,7 @@ spacing=間距
specialLink=特殊連結
standard=標準
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=啟動中
straight=直線
strikethrough=Strikethrough

View file

@ -329,6 +329,7 @@ gap=Gap
gcp=GCP
general=通用
github=GitHub
gitlab=GitLab
gliffy=Gliffy
global=全局
googleDocs=Google Docs
@ -665,6 +666,7 @@ spacing=间距
specialLink=特殊链接
standard=标准
startDrawing=Start drawing
stopDrawing=Stop drawing
starting=开启中
straight=直线
strikethrough=Strikethrough

View file

@ -1,4 +1,30 @@
<templates>
<clibs name="azure">
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/additional_or_support.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/ai_machine_learning.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/apps_and_system_logos.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/azure.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/azure_additional_or_support.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/buildings.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/databases.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/developer.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/devices.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/files.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/generic.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/infrastructure.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/integration.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/integration_patterns.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/iot_devices.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/office365.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/others.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/power_bi.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/powerapps_and_flows.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/sap.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/servers.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/users_and_roles.xml</add>
<add>Uhttps://jgraph.github.io/drawio-libs/libs/integration/deprecated.xml</add>
</clibs>
<template url="business/accd.xml" libs="general"/>
<template url="business/accd.xml" libs="general"/>
<template url="business/archimate.xml" libs="general;archimate3"/>
<template url="business/bpmn.xml" libs="general;bpmn"/>
@ -30,15 +56,15 @@
<template url="cloud/aws_9.xml" libs="general;aws4"/>
<template url="cloud/aws_10.xml" libs="general;aws4"/>
<template url="cloud/aws_3d.xml" libs="general;aws3d"/>
<template url="cloud/azure_1.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_2.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_3.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_4.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_5.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_6.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_7.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_8.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_9.xml" libs="general;azure;mscae"/>
<template url="cloud/azure_1.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_2.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_3.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_4.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_5.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_6.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_7.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_8.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/azure_9.xml" libs="general;azure;mscae" clibs="azure"/>
<template url="cloud/gcp_backup_and_archive_api_hosting.xml" libs="gcp2"/>
<template url="cloud/gcp_big_data_complex_event_processing.xml" libs="gcp2"/>
<template url="cloud/gcp_dev_test_continuous_delivery_with_spinnaker.xml" libs="gcp2"/>
@ -85,6 +111,7 @@
<template url="maps/mind_map.xml" libs="general"/>
<template url="maps/site_map.xml" libs="general"/>
<template url="network/active_directory.xml" libs="general;citrix"/>
<template url="network/arista.xml" libs="general" clibs="Uhttps%3A%2F%2Fjgraph.github.io%2Fdrawio-libs%2Flibs%2F%2Farista.xml"/>
<template url="network/cisco_1.xml" libs="general;cisco"/>
<template url="network/cisco_2.xml" libs="general;cisco"/>
<template url="network/citrix.xml" libs="general;citrix"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View file

@ -0,0 +1 @@
<mxfile modified="2019-07-18T11:57:04.427Z" host="localhost" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36" etag="Gw8hxESS9Re36W31GD4V" version="@DRAWIO-VERSION@"><diagram id="l2aKFoh6-Bn0gOPZ2l0T" name="Page-1">7Zvdd6o4EMD/Gh/h5IMvH622d+859py92+7e+xoFMbtAKMSv/vWbQFAQbbVbCmXrizBADPObSWYmcYDH4fZbQuLlPXO9YICAux3gyQAhhG0gvqRkl0tsx84FfkLdXAQPggf67Cmhes5fUddLKzdyxgJO46pwzqLIm/OKjCQJ21RvW7Cg+qsx8b2a4GFOgrr0J3X5UkmhNTxc+M2j/lL9tIPU+4WkuFm9SbokLtuURPh2gMcJYzw/CrdjL5DKK/SSP3d35uq+Y4kX8UseCOMnc+THm78c/P0eOsbd5GmiQZw3sybBSr2x6i3fFSoQHY/lIQ0zXd2svYRToaEpmXnB7yylnLJIXJ8xzllYumEUUF9e4CwW0uzxURrnlEAhEcdLziXNkew7uvvbl5ak+5QvVzOdMiFyE7KhTAvoLBVn6oskNOVEHEzGD5qNoaWna1+0uuRhIBqF4jCQPbwh83/8hK0id8wClmTvhBfZR9ySiKt/RpQryxOt2FLqpfSZzDINyJ4qJYn38rZn1Q/3UIU3eCz0eLITt6gHHGUGyg9g4RibklXZTi5blgwKG8qgiLJkf9/0AbY4ULyvYW+8zp7FZE75TqlBOBknNPISpd85CwISp/SgqPmSBu6U7NhKdl8q96yOSRCwzTeS+bFsLCSJT6OptyjMIxf8oVRxkDxKcyqd3yi7y0QCEC9xtrKPkEercEJT+SDLuR8RDtn6Wt4vONR5K6gawQkbsFDdBiDGutWUFTg9GQGACX780jBSwwApfmdBt57735gap5m+ik0aekPUhv2h9vBLg8j5OGy7YzqvcRTeZzTEsQgOPj1HlHmfZXw4RhPoYFj+GO1DhX2B6oCH2zagOlg3L5wamxtjC2p9wdjCEAuADivO2TpUaH4FvS0HvdaFI3STUS+6wAw+hW/L+Ekzmwh6zc4Fvcj6gvY2aFeHvE1StHtC0QTgVmQu4x/adPzhKA/ha5so+1I7KFDet4HyrRlMk1FSX0ZaDJx6WfjVnl5QNz79MiICDESoON4vRnxsAOnUAsiDJA8gkV2PIKVtng0h3+YGL5fCMarWwjE4YfGnauEIGrrpNGTzuC+lGFkI1fbLIe85jllXhPmo/UgD9yWB7wZRC3Qg5MB9qa11g6mBO5AR4L4sQgMIHjWjiTrbNUxtW4ftM+1RgeWxqQWqa6hCCC6tiTe4tIEv2DPwObB2wlWHWHfad9W+JHtQltVQE6tVVzmqmFOdcjrfPmHYl5KbyBS/0vmupfOmdZTOOydCylPpPMRQt4dNjWp9sfmGa5P2FUNbF3L6vpWcG1o9uAZrN5LAvuxoy8BaY9Q+104UbIx6WXWk9AWyqREB72lF41C+OAJBPm0ek5fzWXXWL+9lkOcxoxHPOm/eDMyJVPuKC5N4LmZlomwgyCbXM6aRyq0fkZ/PrpohJAsx3as5G4HiXHUMXgTy5dnTqE6eRn1LsFlsHa/keKApXvUC25TNSe5ZoxbAhNR1ZWMvs4HGERvw/myc1tnUC9rfo7WXchnn/b/ZwBN76d8Ljjg9/E0nu1b6sxO+/Rc=</diagram></mxfile>