'use strict'; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var download = createCommonjsModule(function (module, exports) { //download.js v4.2, by dandavis; 2008-2016. [MIT] see http://danml.com/download.html for tests/usage // v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime // v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs // v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling. // v4 adds AMD/UMD, commonJS, and plain browser support // v4.1 adds url download capability via solo URL argument (same domain/CORS only) // v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors // https://github.com/rndme/download (function (root, factory) { { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(); } }(commonjsGlobal, function () { return function download(data, strFileName, strMimeType) { var self = window, // this script is only for browsers anyway... defaultMime = "application/octet-stream", // this default mime also triggers iframe downloads mimeType = strMimeType || defaultMime, payload = data, url = !strFileName && !strMimeType && payload, anchor = document.createElement("a"), toString = function(a){return String(a);}, myBlob = (self.Blob || self.MozBlob || self.WebKitBlob || toString), fileName = strFileName || "download", blob, reader; myBlob= myBlob.call ? myBlob.bind(self) : Blob ; if(String(this)==="true"){ //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback payload=[payload, mimeType]; mimeType=payload[0]; payload=payload[1]; } if(url && url.length< 2048){ // if no filename and no mime, assume a url was passed as the only argument fileName = url.split("/").pop().split("?")[0]; anchor.href = url; // assign href prop to temp anchor if(anchor.href.indexOf(url) !== -1){ // if the browser determines that it's a potentially valid url path: var ajax=new XMLHttpRequest(); ajax.open( "GET", url, true); ajax.responseType = 'blob'; ajax.onload= function(e){ download(e.target.response, fileName, defaultMime); }; setTimeout(function(){ ajax.send();}, 0); // allows setting custom ajax headers using the return: return ajax; } // end if valid url? } // end if url? //go ahead and download dataURLs right away if(/^data:([\w+-]+\/[\w+.-]+)?[,;]/.test(payload)){ if(payload.length > (1024*1024*1.999) && myBlob !== toString ){ payload=dataUrlToBlob(payload); mimeType=payload.type || defaultMime; }else { return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs: navigator.msSaveBlob(dataUrlToBlob(payload), fileName) : saver(payload) ; // everyone else can save dataURLs un-processed } }else {//not data url, is it a string with special needs? if(/([\x80-\xff])/.test(payload)){ var i=0, tempUiArr= new Uint8Array(payload.length), mx=tempUiArr.length; for(i;i null, }, // this prop is used to fix the problem with other components that use the // variable fields, like vee-validate. exportFields works exactly like fields exportFields: { type: Object, default: () => null, }, // Use as fallback when the row has no field values defaultValue: { type: String, required: false, default: "", }, // Title(s) for the data, could be a string or an array of strings (multiple titles) header: { default: null, }, // Footer(s) for the data, could be a string or an array of strings (multiple footers) footer: { default: null, }, // filename to export name: { type: String, default: "data.xls", }, fetch: { type: Function, }, meta: { type: Array, default: () => [], }, worksheet: { type: String, default: "Sheet1", }, //event before generate was called beforeGenerate: { type: Function, }, //event before download pops up beforeFinish: { type: Function, }, // Determine if CSV Data should be escaped escapeCsv: { type: Boolean, default: true, }, // long number stringify stringifyLongNum: { type: Boolean, default: false, }, }, computed: { // unique identifier idName() { var now = new Date().getTime(); return "export_" + now; }, downloadFields() { if (this.fields) return this.fields; if (this.exportFields) return this.exportFields; }, }, methods: { async generate() { if (typeof this.beforeGenerate === "function") { await this.beforeGenerate(); } let data = this.data; if (typeof this.fetch === "function" || !data) data = await this.fetch(); if (!data || !data.length) { return; } let json = this.getProcessedJson(data, this.downloadFields); if (this.type === "html") { // this is mainly for testing return this.export( this.jsonToXLS(json), this.name.replace(".xls", ".html"), "text/html" ); } else if (this.type === "csv") { return this.export( this.jsonToCSV(json), this.name.replace(".xls", ".csv"), "application/csv" ); } return this.export( this.jsonToXLS(json), this.name, "application/vnd.ms-excel" ); }, /* Use downloadjs to generate the download link */ export: async function (data, filename, mime) { let blob = this.base64ToBlob(data, mime); if (typeof this.beforeFinish === "function") await this.beforeFinish(); download(blob, filename, mime); }, /* jsonToXLS --------------- Transform json data into an xml document with MS Excel format, sadly it shows a prompt when it opens, that is a default behavior for Microsoft office and cannot be avoided. It's recommended to use CSV format instead. */ jsonToXLS(data) { let xlsTemp = ' ${table}
'; let xlsData = ""; const colspan = Object.keys(data[0]).length; let _self = this; //Header const header = this.header || this.$attrs.title; if (header) { xlsData += this.parseExtraData( header, '${data}' ); } //Fields xlsData += ""; for (let key in data[0]) { xlsData += "" + key + ""; } xlsData += ""; xlsData += ""; //Data xlsData += ""; data.map(function (item, index) { xlsData += ""; for (let key in item) { xlsData += "" + _self.preprocessLongNum( _self.valueReformattedForMultilines(item[key]) ) + ""; } xlsData += ""; }); xlsData += ""; //Footer if (this.footer != null) { xlsData += ""; xlsData += this.parseExtraData( this.footer, '${data}' ); xlsData += ""; } return xlsTemp .replace("${table}", xlsData) .replace("${worksheet}", this.worksheet); }, /* jsonToCSV --------------- Transform json data into an CSV file. */ jsonToCSV(data) { let _self = this; var csvData = []; //Header const header = this.header || this.$attrs.title; if (header) { csvData.push(this.parseExtraData(header, "${data}\r\n")); } //Fields for (let key in data[0]) { csvData.push(key); csvData.push(","); } csvData.pop(); csvData.push("\r\n"); //Data data.map(function (item) { for (let key in item) { let escapedCSV = item[key] + ""; // Escaped CSV data to string to avoid problems with numbers or other types of values // this is controlled by the prop escapeCsv if (_self.escapeCsv) { escapedCSV = '="' + escapedCSV + '"'; // cast Numbers to string if (escapedCSV.match(/[,"\n]/)) { escapedCSV = '"' + escapedCSV.replace(/\"/g, '""') + '"'; } } csvData.push(escapedCSV); csvData.push(","); } csvData.pop(); csvData.push("\r\n"); }); //Footer if (this.footer != null) { csvData.push(this.parseExtraData(this.footer, "${data}\r\n")); } return csvData.join(""); }, /* getProcessedJson --------------- Get only the data to export, if no fields are set return all the data */ getProcessedJson(data, header) { let keys = this.getKeys(data, header); let newData = []; let _self = this; data.map(function (item, index) { let newItem = {}; for (let label in keys) { let property = keys[label]; newItem[label] = _self.getValue(property, item); } newData.push(newItem); }); return newData; }, getKeys(data, header) { if (header) { return header; } let keys = {}; for (let key in data[0]) { keys[key] = key; } return keys; }, /* parseExtraData --------------- Parse title and footer attribute to the csv format */ parseExtraData(extraData, format) { let parseData = ""; if (Array.isArray(extraData)) { for (var i = 0; i < extraData.length; i++) { if (extraData[i]) parseData += format.replace("${data}", extraData[i]); } } else { parseData += format.replace("${data}", extraData); } return parseData; }, getValue(key, item) { const field = typeof key !== "object" ? key : key.field; let indexes = typeof field !== "string" ? [] : field.split("."); let value = this.defaultValue; if (!field) value = item; else if (indexes.length > 1) value = this.getValueFromNestedItem(item, indexes); else value = this.parseValue(item[field]); if (key.hasOwnProperty("callback")) value = this.getValueFromCallback(value, key.callback); return value; }, /* convert values with newline \n characters into
*/ valueReformattedForMultilines(value) { if (typeof value == "string") return value.replace(/\n/gi, "
"); else return value; }, preprocessLongNum(value) { if (this.stringifyLongNum) { if (String(value).startsWith("0x")) { return value; } if (!isNaN(value) && value != "") { if (value > 99999999999 || value < 0.0000000000001) { return '="' + value + '"'; } } } return value; }, getValueFromNestedItem(item, indexes) { let nestedItem = item; for (let index of indexes) { if (nestedItem) nestedItem = nestedItem[index]; } return this.parseValue(nestedItem); }, getValueFromCallback(item, callback) { if (typeof callback !== "function") return this.defaultValue; const value = callback(item); return this.parseValue(value); }, parseValue(value) { return value || value === 0 || typeof value === "boolean" ? value : this.defaultValue; }, base64ToBlob(data, mime) { let base64 = window.btoa(window.unescape(encodeURIComponent(data))); let bstr = atob(base64); let n = bstr.length; let u8arr = new Uint8ClampedArray(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); }, }, // end methods }; function normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */ , shadowMode, createInjector, createInjectorSSR, createInjectorShadow) { if (typeof shadowMode !== 'boolean') { createInjectorSSR = createInjector; createInjector = shadowMode; shadowMode = false; } // Vue.extend constructor export interop. var options = typeof script === 'function' ? script.options : script; // render functions if (template && template.render) { options.render = template.render; options.staticRenderFns = template.staticRenderFns; options._compiled = true; // functional template if (isFunctionalTemplate) { options.functional = true; } } // scopedId if (scopeId) { options._scopeId = scopeId; } var hook; if (moduleIdentifier) { // server build hook = function hook(context) { // 2.3 injection context = context || // cached call this.$vnode && this.$vnode.ssrContext || // stateful this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext; // functional // 2.2 with runInNewContext: true if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { context = __VUE_SSR_CONTEXT__; } // inject component styles if (style) { style.call(this, createInjectorSSR(context)); } // register component module identifier for async chunk inference if (context && context._registeredComponents) { context._registeredComponents.add(moduleIdentifier); } }; // used by ssr in case component is cached and beforeCreate // never gets called options._ssrRegister = hook; } else if (style) { hook = shadowMode ? function () { style.call(this, createInjectorShadow(this.$root.$options.shadowRoot)); } : function (context) { style.call(this, createInjector(context)); }; } if (hook) { if (options.functional) { // register for functional component in vue file var originalRender = options.render; options.render = function renderWithStyleInjection(h, context) { hook.call(context); return originalRender(h, context); }; } else { // inject component registration as beforeCreate hook var existing = options.beforeCreate; options.beforeCreate = existing ? [].concat(existing, hook) : [hook]; } } return script; } var normalizeComponent_1 = normalizeComponent; /* script */ const __vue_script__ = script; /* template */ var __vue_render__ = function() { var _vm = this; var _h = _vm.$createElement; var _c = _vm._self._c || _h; return _c( "div", { attrs: { id: _vm.idName }, on: { click: _vm.generate } }, [_vm._t("default", [_vm._v(" Download " + _vm._s(_vm.name) + " ")])], 2 ) }; var __vue_staticRenderFns__ = []; __vue_render__._withStripped = true; /* style */ const __vue_inject_styles__ = undefined; /* scoped */ const __vue_scope_id__ = undefined; /* module identifier */ const __vue_module_identifier__ = undefined; /* functional template */ const __vue_is_functional_template__ = false; /* style inject */ /* style inject SSR */ var JsonExcel = normalizeComponent_1( { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ }, __vue_inject_styles__, __vue_script__, __vue_scope_id__, __vue_is_functional_template__, __vue_module_identifier__, undefined, undefined ); module.exports = JsonExcel;