358 lines
12 KiB
JavaScript
Executable File
358 lines
12 KiB
JavaScript
Executable File
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
|
|
var saveAs=saveAs||function(e){"use strict";if(typeof e==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in r,a=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},i=/constructor/i.test(e.HTMLElement)||e.safari,f=/CriOS\/[\d]+/.test(navigator.userAgent),u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},s="application/octet-stream",d=1e3*40,c=function(e){var t=function(){if(typeof e==="string"){n().revokeObjectURL(e)}else{e.remove()}};setTimeout(t,d)},l=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var o=e["on"+t[r]];if(typeof o==="function"){try{o.call(e,n||e)}catch(a){u(a)}}}},p=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},v=function(t,u,d){if(!d){t=p(t)}var v=this,w=t.type,m=w===s,y,h=function(){l(v,"writestart progress write writeend".split(" "))},S=function(){if((f||m&&i)&&e.FileReader){var r=new FileReader;r.onloadend=function(){var t=f?r.result:r.result.replace(/^data:[^;]*;/,"data:attachment/file;");var n=e.open(t,"_blank");if(!n)e.location.href=t;t=undefined;v.readyState=v.DONE;h()};r.readAsDataURL(t);v.readyState=v.INIT;return}if(!y){y=n().createObjectURL(t)}if(m){e.location.href=y}else{var o=e.open(y,"_blank");if(!o){e.location.href=y}}v.readyState=v.DONE;h();c(y)};v.readyState=v.INIT;if(o){y=n().createObjectURL(t);setTimeout(function(){r.href=y;r.download=u;a(r);h();c(y);v.readyState=v.DONE});return}S()},w=v.prototype,m=function(e,t,n){return new v(e,t||e.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=p(e)}return navigator.msSaveOrOpenBlob(e,t)}}w.abort=function(){};w.readyState=w.INIT=0;w.WRITING=1;w.DONE=2;w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null;return m}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!==null){define("FileSaver.js",function(){return saveAs})}/* globals jsreportInit define saveAs */
|
|
/* eslint-env browser */
|
|
|
|
;
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.jsreport = factory()
|
|
}(this, function () {
|
|
'use strict'
|
|
|
|
function JsReport () {
|
|
this.options = {}
|
|
this.headers = this.headers || {}
|
|
}
|
|
|
|
function isObject (value) {
|
|
var type = typeof value
|
|
return type === 'function' || (value && type === 'object') || false
|
|
}
|
|
|
|
function responseToString (response) {
|
|
// String.fromCharCode.apply(null, new Uint8Array(response)) was too slow
|
|
// see https://github.com/jsreport/jsreport-browser-client-dist/issues/4
|
|
var array = new Uint8Array(response)
|
|
var res = ''
|
|
for (var i = 0; i < array.length; i++) {
|
|
res += String.fromCharCode(array[i])
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
function _serverSideRender (request, placeholder) {
|
|
var frameName = placeholder || '_blank'
|
|
|
|
if (placeholder && (placeholder !== '_blank' && placeholder !== '_top' && placeholder !== '_parent' && placeholder !== '_self')) {
|
|
if (typeof placeholder === 'string' || placeholder instanceof String) {
|
|
var contentIframe = document.getElementById('contentIframe')
|
|
if (contentIframe) {
|
|
var contentIframeDoc = contentIframe.contentDocument || contentIframe.contentWindow.document
|
|
placeholder = contentIframeDoc.getElementById(placeholder)
|
|
} else {
|
|
placeholder = document.getElementById(placeholder)
|
|
}
|
|
}
|
|
|
|
if (placeholder.length) {
|
|
placeholder = placeholder[0]
|
|
}
|
|
|
|
frameName = request.template.shortid || new Date().getTime()
|
|
|
|
var iframe = "<iframe frameborder='0' name='" + frameName + "' style='width:100%;height:100%;z-index:50'></iframe>"
|
|
placeholder.innerHTML = iframe
|
|
}
|
|
|
|
var mapForm = document.createElement('form')
|
|
mapForm.target = frameName
|
|
mapForm.id = new Date().getTime()
|
|
mapForm.method = 'POST'
|
|
mapForm.action = this.serverUrl + '/api/report'
|
|
|
|
function addInput (form, name, value) {
|
|
var input = document.createElement('input')
|
|
input.type = 'hidden'
|
|
input.name = name
|
|
input.value = value
|
|
form.appendChild(input)
|
|
}
|
|
|
|
function addBody (path, body) {
|
|
if (body === undefined) {
|
|
return
|
|
}
|
|
|
|
for (var key in body) {
|
|
if (isObject(body[key])) {
|
|
// somehow it skips empty array for template.scripts, this condition fixes that
|
|
if (body[key] instanceof Array && body[key].length === 0) {
|
|
addInput(mapForm, path + '[' + key + ']', [])
|
|
}
|
|
addBody(path + '[' + key + ']', body[key])
|
|
} else {
|
|
if (body[key] !== undefined && !(body[key] instanceof Array)) {
|
|
addInput(mapForm, path + '[' + key + ']', body[key])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
addBody('template', request.template)
|
|
|
|
if (request.options != null) {
|
|
addBody('options', request.options)
|
|
}
|
|
|
|
if (request.data) {
|
|
addBody('data', request.data)
|
|
}
|
|
|
|
var headers = this.headers
|
|
headers['host-cookie'] = document.cookie
|
|
addBody('headers', headers)
|
|
|
|
document.body.appendChild(mapForm)
|
|
|
|
function submit (i) {
|
|
if (i > 10) {
|
|
return console.log('Unable to submit render form.')
|
|
}
|
|
try {
|
|
mapForm.submit()
|
|
mapForm.outerHTML = ''
|
|
} catch (e) {
|
|
setTimeout(function () {
|
|
submit(i + 1)
|
|
}, 50)
|
|
}
|
|
}
|
|
|
|
submit(0)
|
|
}
|
|
|
|
function _render (placeholder, request) {
|
|
var self = this
|
|
|
|
if (!this.serverUrl) {
|
|
throw new Error('The script was not linked from jsreport. You need to fill jsreport.serverUrl property with valid url to jsreport server.')
|
|
}
|
|
|
|
if (!request) {
|
|
request = placeholder
|
|
placeholder = '_blank'
|
|
}
|
|
|
|
if (typeof request === 'string' || request instanceof String) {
|
|
request = {
|
|
template: { shortid: request }
|
|
}
|
|
}
|
|
|
|
if (!request.template) {
|
|
request = { template: request }
|
|
}
|
|
|
|
_serverSideRender.call(self, request, placeholder)
|
|
}
|
|
|
|
function _renderAsync (request) {
|
|
var self = this
|
|
|
|
if (!this.serverUrl) {
|
|
throw new Error('The script was not linked from jsreport. You need to fill jsreport.serverUrl property with valid url to jsreport server.')
|
|
}
|
|
|
|
if (!request.template) {
|
|
request = { template: request }
|
|
}
|
|
|
|
var xhr = new XMLHttpRequest()
|
|
var data = JSON.stringify(request)
|
|
xhr.open('POST', this.serverUrl + '/api/report', true)
|
|
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8')
|
|
|
|
Object.keys(this.headers).forEach(function (k) {
|
|
xhr.setRequestHeader(k, self.headers[k])
|
|
})
|
|
xhr.responseType = 'arraybuffer'
|
|
|
|
var PromiseImpl = this.promise || window.Promise || undefined
|
|
|
|
if (!PromiseImpl) {
|
|
throw new Error('Native Promise is not supported in this browser. Use jsreport.Promise = bluebirdOrAnyOtherLib;')
|
|
}
|
|
|
|
return new PromiseImpl(function (resolve, reject) {
|
|
xhr.onload = function () {
|
|
if (this.status >= 200 && this.status < 300) {
|
|
var response = xhr.response
|
|
response.xhr = xhr
|
|
response.toString = function () {
|
|
return decodeURIComponent(escape(responseToString(response)))
|
|
}
|
|
response.toDataURI = function () {
|
|
var contentType = xhr.getResponseHeader('Content-Type')
|
|
var base64 = window.btoa(responseToString(response))
|
|
return 'data:' + contentType + ';base64, ' + base64
|
|
}
|
|
response.toObjectURL = function () {
|
|
return URL.createObjectURL(response.toBlob())
|
|
}
|
|
response.toBlob = function () {
|
|
var contentType = xhr.getResponseHeader('Content-Type')
|
|
var dataView = new DataView(response)
|
|
var blob
|
|
|
|
try {
|
|
blob = new Blob([dataView], { type: contentType })
|
|
} catch (e) {
|
|
if (e.name === 'InvalidStateError') {
|
|
var byteArray = new Uint8Array(response)
|
|
blob = new Blob([byteArray.buffer], { type: contentType })
|
|
} else {
|
|
throw e
|
|
}
|
|
}
|
|
|
|
return blob
|
|
}
|
|
|
|
response.download = function (afilename) {
|
|
saveAs(response.toBlob(), afilename)
|
|
}
|
|
|
|
resolve(response)
|
|
} else {
|
|
var error
|
|
try {
|
|
var body = responseToString(xhr.response)
|
|
error = JSON.parse(body)
|
|
} catch (e) {
|
|
}
|
|
|
|
reject({
|
|
status: this.status,
|
|
statusText: xhr.statusText,
|
|
error: error,
|
|
response: xhr.response
|
|
})
|
|
}
|
|
}
|
|
|
|
xhr.onerror = function () {
|
|
reject({
|
|
status: this.status,
|
|
statusText: xhr.statusText
|
|
})
|
|
}
|
|
|
|
xhr.send(data)
|
|
})
|
|
}
|
|
|
|
function _request (req) {
|
|
var self = this
|
|
var xhr = new XMLHttpRequest()
|
|
xhr.open(req.method, this.serverUrl + req.path, true)
|
|
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8')
|
|
Object.keys(this.headers).forEach(function (k) {
|
|
xhr.setRequestHeader(k, self.headers[k])
|
|
})
|
|
|
|
var PromiseImpl = this.promise || window.Promise || undefined
|
|
|
|
if (!PromiseImpl) {
|
|
throw new Error('Native Promise is not supported in this browser. Use jsreport.Promise = bluebirdOrAnyOtherLib;')
|
|
}
|
|
|
|
return new PromiseImpl(function (resolve, reject) {
|
|
xhr.onload = function () {
|
|
if (this.status >= 200 && this.status < 300) {
|
|
if (xhr.response) {
|
|
return resolve(JSON.parse(xhr.response))
|
|
}
|
|
|
|
resolve(xhr.response)
|
|
} else {
|
|
reject({
|
|
status: this.status,
|
|
statusText: xhr.statusText
|
|
})
|
|
}
|
|
}
|
|
|
|
xhr.onerror = function () {
|
|
reject({
|
|
status: this.status,
|
|
statusText: xhr.statusText
|
|
})
|
|
}
|
|
|
|
xhr.send(req.data ? JSON.stringify(req.data) : undefined)
|
|
})
|
|
}
|
|
|
|
JsReport.prototype = {
|
|
render: function (placeholder, request) {
|
|
return _render.call(this, placeholder, request)
|
|
},
|
|
|
|
download: function (filename, request) {
|
|
request.options = request.options || {}
|
|
request.options['Content-Disposition'] = 'attachment;filename=' + filename
|
|
return _render.call(this, '_self', request)
|
|
},
|
|
|
|
getTemplateByName: function (name) {
|
|
return _request.call(this, {
|
|
method: 'GET',
|
|
path: '/odata/templates?$filter=name' + encodeURI(" eq '" + name + "'")
|
|
}).then(function (r) {
|
|
if (r.value.length === 0) {
|
|
throw new Error('Template ' + name + ' not found')
|
|
}
|
|
return r.value[0]
|
|
})
|
|
},
|
|
|
|
updateTemplate: function (template) {
|
|
return _request.call(this, { method: 'PATCH', path: '/odata/templates(' + template._id + ')', data: template })
|
|
},
|
|
|
|
renderAsync: function (request) {
|
|
return _renderAsync.call(this, request)
|
|
}
|
|
}
|
|
|
|
var jsreportInstance = new JsReport()
|
|
|
|
setTimeout(function () {
|
|
if (window.jsreportInit !== undefined) {
|
|
jsreportInit(jsreportInstance)
|
|
}
|
|
}, 0)
|
|
|
|
var assign = Object.assign
|
|
// polyfill for Object.assign
|
|
if (!assign) {
|
|
(function () {
|
|
assign = function (target) {
|
|
'use strict'
|
|
if (target === undefined || target === null) {
|
|
throw new TypeError('Cannot convert undefined or null to object')
|
|
}
|
|
|
|
var output = Object(target)
|
|
for (var index = 1; index < arguments.length; index++) {
|
|
var source = arguments[index]
|
|
if (source !== undefined && source !== null) {
|
|
for (var nextKey in source) {
|
|
if (source.hasOwnProperty(nextKey)) {
|
|
output[nextKey] = source[nextKey]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return output
|
|
}
|
|
})()
|
|
}
|
|
|
|
if (window.jsreport) {
|
|
Object.assign(jsreportInstance, window.jsreport)
|
|
}
|
|
|
|
return jsreportInstance
|
|
}))
|