diff --git a/src/js/jquery.orgchart.js b/src/js/jquery.orgchart.js index 979b638e..3e85a76c 100644 --- a/src/js/jquery.orgchart.js +++ b/src/js/jquery.orgchart.js @@ -172,7 +172,8 @@ 'click': function(e) { e.preventDefault(); that.export(); - } + }, + 'hidden':true }); this.$chartContainer.after($exportBtn); }, @@ -1681,38 +1682,57 @@ var that = this; exportFilename = (typeof exportFilename !== 'undefined') ? exportFilename : this.options.exportFilename; exportFileextension = (typeof exportFileextension !== 'undefined') ? exportFileextension : this.options.exportFileextension; + if ($(this).children('.spinner').length) { return false; } + var $chartContainer = this.$chartContainer; var $mask = $chartContainer.find('.mask'); + if (!$mask.length) { - $chartContainer.append(`
`); + $chartContainer.append('
'); } else { $mask.removeClass('hidden'); } - var sourceChart = $chartContainer.addClass('canvasContainer').find('.orgchart:not(".hidden")').get(0); - var flag = that.options.direction === 'l2r' || that.options.direction === 'r2l'; - html2canvas(sourceChart, { - 'width': flag ? sourceChart.clientHeight : sourceChart.clientWidth, - 'height': flag ? sourceChart.clientWidth : sourceChart.clientHeight, - 'onclone': function (cloneDoc) { - $(cloneDoc).find('.canvasContainer').css('overflow', 'visible') - .find('.orgchart:not(".hidden"):first').css('transform', ''); - } + + // Clone the entire org chart + var $clonedChart = $chartContainer.clone(); + + // Append the cloned chart off-screen + $clonedChart.css({ + 'position': 'absolute', + 'top': '-9999px', + 'left': '0', + 'background-color': '#ffffff' + }); + $('body').append($clonedChart); + + // Hide the spinner and its shadow on the cloned chart + $clonedChart.find('.spinner, .mask').hide(); + + // Reset only the necessary CSS transforms and positioning on the cloned chart + $clonedChart.find('.orgchart').css({ + 'transform': 'none' + }); + + html2canvas($clonedChart.get(0), { + 'width': $clonedChart.get(0).scrollWidth, + 'height': $clonedChart.get(0).scrollHeight }) .then(function (canvas) { $chartContainer.find('.mask').addClass('hidden'); - + if (exportFileextension.toLowerCase() === 'pdf') { that.exportPDF(canvas, exportFilename); } else { that.exportPNG(canvas, exportFilename); } - - $chartContainer.removeClass('canvasContainer'); + + $clonedChart.remove(); // Remove the cloned chart after capturing }, function () { $chartContainer.removeClass('canvasContainer'); + $clonedChart.remove(); // Remove the cloned chart in case of an error }); } };