request({ type: 'GET', // Deprecated url: nextUrl? nextUrl : '/rest/api/content/' + pageId + '/child/attachment?limit=' + limit, contentType: 'application/json;charset=UTF-8', success: function(resp) { var resp = JSON.parse(resp); for (var i = 0; i < resp.results.length; i++) { attachments.push({ id: resp.results[i].id, title: resp.results[i].title }); } //Support pageing if (resp._links && resp._links.next) { nextUrl = resp._links.next.replace(/\&\_r\=\d+/g, ''); //Remove repeated _r paramter from the URL getChunck(); } else { callback(attachments); } }, error: error }); }; getChunck(); }; CAC.deleteAttachment = function(attId, success, error) { AP.request({ type: 'DELETE', // Deprecated url: '/rest/api/content/' + attId, contentType: 'application/json;charset=UTF-8', success: success, error: error }); }; CAC.uploadToJira = function(fileContent, issueId, filename, fileType, success, error) { var attFile = new Blob([fileContent], {type: fileType}); attFile.name = filename; var reqData = {file: attFile}; AP.request( { url: '/rest/api/2/issue/' + issueId + '/attachments', type: 'POST', data: reqData, contentType: 'multipart/form-data', headers: {'X-Atlassian-Token': 'no-check'}, success: success, error: error }); }; CAC.getJiraAttList = function(issueId, success, error) { AP.request({ url: '/rest/api/2/issue/' + issueId + '?fields=attachment', type: 'GET', success: function(resp) { var respObj = JSON.parse(resp); attDiagrams = []; for (var i = 0; i < respObj.fields.attachment.length; i++) { attDiagrams.push(respObj.fields.attachment[i]); } success(attDiagrams); }, error: error }); }; CAC.noop = function(){}; CAC.importCsv = function(csv, callback, error) { var editorUi = new HeadlessEditorUi(); editorUi.handleError = error; editorUi.importCsv(csv, function() { var csvModel = editorUi.editor.getGraphXml(); callback(csvModel, mxUtils.getXml(csvModel)); }); }; CAC.getViewerAspect = function(viewer, aspectInfo) { if (viewer.diagrams) //non-mxFiles doesn't have diagrams { var diagram = viewer.diagrams[viewer.currentPage]; if (diagram != null) { var layerIds = [], layers = [], pageId = diagram.getAttribute('id'); var model = viewer.graph.getModel(); var childCount = model.getChildCount(model.root); // Get visible layers for (var i = 0; i < childCount; i++) { var layer = model.getChildAt(model.root, i); if (model.isVisible(layer)) { layerIds.push(layer.id); layers.push(i); } } if (aspectInfo != null) { aspectInfo.pageId = pageId; aspectInfo.layerIds = layerIds; aspectInfo.layers = layers; } return pageId + ' ' + layerIds.join(' '); } } return null; }; CAC.getState = function(redirectUri, callback, error) { var req = new XMLHttpRequest(); req.open('GET', redirectUri + '?getState=1'); req.onreadystatechange = function() { if (this.readyState == 4) { if (this.status >= 200 && this.status <= 299) { callback(req.responseText); } else { error(this); } } }; req.send(); }; CAC.sha1 = function(str) { // discuss at: http://locutus.io/php/sha1/ // original by: Webtoolkit.info (http://www.webtoolkit.info/) // improved by: Michael White (http://getsprink.com) // improved by: Kevin van Zonneveld (http://kvz.io) // input by: Brett Zamir (http://brett-zamir.me) // note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then // note 1: hashed. If available, we'd recommend using Node's native crypto modules directly // note 1: in a steaming fashion for faster and more efficient hashing // example 1: sha1('Kevin van Zonneveld') // returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897' var hash try { var crypto = require('crypto') var sha1sum = crypto.createHash('sha1') sha1sum.update(str) hash = sha1sum.digest('hex') } catch (e) { hash = undefined } if (hash !== undefined) { return hash } var _rotLeft = function (n, s) { var t4 = (n << s) | (n >>> (32 - s)) return t4 } var _cvtHex = function (val) { var str = '' var i var v for (i = 7; i >= 0; i--) { v = (val >>> (i * 4)) & 0x0f str += v.toString(16) } return str } var blockstart var i, j var W = new Array(80) var H0 = 0x67452301 var H1 = 0xEFCDAB89 var H2 = 0x98BADCFE var H3 = 0x10325476 var H4 = 0xC3D2E1F0 var A, B, C, D, E var temp // utf8_encode str = unescape(encodeURIComponent(str)) var strLen = str.length var wordArray = [] for (i = 0; i < strLen - 3; i += 4) { j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3) wordArray.push(j) } switch (strLen % 4) { case 0: i = 0x080000000 break case 1: i = str.charCodeAt(strLen - 1) << 24 | 0x0800000 break case 2: i = str.charCodeAt(strLen - 2) << 24 | str.charCodeAt(strLen - 1) << 16 | 0x08000 break case 3: i = str.charCodeAt(strLen - 3) << 24 | str.charCodeAt(strLen - 2) << 16 | str.charCodeAt(strLen - 1) << 8 | 0x80 break } wordArray.push(i) while ((wordArray.length % 16) !== 14) { wordArray.push(0) } wordArray.push(strLen >>> 29) wordArray.push((strLen << 3) & 0x0ffffffff) for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) { for (i = 0; i < 16; i++) { W[i] = wordArray[blockstart + i] } for (i = 16; i <= 79; i++) { W[i] = _rotLeft(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1) } A = H0 B = H1 C = H2 D = H3 E = H4 for (i = 0; i <= 19; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp } for (i = 20; i <= 39; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp } for (i = 40; i <= 59; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp } for (i = 60; i <= 79; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp } H0 = (H0 + A) & 0x0ffffffff H1 = (H1 + B) & 0x0ffffffff H2 = (H2 + C) & 0x0ffffffff H3 = (H3 + D) & 0x0ffffffff H4 = (H4 + E) & 0x0ffffffff } temp = _cvtHex(H0) + _cvtHex(H1) + _cvtHex(H2) + _cvtHex(H3) + _cvtHex(H4) return temp.toLowerCase() }; //TODO Use this functions in all similar places (admin pages and office add-in), including Conf AC //We need language translation for error messages mainly which are not needed immediately CAC.initI18nAsync = function(lang, callback, direct, resourcePrefix) { RESOURCE_BASE = (resourcePrefix || '') + '/resources/dia'; mxLanguage = lang; var script = document.createElement('script'); function loadResources() { mxResources.loadDefaultBundle = false; var bundle = mxResources.getDefaultBundle(RESOURCE_BASE, lang) || mxResources.getSpecialBundle(RESOURCE_BASE, lang); mxUtils.getAll([bundle], function(xhr) { // Adds bundle text to resources mxResources.parse(xhr[0].getText()); if (callback) { callback(); } }); }; if (direct) { loadResources(); } else { script.onload = loadResources; script.src = '/js/viewer-static.min.js'; document.getElementsByTagName('head')[0].appendChild(script); } }; //TODO Use this functions in all similar places (admin pages and office add-in), including Conf AC CAC.applyTranslation = function() { //HTML elements localization var i18nElems = CAC.$$('*[data-i18n]'); //get all elements having data-i18n attribute, should be fine given a small html file for (var i = 0; i < i18nElems.length; i++) { var i18nKey = i18nElems[i].getAttribute('data-i18n'); i18nElems[i].innerHTML = CAC.htmlEntities(mxResources.get(i18nKey, null, i18nElems[i].innerHTML)); } //Title var i18nTitleElems = CAC.$$('*[data-i18n-title]'); for (var i = 0; i < i18nTitleElems.length; i++) { var i18nKey = i18nTitleElems[i].getAttribute('data-i18n-title'); i18nTitleElems[i].setAttribute('title', CAC.htmlEntities(mxResources.get(i18nKey, null, i18nTitleElems[i].getAttribute('title')))); } //Placeholders var i18nPlaceholderElems = CAC.$$('*[data-i18n-placeholder]'); for (var i = 0; i < i18nPlaceholderElems.length; i++) { var i18nKey = i18nPlaceholderElems[i].getAttribute('data-i18n-placeholder'); i18nPlaceholderElems[i].setAttribute('placeholder', CAC.htmlEntities(mxResources.get(i18nKey, null, i18nPlaceholderElems[i].getAttribute('placeholder')))); } }; //Safe guard in case mxResources is not loaded if (typeof window.mxResources === 'undefined') { //define mxResources such that it is available and no errors are thrown window.mxResources = { get: function(key, params, def) { return (def || '').replace('{1}', params? (params[0] || '') : ''); //Simple replacement which covers most cases } }; }ØA —Eoúô