11.0.0 release
This commit is contained in:
parent
1ef0322a77
commit
bff06f60f4
85 changed files with 4993 additions and 2704 deletions
|
@ -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
|
||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
|||
10.9.8
|
||||
11.0.0
|
|
@ -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>
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
35
src/main/webapp/gitlab.html
Normal file
35
src/main/webapp/gitlab.html
Normal 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>
|
1
src/main/webapp/images/gitlab-logo-white.svg
Normal file
1
src/main/webapp/images/gitlab-logo-white.svg
Normal 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 |
1
src/main/webapp/images/gitlab-logo.svg
Normal file
1
src/main/webapp/images/gitlab-logo.svg
Normal 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 |
2720
src/main/webapp/js/app.min.js
vendored
2720
src/main/webapp/js/app.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -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)
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -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.');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
1018
src/main/webapp/js/diagramly/GitLabClient.js
Normal file
1018
src/main/webapp/js/diagramly/GitLabClient.js
Normal file
File diff suppressed because it is too large
Load diff
278
src/main/webapp/js/diagramly/GitLabFile.js
Normal file
278
src/main/webapp/js/diagramly/GitLabFile.js
Normal 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});
|
||||
}
|
||||
};
|
28
src/main/webapp/js/diagramly/GitLabLibrary.js
Normal file
28
src/main/webapp/js/diagramly/GitLabLibrary.js
Normal 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
|
||||
};
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -1165,6 +1165,10 @@ EditorUi.initMinimalTheme = function()
|
|||
{
|
||||
mode = 'gitHub';
|
||||
}
|
||||
else if (mode == 'gitlab')
|
||||
{
|
||||
mode = 'gitLab';
|
||||
}
|
||||
else if (mode == 'onedrive')
|
||||
{
|
||||
mode = 'oneDrive';
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
1333
src/main/webapp/js/viewer.min.js
vendored
1333
src/main/webapp/js/viewer.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -5,6 +5,7 @@ Draw.loadPlugin(function(ui)
|
|||
{
|
||||
ui.oneDrive = null;
|
||||
ui.dropbox = null;
|
||||
ui.gitLab = null;
|
||||
ui.gitHub = null;
|
||||
ui.trello = null;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"/>
|
||||
|
|
BIN
src/main/webapp/templates/network/arista.png
Normal file
BIN
src/main/webapp/templates/network/arista.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.3 KiB |
1
src/main/webapp/templates/network/arista.xml
Normal file
1
src/main/webapp/templates/network/arista.xml
Normal 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>
|
Loading…
Reference in a new issue