Switch to white background during export

* Defaulted background option to white for PNG/JPG export

* Attempt at fixing background colour on image output

* Reverted build location change

* WIP for white background

* WIP for white background

* Updating default colour, including saving of existing colour to restore appropriately

* Fix tests and move css change background outside the try block

* keep consistent with american english

* add method to change background color and test wether it has been called with the right params

* change color to original when save fails

Fixes #1422
This commit is contained in:
Deep Tailor 2018-01-16 09:32:49 -08:00 committed by Victor Woeltjen
parent d03f323a9b
commit 9b8d5f3f9c
2 changed files with 42 additions and 8 deletions

View File

@ -43,7 +43,7 @@ define(
* @param {constant} EXPORT_IMAGE_TIMEOUT time in milliseconds before a timeout error is returned * @param {constant} EXPORT_IMAGE_TIMEOUT time in milliseconds before a timeout error is returned
* @constructor * @constructor
*/ */
function ExportImageService($q, $timeout, $log, EXPORT_IMAGE_TIMEOUT, injHtml2Canvas, injSaveAs, injFileReader) { function ExportImageService($q, $timeout, $log, EXPORT_IMAGE_TIMEOUT, injHtml2Canvas, injSaveAs, injFileReader, injChangeBackgroundColor) {
self.$q = $q; self.$q = $q;
self.$timeout = $timeout; self.$timeout = $timeout;
self.$log = $log; self.$log = $log;
@ -51,6 +51,7 @@ define(
self.html2canvas = injHtml2Canvas || html2canvas; self.html2canvas = injHtml2Canvas || html2canvas;
self.saveAs = injSaveAs || saveAs; self.saveAs = injSaveAs || saveAs;
self.reader = injFileReader || new FileReader(); self.reader = injFileReader || new FileReader();
self.changeBackgroundColor = injChangeBackgroundColor || self.changeBackgroundColor;
} }
/** /**
@ -63,13 +64,20 @@ define(
function renderElement(element, type) { function renderElement(element, type) {
var defer = self.$q.defer(), var defer = self.$q.defer(),
validTypes = ["png", "jpg", "jpeg"], validTypes = ["png", "jpg", "jpeg"],
renderTimeout; renderTimeout,
originalColor;
if (validTypes.indexOf(type) === -1) { if (validTypes.indexOf(type) === -1) {
self.$log.error("Invalid type requested. Try: (" + validTypes.join(",") + ")"); self.$log.error("Invalid type requested. Try: (" + validTypes.join(",") + ")");
return; return;
} }
// Save color to be restored later
originalColor = element.style.backgroundColor || '';
// Defaulting to white so we can see the chart when printed
self.changeBackgroundColor(element, 'white');
renderTimeout = self.$timeout(function () { renderTimeout = self.$timeout(function () {
defer.reject("html2canvas timed out"); defer.reject("html2canvas timed out");
self.$log.warn("html2canvas timed out"); self.$log.warn("html2canvas timed out");
@ -78,13 +86,13 @@ define(
try { try {
self.html2canvas(element, { self.html2canvas(element, {
onrendered: function (canvas) { onrendered: function (canvas) {
self.changeBackgroundColor(element, originalColor);
switch (type.toLowerCase()) { switch (type.toLowerCase()) {
case "png": case "png":
canvas.toBlob(defer.resolve, "image/png"); canvas.toBlob(defer.resolve, "image/png");
break; break;
default:
case "jpg":
case "jpeg": case "jpeg":
canvas.toBlob(defer.resolve, "image/jpeg"); canvas.toBlob(defer.resolve, "image/jpeg");
break; break;
@ -96,7 +104,10 @@ define(
self.$log.warn("html2canvas failed with error: " + e); self.$log.warn("html2canvas failed with error: " + e);
} }
defer.promise.finally(renderTimeout.cancel); defer.promise.finally(function () {
renderTimeout.cancel();
self.changeBackgroundColor(element, originalColor);
});
return defer.promise; return defer.promise;
} }
@ -125,6 +136,13 @@ define(
} }
} }
/**
* @private
*/
self.changeBackgroundColor = function (element, color) {
element.style.backgroundColor = color;
};
/** /**
* Takes a screenshot of a DOM node and exports to JPG. * Takes a screenshot of a DOM node and exports to JPG.
* @param {node} element to be exported * @param {node} element to be exported

View File

@ -37,7 +37,8 @@ define(
mockFileReader, mockFileReader,
mockExportTimeoutConstant, mockExportTimeoutConstant,
testElement, testElement,
exportImageService; exportImageService,
mockChangeBackgroundColor;
describe("ExportImageService", function () { describe("ExportImageService", function () {
beforeEach(function () { beforeEach(function () {
@ -83,7 +84,9 @@ define(
["readAsDataURL", "onloadend"] ["readAsDataURL", "onloadend"]
); );
mockExportTimeoutConstant = 0; mockExportTimeoutConstant = 0;
testElement = {}; testElement = {style: {backgroundColor: 'black'}};
mockChangeBackgroundColor = jasmine.createSpy('changeBackgroundColor');
exportImageService = new ExportImageService( exportImageService = new ExportImageService(
mockQ, mockQ,
@ -92,7 +95,8 @@ define(
mockExportTimeoutConstant, mockExportTimeoutConstant,
mockHtml2Canvas, mockHtml2Canvas,
mockSaveAs, mockSaveAs,
mockFileReader mockFileReader,
mockChangeBackgroundColor
); );
}); });
@ -115,6 +119,18 @@ define(
expect(mockSaveAs).toHaveBeenCalled(); expect(mockSaveAs).toHaveBeenCalled();
expect(mockPromise.finally).toHaveBeenCalled(); expect(mockPromise.finally).toHaveBeenCalled();
}); });
it("changes background color to white and returns color back to original after snapshot, for better visibility of plot lines on print", function () {
exportImageService.exportPNG(testElement, "plot.png");
expect(mockChangeBackgroundColor).toHaveBeenCalledWith(testElement, 'white');
expect(mockChangeBackgroundColor).toHaveBeenCalledWith(testElement, 'black');
exportImageService.exportJPG(testElement, "plot.jpg");
expect(mockChangeBackgroundColor).toHaveBeenCalledWith(testElement, 'white');
expect(mockChangeBackgroundColor).toHaveBeenCalledWith(testElement, 'black');
});
}); });
} }
); );