diff --git a/example/index.js b/example/index.js index 13aae37..26aa180 100644 --- a/example/index.js +++ b/example/index.js @@ -563,7 +563,8 @@ var myUniqueId = 1; buttons: [] // remove any button defaults }, - dataTable: null + dataTable: null, + vdtnet: this }; }, computed: { diff --git a/example/index.js.map b/example/index.js.map index a08a28d..50881a2 100644 --- a/example/index.js.map +++ b/example/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["webpack://VdtnetTable/webpack/universalModuleDefinition","webpack://VdtnetTable/webpack/bootstrap","webpack://VdtnetTable/./example/app.js","webpack://VdtnetTable/./example/app.vue","webpack://VdtnetTable/./example/app.vue?6ea0","webpack://VdtnetTable/./example/app.vue?5b50","webpack://VdtnetTable/./example/app.vue?338d","webpack://VdtnetTable/./src/VdtnetTable.vue?fc4d","webpack://VdtnetTable/./node_modules/datatables.net-buttons-bs4/css/buttons.bootstrap4.min.css","webpack://VdtnetTable/./node_modules/datatables.net-select-bs4/css/select.bootstrap4.min.css","webpack://VdtnetTable/./src/VdtnetTable.vue?da42","webpack://VdtnetTable/./node_modules/css-loader/dist/runtime/api.js","webpack://VdtnetTable/./node_modules/datatables.net-bs4/js/dataTables.bootstrap4.js","webpack://VdtnetTable/./node_modules/datatables.net-buttons-bs4/css/buttons.bootstrap4.min.css?5cfe","webpack://VdtnetTable/./node_modules/datatables.net-buttons-bs4/js/buttons.bootstrap4.js","webpack://VdtnetTable/./node_modules/datatables.net-buttons/js/buttons.html5.js","webpack://VdtnetTable/./node_modules/datatables.net-buttons/js/buttons.print.js","webpack://VdtnetTable/./node_modules/datatables.net-buttons/js/dataTables.buttons.js","webpack://VdtnetTable/./node_modules/datatables.net-select-bs4/css/select.bootstrap4.min.css?2d3e","webpack://VdtnetTable/./node_modules/datatables.net-select-bs4/js/select.bootstrap4.js","webpack://VdtnetTable/./node_modules/datatables.net-select/js/dataTables.select.js","webpack://VdtnetTable/./node_modules/datatables.net/js/jquery.dataTables.js","webpack://VdtnetTable/./src/VdtnetTable.vue?ff82","webpack://VdtnetTable/./node_modules/style-loader/lib/addStyles.js","webpack://VdtnetTable/./node_modules/style-loader/lib/urls.js","webpack://VdtnetTable/./example/app.vue?ddf7","webpack://VdtnetTable/./src/VdtnetTable.vue?13e7","webpack://VdtnetTable/./node_modules/vue-loader/lib/runtime/componentNormalizer.js","webpack://VdtnetTable/./src/VdtnetTable.vue","webpack://VdtnetTable/./src/VdtnetTable.vue?55c3","webpack://VdtnetTable/./src/VdtnetTable.vue?7176","webpack://VdtnetTable/./src/VdtnetTable.vue?3690","webpack://VdtnetTable/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jQuery\"), require(\"Vue\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"VdtnetTable\", [\"jQuery\", \"Vue\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VdtnetTable\"] = factory(require(\"jQuery\"), require(\"Vue\"));\n\telse\n\t\troot[\"VdtnetTable\"] = factory(root[\"jQuery\"], root[\"Vue\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE_jquery__, __WEBPACK_EXTERNAL_MODULE_vue__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","import Vue from 'vue';\nimport App from './app.vue';\nnew Vue({\n el: '#app',\n render: function render(h) {\n return h(App);\n }\n});","import { render, staticRenderFns } from \"./app.vue?vue&type=template&id=480ac1de&scoped=true&\"\nimport script from \"./app.vue?vue&type=script&lang=js&\"\nexport * from \"./app.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"480ac1de\",\n null\n \n)\n\n/* hot reload */\nif (module.hot) {\n var api = require(\"/Users/tomnoogen/Desktop/work/niiknow/vue-datatables-net/node_modules/vue-hot-reload-api/dist/index.js\")\n api.install(require('vue'))\n if (api.compatible) {\n module.hot.accept()\n if (!api.isRecorded('480ac1de')) {\n api.createRecord('480ac1de', component.options)\n } else {\n api.reload('480ac1de', component.options)\n }\n module.hot.accept(\"./app.vue?vue&type=template&id=480ac1de&scoped=true&\", function () {\n api.rerender('480ac1de', {\n render: render,\n staticRenderFns: staticRenderFns\n })\n })\n }\n}\ncomponent.options.__file = \"example/app.vue\"\nexport default component.exports","import mod from \"-!../node_modules/babel-loader/lib/index.js??ref--4-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./app.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/babel-loader/lib/index.js??ref--4-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./app.vue?vue&type=script&lang=js&\"","export * from \"-!../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../node_modules/vue-loader/lib/index.js??vue-loader-options!./app.vue?vue&type=template&id=480ac1de&scoped=true&\"","//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n// this demonstrate with buttons and responsive master/details row\nimport VdtnetTable from '../src';\nimport 'datatables.net-bs4'; // import buttons and plugins\n\nimport 'datatables.net-buttons/js/dataTables.buttons.js';\nimport 'datatables.net-buttons/js/buttons.html5.js';\nimport 'datatables.net-buttons/js/buttons.print.js'; // import the rest\n\nimport 'datatables.net-buttons-bs4';\nimport 'datatables.net-select-bs4';\nimport 'datatables.net-select-bs4/css/select.bootstrap4.min.css';\nimport 'datatables.net-buttons-bs4/css/buttons.bootstrap4.min.css';\nexport default {\n name: 'App',\n components: {\n VdtnetTable: VdtnetTable\n },\n data: function data() {\n var vm = this;\n return {\n options: {\n ajax: {\n url: 'https://jsonplaceholder.typicode.com/users',\n dataSrc: function dataSrc(json) {\n return json;\n }\n },\n buttons: ['copy', 'csv', 'print'],\n\n /*eslint-disable */\n dom: \"Btr<'row vdtnet-footer'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'pl>>\",\n\n /*eslint-enable */\n responsive: false,\n processing: true,\n searching: true,\n searchDelay: 1500,\n destroy: true,\n ordering: true,\n lengthChange: true,\n serverSide: true,\n fixedHeader: true,\n saveState: true\n },\n fields: {\n id: {\n label: 'ID',\n sortable: true\n },\n actions: {\n isLocal: true,\n label: 'Actions',\n defaultContent: ' Edit' + ' Delete'\n },\n name: {\n label: 'Name',\n sortable: true,\n searchable: true,\n defaultOrder: 'desc'\n },\n username: {\n label: 'Username',\n sortable: false,\n searchable: true\n },\n email: {\n label: 'Email'\n },\n address: {\n label: 'Address',\n template: '{{ data.street }}, {{ data.suite }}, {{ data.city }} {{ data.zipcode }}'\n },\n phone: {\n label: 'Phone'\n },\n website: {\n label: 'Website',\n render: function render(data) {\n return \"https://\".concat(data);\n }\n }\n },\n quickSearch: '',\n details: {\n template: 'I\\'m a child for {{ data.id }} yall'\n }\n };\n },\n methods: {\n doLoadTable: function doLoadTable(cb) {\n $.getJSON('https://jsonplaceholder.typicode.com/users', function (data) {\n cb(data);\n });\n },\n doAlertEdit: function doAlertEdit(data) {\n window.alert(\"row edit click for item ID: \".concat(data.id));\n },\n doAlertDelete: function doAlertDelete(data, row, tr, target) {\n window.alert(\"deleting item ID: \".concat(data.id)); // row.remove() doesn't work when serverside is enabled\n // so we fake it with dom remove\n\n tr.remove();\n var table = this.$refs.table;\n setTimeout(function () {\n // simulate extra long running ajax\n table.reload();\n }, 1500);\n },\n doAfterReload: function doAfterReload(data, table) {\n window.alert('data reloaded');\n },\n doCreating: function doCreating(comp, el) {\n console.log('creating');\n },\n doCreated: function doCreated(comp) {\n console.log('created');\n },\n doSearch: function doSearch() {\n this.$refs.table.search(this.quickSearch);\n },\n doExport: function doExport(type) {\n var parms = this.$refs.table.getServerParams();\n parms[\"export\"] = type;\n window.alert('GET /api/v1/export?' + jQuery.param(parms));\n }\n }\n};","//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar myUniqueId = 1;\nexport default {\n name: 'VdtnetTable',\n props: {\n /**\n * The table id\n *\n * @type String\n */\n id: {\n type: String,\n \"default\": null\n },\n\n /**\n * Set the container classes.\n *\n * @type String\n */\n containerClassName: {\n type: String,\n \"default\": 'table-responsive d-print-inline'\n },\n\n /**\n * Set the table classes you wish to use, default with bootstrap4\n * but you can override with: themeforest, foundation, etc..\n *\n * @type String\n */\n className: {\n type: String,\n \"default\": 'table table-striped table-bordered nowrap w-100'\n },\n\n /**\n * the options object: https://datatables.net/manual/options\n *\n * @type Object\n */\n opts: {\n type: Object\n },\n\n /**\n * List all fields to be converted to opts columns\n *\n * @type Object\n */\n fields: {\n type: Object\n },\n\n /**\n * Pass in DataTables.Net jQuery to resolve any conflict from\n * multiple jQuery loaded in the browser\n *\n * @type Object\n */\n jquery: {\n type: Object\n },\n\n /**\n * The select-checkbox column index (start at 1)\n * Current implementation require datatables.net-select\n *\n * @type Number\n */\n selectCheckbox: {\n type: Number\n },\n\n /**\n * Provide custom local data loading. Warning: this option has not been\n * thoroughly tested. Please use ajax and serverSide instead.\n *\n * @type Function\n */\n dataLoader: {\n type: Function\n },\n\n /**\n * true to hide the footer of the table\n *\n * @type Boolean\n */\n hideFooter: {\n type: Boolean\n },\n\n /**\n * The details column configuration of master/details.\n *\n * @type {Object}\n */\n details: {\n type: Object\n }\n },\n data: function data() {\n // initialize defaults\n return {\n tableId: null,\n options: {\n /*eslint-disable */\n dom: \"tr<'row vdtnet-footer'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'pl>>\",\n\n /*eslint-enable */\n columns: [],\n language: {\n infoFiltered: ''\n },\n lengthMenu: [[15, 100, 500, 1000, -1], [15, 100, 500, 1000, 'All']],\n pageLength: 15,\n buttons: [] // remove any button defaults\n\n },\n dataTable: null\n };\n },\n computed: {\n jq: function jq() {\n return this.jquery || window.jQuery;\n },\n classes: function classes() {\n var that = this;\n var classes = \"\".concat(that.containerClassName, \" vdtnet-container\");\n\n if (this.hideFooter) {\n classes += ' hide-footer';\n }\n\n return classes;\n }\n },\n created: function created() {\n var _arguments = arguments;\n var vm = this;\n var jq = vm.jq;\n var orders = [];\n var startCol = 0;\n var icol = 0;\n vm.tableId = vm.id || \"vdtnetable\".concat(myUniqueId++); // allow user to override default options\n\n if (vm.opts) {\n vm.options = jq.extend({}, vm.options, vm.opts);\n } // if fields are passed in, generate column definition\n // from our custom fields schema\n\n\n if (vm.fields) {\n var fields = vm.fields;\n var cols = vm.options.columns;\n\n for (var k in fields) {\n var field = fields[k];\n field.name = field.name || k; // disable search and sort for local field\n\n if (field.isLocal) {\n field.searchable = false;\n field.sortable = false;\n } // generate\n\n\n var col = {\n title: field.label || field.name,\n width: field.width,\n data: field.data || field.name,\n name: field.name,\n className: field.className\n };\n\n if (field.width) {\n col.width = field.width;\n }\n\n if (field.hasOwnProperty('defaultContent')) {\n col.defaultContent = field.defaultContent;\n }\n\n if (field.hasOwnProperty('sortable')) {\n col.orderable = field.sortable;\n }\n\n if (field.hasOwnProperty('visible')) {\n col.visible = field.visible;\n }\n\n if (field.hasOwnProperty('searchable')) {\n col.searchable = field.searchable;\n }\n\n if (field.template) {\n field.render = vm.compileTemplate(field.template);\n }\n\n if (field.render) {\n if (!field.render.templated) {\n (function () {\n var myRender = field.render;\n\n field.render = function () {\n return myRender.apply(vm, _arguments);\n };\n })();\n }\n\n col.render = field.render;\n } // console.log(col)\n\n\n cols.push(col);\n\n if (field.defaultOrder) {\n orders.push([icol, field.defaultOrder]);\n }\n\n icol++;\n }\n } // apply orders calculated from above\n\n\n vm.options.order = vm.options.order || orders;\n\n if (vm.selectCheckbox) {\n vm.selectCheckbox = vm.selectCheckbox || 1; // create checkbox column\n\n var _col = {\n orderable: false,\n searchable: false,\n name: '_select_checkbox',\n className: 'select-checkbox d-print-none',\n data: null,\n defaultContent: '',\n title: ''\n };\n vm.options.columns.splice(vm.selectCheckbox - 1, 0, _col); // console.log(vm.options.columns)\n\n vm.options.select = jq.extend(vm.options.select || {}, {\n style: 'os',\n selector: 'td.select-checkbox'\n });\n\n if (vm.selectCheckbox === 1) {\n startCol++;\n }\n } // handle master details\n\n\n if (vm.details) {\n vm.details.index = vm.details.index || 1; // create details column\n\n var _col2 = {\n orderable: false,\n searchable: false,\n name: '_details_control',\n className: 'details-control d-print-none',\n data: null,\n defaultContent: vm.details.icons || '+-'\n };\n vm.options.columns.splice(vm.details.index - 1, 0, _col2);\n\n if (vm.details.index === 1) {\n startCol++;\n }\n }\n\n if (startCol > 0) {\n if (vm.options.order) {\n vm.options.order.forEach(function (v) {\n v[0] += startCol;\n });\n } else {\n vm.options.order = [[startCol, 'asc']];\n }\n } // handle local data loader\n\n\n if (vm.dataLoader) {\n delete vm.options.ajax;\n vm.options.serverSide = false;\n }\n },\n mounted: function mounted() {\n var _arguments2 = arguments;\n var vm = this;\n var jq = vm.jq;\n var $el = jq(vm.$refs.table); // you can access and update the vm.options and $el here before we create the DataTable\n\n vm.$emit('table-creating', vm, $el);\n vm.dataTable = $el.DataTable(vm.options);\n\n if (vm.selectCheckbox) {\n // handle select all checkbox\n $el.on('click', 'th input.select-all-checkbox', function (e) {\n if (jq(e.target).is(':checked')) {\n vm.dataTable.rows().select();\n } else {\n vm.dataTable.rows().deselect();\n }\n }); // handle individual row select events\n\n vm.dataTable.on('select deselect', function () {\n var $input = $el.find('th input.select-all-checkbox');\n\n if (vm.dataTable.rows({\n selected: true\n }).count() !== vm.dataTable.rows().count()) {\n jq('th.select-checkbox').removeClass('selected');\n $input.attr('checked', false);\n } else {\n jq('th.select-checkbox').addClass('selected');\n $input.attr('checked', true);\n } // TODO: vm.$emit the selected row?\n\n });\n } // wire up edit, delete, and/or action buttons\n\n\n $el.on('click', '[data-action]', function (e) {\n e.preventDefault();\n e.stopPropagation();\n var target = jq(e.target);\n var that = target;\n var action = that.attr('data-action');\n\n while (!action) {\n // don't let it propagate outside of container\n if (that.hasClass('vdtnet-container') || that.prop('tagName') === 'table') {\n // no action, simply exit\n return;\n }\n\n that = that.parent();\n action = that.attr('data-action');\n } // only emit if there is action\n\n\n if (action) {\n // detect if row action\n var tr = that.closest('tr');\n\n if (tr) {\n if (tr.attr('role') !== 'row') {\n tr = tr.prev();\n }\n\n var row = vm.dataTable.row(tr);\n var data = row.data();\n vm.$emit(action, data, row, tr, that);\n } else {\n // not a row click, must be other kind of action\n // such as bulk, csv, pdf, etc...\n vm.$emit(action, null, null, null, target);\n }\n }\n }); // handle master/details\n\n if (vm.details) {\n // default to render function\n var renderFunc = vm.details.render; // must be string template\n\n if (vm.details.template) {\n renderFunc = vm.compileTemplate(vm.details.template);\n } else if (renderFunc) {\n renderFunc = function renderFunc() {\n return vm.details.render.apply(vm, _arguments2);\n };\n } // handle master/details\n // Add event listener for opening and closing details\n\n\n $el.on('click', 'td.details-control', function (e) {\n e.preventDefault();\n e.stopPropagation();\n var target = jq(e.target);\n var that = target;\n var tr = that.closest('tr');\n\n if (tr.attr('role') !== 'row') {\n tr = tr.prev();\n }\n\n var row = vm.dataTable.row(tr);\n\n if (row.child.isShown()) {\n // This row is already open - close it\n row.child.hide();\n tr.removeClass('master');\n } else {\n // Open this row\n var data = row.data();\n row.child(renderFunc(data, 'child', row, tr)).show();\n tr.addClass('master');\n }\n });\n }\n\n vm.$emit('table-created', vm); // finally, load data\n\n if (vm.dataLoader) {\n vm.reload();\n }\n },\n beforeDestroy: function beforeDestroy() {\n var vm = this;\n\n if (vm.dataTable) {\n vm.dataTable.destroy(true);\n }\n\n vm.dataTable = null;\n },\n methods: {\n /**\n * Vue.compile a template string and return the compiled function\n *\n * @param {String} template the string template\n * @return {Function} the compiled template function\n */\n compileTemplate: function compileTemplate(template) {\n var vm = this;\n var jq = vm.jq;\n var res = Vue.compile(\"
\".concat(template, \"
\"));\n\n var renderFunc = function renderFunc(data, type, row, meta) {\n var comp = new Vue({\n data: {\n data: data,\n type: type,\n row: row,\n meta: meta,\n vdtnet: vm\n },\n render: res.render,\n staticRenderFns: res.staticRenderFns\n }).$mount();\n return jq(comp.$el).html();\n };\n\n renderFunc.templated = true;\n return renderFunc;\n },\n\n /**\n * Set table data array that was loaded from somewhere else\n * This method allow for local setting of data; though, it\n * is recommended to use ajax instead of this.\n *\n * @param {Array} data the array of data\n * @return {Object} the component\n */\n setTableData: function setTableData(data) {\n var vm = this;\n\n if (data.constructor === Array) {\n vm.dataTable.clear().rows.add(data);\n vm.dataTable.draw(false);\n vm.dataTable.columns.adjust();\n }\n\n return vm;\n },\n\n /**\n * pass through reload method\n *\n * @param {Boolean} resetPaging true to reset current page position\n * @return {Object} the component\n */\n reload: function reload() {\n var resetPaging = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var vm = this;\n\n if (vm.dataLoader) {\n // manual data loading\n vm.dataLoader(function (data) {\n if (data && !data.data) {\n data = {\n data: data\n };\n }\n\n vm.setTableData(data.data);\n vm.$emit('reloaded', data, vm);\n });\n } else {\n vm.dataTable.ajax.reload(function (data) {\n vm.$emit('reloaded', data, vm);\n }, resetPaging);\n }\n\n return vm;\n },\n search: function search(value) {\n var vm = this;\n vm.dataTable.search(value).draw();\n return vm;\n },\n setPageLength: function setPageLength(value) {\n var vm = this;\n vm.dataTable.page.len(value);\n return vm.reload();\n },\n getServerParams: function getServerParams() {\n if (this.dataLoader) {\n return {};\n }\n\n return this.dataTable.ajax.params();\n }\n }\n};","exports = module.exports = require(\"../../css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection-title{text-align:center;padding:0.3em 0 0.5em;font-size:0.9em}div.dt-button-collection-title:empty{display:none}div.dt-button-collection.dropdown-menu{display:block;z-index:2002;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.dropdown-menu.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.dropdown-menu.fixed.two-column{margin-left:-150px}div.dt-button-collection.dropdown-menu.fixed.three-column{margin-left:-225px}div.dt-button-collection.dropdown-menu.fixed.four-column{margin-left:-300px}div.dt-button-collection.dropdown-menu>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.dropdown-menu.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.dropdown-menu.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.dropdown-menu.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection.dropdown-menu .dt-button{border-radius:0}div.dt-button-collection{-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.fixed{max-width:none}div.dt-button-collection.fixed:before,div.dt-button-collection.fixed:after{display:none}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:999}@media screen and (max-width: 767px){div.dt-buttons{float:none;width:100%;text-align:center;margin-bottom:0.5em}div.dt-buttons a.btn{float:none}}div.dt-buttons button.btn.processing,div.dt-buttons div.btn.processing,div.dt-buttons a.btn.processing{color:rgba(0,0,0,0.2)}div.dt-buttons button.btn.processing:after,div.dt-buttons div.btn.processing:after,div.dt-buttons a.btn.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}\\n\", \"\"]);\n\n","exports = module.exports = require(\"../../css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#0275d8}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#0172d2}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#0170d0}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#0172d3}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#016ecc}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#016fcd}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#0170cf}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#0172d3}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#0173d5}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#0174d7}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#016ecc}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#0172d3}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#016bc6}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#016cc7}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#016dca}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#016bc6}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{content:'\\\\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}}table.dataTable tbody tr.selected,table.dataTable tbody th.selected,table.dataTable tbody td.selected{color:white}table.dataTable tbody tr.selected a,table.dataTable tbody th.selected a,table.dataTable tbody td.selected a{color:#a2d4ed}\\n\", \"\"]);\n\n","exports = module.exports = require(\"../node_modules/css-loader/dist/runtime/api.js\")(false);\n// Module\nexports.push([module.id, \"\\n.select-checkbox, .select-all-checkbox {\\n cursor: pointer;\\n}\\n.vdtnet-footer .dataTables_length {\\n padding-top: 6px;\\n padding-right: 10px;\\n}\\n.vdtnet-footer .dataTables_length, .vdtnet-footer .dataTables_paginate {\\n float: right;\\n}\\n.hide-footer .vdtnet-footer {\\n display: none;\\n}\\n.master .details-plus\\n{\\n cursor: pointer;\\n display: none;\\n}\\n.details-minus\\n{\\n cursor: pointer;\\n display: none;\\n}\\n.master .details-minus\\n{\\n cursor: pointer;\\n display: inline;\\n}\\n.details-control {\\n cursor: pointer;\\n font-weight: 700;\\n}\\n\", \"\"]);\n\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function (useSourceMap) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item, useSourceMap);\n\n if (item[2]) {\n return '@media ' + item[2] + '{' + content + '}';\n } else {\n return content;\n }\n }).join('');\n }; // import a list of modules into the list\n\n\n list.i = function (modules, mediaQuery) {\n if (typeof modules === 'string') {\n modules = [[null, modules, '']];\n }\n\n var alreadyImportedModules = {};\n\n for (var i = 0; i < this.length; i++) {\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n\n for (i = 0; i < modules.length; i++) {\n var item = modules[i]; // skip already imported module\n // this implementation is not 100% perfect for weird media query combinations\n // when a module is imported multiple times with different media queries.\n // I hope this will never occur (Hey this way we have smaller bundles)\n\n if (item[0] == null || !alreadyImportedModules[item[0]]) {\n if (mediaQuery && !item[2]) {\n item[2] = mediaQuery;\n } else if (mediaQuery) {\n item[2] = '(' + item[2] + ') and (' + mediaQuery + ')';\n }\n\n list.push(item);\n }\n }\n };\n\n return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n var content = item[1] || '';\n var cssMapping = item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (useSourceMap && typeof btoa === 'function') {\n var sourceMapping = toComment(cssMapping);\n var sourceURLs = cssMapping.sources.map(function (source) {\n return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */';\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n }\n\n return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n return '/*# ' + data + ' */';\n}","/*! DataTables Bootstrap 4 integration\n * ©2011-2017 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integration for Bootstrap 4. This requires Bootstrap 4 and\n * DataTables 1.10 or newer.\n *\n * This file sets the defaults and adds options to DataTables to style its\n * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap\n * for further information.\n */\n(function( factory ){\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery', 'datatables.net'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $) {\n\t\t\tif ( ! root ) {\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ || ! $.fn.dataTable ) {\n\t\t\t\t// Require DataTables, which attaches to jQuery, including\n\t\t\t\t// jQuery if needed and have a $ property so we can access the\n\t\t\t\t// jQuery object that is used\n\t\t\t\t$ = require('datatables.net')(root, $).$;\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\tfactory( jQuery, window, document );\n\t}\n}(function( $, window, document, undefined ) {\n'use strict';\nvar DataTable = $.fn.dataTable;\n\n\n/* Set the defaults for DataTables initialisation */\n$.extend( true, DataTable.defaults, {\n\tdom:\n\t\t\"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>\" +\n\t\t\"<'row'<'col-sm-12'tr>>\" +\n\t\t\"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>\",\n\trenderer: 'bootstrap'\n} );\n\n\n/* Default class modification */\n$.extend( DataTable.ext.classes, {\n\tsWrapper: \"dataTables_wrapper dt-bootstrap4\",\n\tsFilterInput: \"form-control form-control-sm\",\n\tsLengthSelect: \"custom-select custom-select-sm form-control form-control-sm\",\n\tsProcessing: \"dataTables_processing card\",\n\tsPageButton: \"paginate_button page-item\"\n} );\n\n\n/* Bootstrap paging button renderer */\nDataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {\n\tvar api = new DataTable.Api( settings );\n\tvar classes = settings.oClasses;\n\tvar lang = settings.oLanguage.oPaginate;\n\tvar aria = settings.oLanguage.oAria.paginate || {};\n\tvar btnDisplay, btnClass, counter=0;\n\n\tvar attach = function( container, buttons ) {\n\t\tvar i, ien, node, button;\n\t\tvar clickHandler = function ( e ) {\n\t\t\te.preventDefault();\n\t\t\tif ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {\n\t\t\t\tapi.page( e.data.action ).draw( 'page' );\n\t\t\t}\n\t\t};\n\n\t\tfor ( i=0, ien=buttons.length ; i 0 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'next':\n\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'last':\n\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbtnDisplay = button + 1;\n\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t'active' : '';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( btnDisplay ) {\n\t\t\t\t\tnode = $('
  • ', {\n\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append( $('', {\n\t\t\t\t\t\t\t\t'href': '#',\n\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t'data-dt-idx': counter,\n\t\t\t\t\t\t\t\t'tabindex': settings.iTabIndex,\n\t\t\t\t\t\t\t\t'class': 'page-link'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\tsettings.oApi._fnBindAction(\n\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t);\n\n\t\t\t\t\tcounter++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t// inside an iframe or frame. \n\tvar activeEl;\n\n\ttry {\n\t\t// Because this approach is destroying and recreating the paging\n\t\t// elements, focus is lost on the select button which is bad for\n\t\t// accessibility. So we want to restore focus once the draw has\n\t\t// completed\n\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t}\n\tcatch (e) {}\n\n\tattach(\n\t\t$(host).empty().html('
      ').children('ul'),\n\t\tbuttons\n\t);\n\n\tif ( activeEl !== undefined ) {\n\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).focus();\n\t}\n};\n\n\nreturn DataTable;\n}));\n","\nvar content = require(\"!!../../css-loader/dist/cjs.js??ref--5-1!../../postcss-loader/src/index.js??ref--5-2!./buttons.bootstrap4.min.css\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../css-loader/dist/cjs.js??ref--5-1!../../postcss-loader/src/index.js??ref--5-2!./buttons.bootstrap4.min.css\", function() {\n\t\tvar newContent = require(\"!!../../css-loader/dist/cjs.js??ref--5-1!../../postcss-loader/src/index.js??ref--5-2!./buttons.bootstrap4.min.css\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","/*! Bootstrap integration for DataTables' Buttons\n * ©2016 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory ){\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery', 'datatables.net-bs4', 'datatables.net-buttons'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $) {\n\t\t\tif ( ! root ) {\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ || ! $.fn.dataTable ) {\n\t\t\t\t$ = require('datatables.net-bs4')(root, $).$;\n\t\t\t}\n\n\t\t\tif ( ! $.fn.dataTable.Buttons ) {\n\t\t\t\trequire('datatables.net-buttons')(root, $);\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\tfactory( jQuery, window, document );\n\t}\n}(function( $, window, document, undefined ) {\n'use strict';\nvar DataTable = $.fn.dataTable;\n\n$.extend( true, DataTable.Buttons.defaults, {\n\tdom: {\n\t\tcontainer: {\n\t\t\tclassName: 'dt-buttons btn-group'\n\t\t},\n\t\tbutton: {\n\t\t\tclassName: 'btn btn-secondary'\n\t\t},\n\t\tcollection: {\n\t\t\ttag: 'div',\n\t\t\tclassName: 'dt-button-collection dropdown-menu',\n\t\t\tbutton: {\n\t\t\t\ttag: 'a',\n\t\t\t\tclassName: 'dt-button dropdown-item',\n\t\t\t\tactive: 'active',\n\t\t\t\tdisabled: 'disabled'\n\t\t\t}\n\t\t}\n\t},\n\tbuttonCreated: function ( config, button ) {\n\t\treturn config.buttons ?\n\t\t\t$('
      ').append(button) :\n\t\t\tbutton;\n\t}\n} );\n\nDataTable.ext.buttons.collection.className += ' dropdown-toggle';\nDataTable.ext.buttons.collection.rightAlignClassName = 'dropdown-menu-right';\n\nreturn DataTable.Buttons;\n}));\n","/*!\n * HTML5 export buttons for Buttons and DataTables.\n * 2016 SpryMedia Ltd - datatables.net/license\n *\n * FileSaver.js (1.3.3) - MIT license\n * Copyright © 2016 Eli Grey - http://eligrey.com\n */\n\n(function( factory ){\n\tif ( typeof define === 'function' && define.amd ) {\n\t\t// AMD\n\t\tdefine( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) {\n\t\t\treturn factory( $, window, document );\n\t\t} );\n\t}\n\telse if ( typeof exports === 'object' ) {\n\t\t// CommonJS\n\t\tmodule.exports = function (root, $, jszip, pdfmake) {\n\t\t\tif ( ! root ) {\n\t\t\t\troot = window;\n\t\t\t}\n\n\t\t\tif ( ! $ || ! $.fn.dataTable ) {\n\t\t\t\t$ = require('datatables.net')(root, $).$;\n\t\t\t}\n\n\t\t\tif ( ! $.fn.dataTable.Buttons ) {\n\t\t\t\trequire('datatables.net-buttons')(root, $);\n\t\t\t}\n\n\t\t\treturn factory( $, root, root.document, jszip, pdfmake );\n\t\t};\n\t}\n\telse {\n\t\t// Browser\n\t\tfactory( jQuery, window, document );\n\t}\n}(function( $, window, document, jszip, pdfmake, undefined ) {\n'use strict';\nvar DataTable = $.fn.dataTable;\n\n// Allow the constructor to pass in JSZip and PDFMake from external requires.\n// Otherwise, use globally defined variables, if they are available.\nfunction _jsZip () {\n\treturn jszip || window.JSZip;\n}\nfunction _pdfMake () {\n\treturn pdfmake || window.pdfMake;\n}\n\nDataTable.Buttons.pdfMake = function (_) {\n\tif ( ! _ ) {\n\t\treturn _pdfMake();\n\t}\n\tpdfmake = m_ake;\n}\n\nDataTable.Buttons.jszip = function (_) {\n\tif ( ! _ ) {\n\t\treturn _jsZip();\n\t}\n\tjszip = _;\n}\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * FileSaver.js dependency\n */\n\n/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */\n\nvar _saveAs = (function(view) {\n\t\"use strict\";\n\t// IE <10 is explicitly unsupported\n\tif (typeof view === \"undefined\" || typeof navigator !== \"undefined\" && /MSIE [1-9]\\./.test(navigator.userAgent)) {\n\t\treturn;\n\t}\n\tvar\n\t\t doc = view.document\n\t\t // only get URL when necessary in case Blob.js hasn't overridden it yet\n\t\t, get_URL = function() {\n\t\t\treturn view.URL || view.webkitURL || view;\n\t\t}\n\t\t, save_link = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"a\")\n\t\t, can_use_save_link = \"download\" in save_link\n\t\t, click = function(node) {\n\t\t\tvar event = new MouseEvent(\"click\");\n\t\t\tnode.dispatchEvent(event);\n\t\t}\n\t\t, is_safari = /constructor/i.test(view.HTMLElement) || view.safari\n\t\t, is_chrome_ios =/CriOS\\/[\\d]+/.test(navigator.userAgent)\n\t\t, throw_outside = function(ex) {\n\t\t\t(view.setImmediate || view.setTimeout)(function() {\n\t\t\t\tthrow ex;\n\t\t\t}, 0);\n\t\t}\n\t\t, force_saveable_type = \"application/octet-stream\"\n\t\t// the Blob API is fundamentally broken as there is no \"downloadfinished\" event to subscribe to\n\t\t, arbitrary_revoke_timeout = 1000 * 40 // in ms\n\t\t, revoke = function(file) {\n\t\t\tvar revoker = function() {\n\t\t\t\tif (typeof file === \"string\") { // file is an object URL\n\t\t\t\t\tget_URL().revokeObjectURL(file);\n\t\t\t\t} else { // file is a File\n\t\t\t\t\tfile.remove();\n\t\t\t\t}\n\t\t\t};\n\t\t\tsetTimeout(revoker, arbitrary_revoke_timeout);\n\t\t}\n\t\t, dispatch = function(filesaver, event_types, event) {\n\t\t\tevent_types = [].concat(event_types);\n\t\t\tvar i = event_types.length;\n\t\t\twhile (i--) {\n\t\t\t\tvar listener = filesaver[\"on\" + event_types[i]];\n\t\t\t\tif (typeof listener === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlistener.call(filesaver, event || filesaver);\n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tthrow_outside(ex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t, auto_bom = function(blob) {\n\t\t\t// prepend BOM for UTF-8 XML and text/* types (including HTML)\n\t\t\t// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF\n\t\t\tif (/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(blob.type)) {\n\t\t\t\treturn new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});\n\t\t\t}\n\t\t\treturn blob;\n\t\t}\n\t\t, FileSaver = function(blob, name, no_auto_bom) {\n\t\t\tif (!no_auto_bom) {\n\t\t\t\tblob = auto_bom(blob);\n\t\t\t}\n\t\t\t// First try a.download, then web filesystem, then object URLs\n\t\t\tvar\n\t\t\t\t filesaver = this\n\t\t\t\t, type = blob.type\n\t\t\t\t, force = type === force_saveable_type\n\t\t\t\t, object_url\n\t\t\t\t, dispatch_all = function() {\n\t\t\t\t\tdispatch(filesaver, \"writestart progress write writeend\".split(\" \"));\n\t\t\t\t}\n\t\t\t\t// on any filesys errors revert to saving with object URLs\n\t\t\t\t, fs_error = function() {\n\t\t\t\t\tif ((is_chrome_ios || (force && is_safari)) && view.FileReader) {\n\t\t\t\t\t\t// Safari doesn't allow downloading of blob urls\n\t\t\t\t\t\tvar reader = new FileReader();\n\t\t\t\t\t\treader.onloadend = function() {\n\t\t\t\t\t\t\tvar url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');\n\t\t\t\t\t\t\tvar popup = view.open(url, '_blank');\n\t\t\t\t\t\t\tif(!popup) view.location.href = url;\n\t\t\t\t\t\t\turl=undefined; // release reference before dispatching\n\t\t\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\t\t\tdispatch_all();\n\t\t\t\t\t\t};\n\t\t\t\t\t\treader.readAsDataURL(blob);\n\t\t\t\t\t\tfilesaver.readyState = filesaver.INIT;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// don't create more object URLs than needed\n\t\t\t\t\tif (!object_url) {\n\t\t\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\t\t}\n\t\t\t\t\tif (force) {\n\t\t\t\t\t\tview.location.href = object_url;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar opened = view.open(object_url, \"_blank\");\n\t\t\t\t\t\tif (!opened) {\n\t\t\t\t\t\t\t// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html\n\t\t\t\t\t\t\tview.location.href = object_url;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t}\n\t\t\t;\n\t\t\tfilesaver.readyState = filesaver.INIT;\n\n\t\t\tif (can_use_save_link) {\n\t\t\t\tobject_url = get_URL().createObjectURL(blob);\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tsave_link.href = object_url;\n\t\t\t\t\tsave_link.download = name;\n\t\t\t\t\tclick(save_link);\n\t\t\t\t\tdispatch_all();\n\t\t\t\t\trevoke(object_url);\n\t\t\t\t\tfilesaver.readyState = filesaver.DONE;\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfs_error();\n\t\t}\n\t\t, FS_proto = FileSaver.prototype\n\t\t, saveAs = function(blob, name, no_auto_bom) {\n\t\t\treturn new FileSaver(blob, name || blob.name || \"download\", no_auto_bom);\n\t\t}\n\t;\n\t// IE 10+ (native saveAs)\n\tif (typeof navigator !== \"undefined\" && navigator.msSaveOrOpenBlob) {\n\t\treturn function(blob, name, no_auto_bom) {\n\t\t\tname = name || blob.name || \"download\";\n\n\t\t\tif (!no_auto_bom) {\n\t\t\t\tblob = auto_bom(blob);\n\t\t\t}\n\t\t\treturn navigator.msSaveOrOpenBlob(blob, name);\n\t\t};\n\t}\n\n\tFS_proto.abort = function(){};\n\tFS_proto.readyState = FS_proto.INIT = 0;\n\tFS_proto.WRITING = 1;\n\tFS_proto.DONE = 2;\n\n\tFS_proto.error =\n\tFS_proto.onwritestart =\n\tFS_proto.onprogress =\n\tFS_proto.onwrite =\n\tFS_proto.onabort =\n\tFS_proto.onerror =\n\tFS_proto.onwriteend =\n\t\tnull;\n\n\treturn saveAs;\n}(\n\t typeof self !== \"undefined\" && self\n\t|| typeof window !== \"undefined\" && window\n\t|| this.content\n));\n\n\n// Expose file saver on the DataTables API. Can't attach to `DataTables.Buttons`\n// since this file can be loaded before Button's core!\nDataTable.fileSave = _saveAs;\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Local (private) functions\n */\n\n/**\n * Get the sheet name for Excel exports.\n *\n * @param {object}\tconfig Button configuration\n */\nvar _sheetname = function ( config )\n{\n\tvar sheetName = 'Sheet1';\n\n\tif ( config.sheetName ) {\n\t\tsheetName = config.sheetName.replace(/[\\[\\]\\*\\/\\\\\\?\\:]/g, '');\n\t}\n\n\treturn sheetName;\n};\n\n/**\n * Get the newline character(s)\n *\n * @param {object}\tconfig Button configuration\n * @return {string}\t\t\t\tNewline character\n */\nvar _newLine = function ( config )\n{\n\treturn config.newline ?\n\t\tconfig.newline :\n\t\tnavigator.userAgent.match(/Windows/) ?\n\t\t\t'\\r\\n' :\n\t\t\t'\\n';\n};\n\n/**\n * Combine the data from the `buttons.exportData` method into a string that\n * will be used in the export file.\n *\n * @param\t{DataTable.Api} dt\t\t DataTables API instance\n * @param\t{object}\t\t\t\tconfig Button configuration\n * @return {object}\t\t\t\t\t\t\t The data to export\n */\nvar _exportData = function ( dt, config )\n{\n\tvar newLine = _newLine( config );\n\tvar data = dt.buttons.exportData( config.exportOptions );\n\tvar boundary = config.fieldBoundary;\n\tvar separator = config.fieldSeparator;\n\tvar reBoundary = new RegExp( boundary, 'g' );\n\tvar escapeChar = config.escapeChar !== undefined ?\n\t\tconfig.escapeChar :\n\t\t'\\\\';\n\tvar join = function ( a ) {\n\t\tvar s = '';\n\n\t\t// If there is a field boundary, then we might need to escape it in\n\t\t// the source data\n\t\tfor ( var i=0, ien=a.length ; i 0 ) {\n\t\t\t\ts += separator;\n\t\t\t}\n\n\t\t\ts += boundary ?\n\t\t\t\tboundary + ('' + a[i]).replace( reBoundary, escapeChar+boundary ) + boundary :\n\t\t\t\ta[i];\n\t\t}\n\n\t\treturn s;\n\t};\n\n\tvar header = config.header ? join( data.header )+newLine : '';\n\tvar footer = config.footer && data.footer ? newLine+join( data.footer ) : '';\n\tvar body = [];\n\n\tfor ( var i=0, ien=data.body.length ; i 1 && version[1]*1 < 603.1 ) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n/**\n * Convert from numeric position to letter for column names in Excel\n * @param {int} n Column number\n * @return {string} Column letter(s) name\n */\nfunction createCellPos( n ){\n\tvar ordA = 'A'.charCodeAt(0);\n\tvar ordZ = 'Z'.charCodeAt(0);\n\tvar len = ordZ - ordA + 1;\n\tvar s = \"\";\n\n\twhile( n >= 0 ) {\n\t\ts = String.fromCharCode(n % len + ordA) + s;\n\t\tn = Math.floor(n / len) - 1;\n\t}\n\n\treturn s;\n}\n\ntry {\n\tvar _serialiser = new XMLSerializer();\n\tvar _ieExcel;\n}\ncatch (t) {}\n\n/**\n * Recursively add XML files from an object's structure to a ZIP file. This\n * allows the XSLX file to be easily defined with an object's structure matching\n * the files structure.\n *\n * @param {JSZip} zip ZIP package\n * @param {object} obj Object to add (recursive)\n */\nfunction _addToZip( zip, obj ) {\n\tif ( _ieExcel === undefined ) {\n\t\t// Detect if we are dealing with IE's _awful_ serialiser by seeing if it\n\t\t// drop attributes\n\t\t_ieExcel = _serialiser\n\t\t\t.serializeToString(\n\t\t\t\t$.parseXML( excelStrings['xl/worksheets/sheet1.xml'] )\n\t\t\t)\n\t\t\t.indexOf( 'xmlns:r' ) === -1;\n\t}\n\n\t$.each( obj, function ( name, val ) {\n\t\tif ( $.isPlainObject( val ) ) {\n\t\t\tvar newDir = zip.folder( name );\n\t\t\t_addToZip( newDir, val );\n\t\t}\n\t\telse {\n\t\t\tif ( _ieExcel ) {\n\t\t\t\t// IE's XML serialiser will drop some name space attributes from\n\t\t\t\t// from the root node, so we need to save them. Do this by\n\t\t\t\t// replacing the namespace nodes with a regular attribute that\n\t\t\t\t// we convert back when serialised. Edge does not have this\n\t\t\t\t// issue\n\t\t\t\tvar worksheet = val.childNodes[0];\n\t\t\t\tvar i, ien;\n\t\t\t\tvar attrs = [];\n\n\t\t\t\tfor ( i=worksheet.attributes.length-1 ; i>=0 ; i-- ) {\n\t\t\t\t\tvar attrName = worksheet.attributes[i].nodeName;\n\t\t\t\t\tvar attrValue = worksheet.attributes[i].nodeValue;\n\n\t\t\t\t\tif ( attrName.indexOf( ':' ) !== -1 ) {\n\t\t\t\t\t\tattrs.push( { name: attrName, value: attrValue } );\n\n\t\t\t\t\t\tworksheet.removeAttribute( attrName );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i=0, ien=attrs.length ; i]*?) xmlns=\"\"([^<>]*?)>/g, '<$1 $2>' );\n\n\t\t\tzip.file( name, str );\n\t\t}\n\t} );\n}\n\n/**\n * Create an XML node and add any children, attributes, etc without needing to\n * be verbose in the DOM.\n *\n * @param {object} doc XML document\n * @param {string} nodeName Node name\n * @param {object} opts Options - can be `attr` (attributes), `children`\n * (child nodes) and `text` (text content)\n * @return {node} Created node\n */\nfunction _createNode( doc, nodeName, opts ) {\n\tvar tempNode = doc.createElement( nodeName );\n\n\tif ( opts ) {\n\t\tif ( opts.attr ) {\n\t\t\t$(tempNode).attr( opts.attr );\n\t\t}\n\n\t\tif ( opts.children ) {\n\t\t\t$.each( opts.children, function ( key, value ) {\n\t\t\t\ttempNode.appendChild( value );\n\t\t\t} );\n\t\t}\n\n\t\tif ( opts.text !== null && opts.text !== undefined ) {\n\t\t\ttempNode.appendChild( doc.createTextNode( opts.text ) );\n\t\t}\n\t}\n\n\treturn tempNode;\n}\n\n/**\n * Get the width for an Excel column based on the contents of that column\n * @param {object} data Data for export\n * @param {int} col Column index\n * @return {int} Column width\n */\nfunction _excelColWidth( data, col ) {\n\tvar max = data.header[col].length;\n\tvar len, lineSplit, str;\n\n\tif ( data.footer && data.footer[col].length > max ) {\n\t\tmax = data.footer[col].length;\n\t}\n\n\tfor ( var i=0, ien=data.body.length ; i max ) {\n\t\t\tmax = len;\n\t\t}\n\n\t\t// Max width rather than having potentially massive column widths\n\t\tif ( max > 40 ) {\n\t\t\treturn 54; // 40 * 1.35\n\t\t}\n\t}\n\n\tmax *= 1.35;\n\n\t// And a min width\n\treturn max > 6 ? max : 6;\n}\n\n// Excel - Pre-defined strings to build a basic XLSX file\nvar excelStrings = {\n\t\"_rels/.rels\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/_rels/workbook.xml.rels\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"[Content_Types].xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/workbook.xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/worksheets/sheet1.xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t'',\n\n\t\"xl/styles.xml\":\n\t\t''+\n\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+ // Excel appears to use this as a dotted background regardless of values but\n\t\t\t\t\t''+ // to be valid to the schema, use a patternFill\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t\t''+\n\t\t''\n};\n// Note we could use 3 `for` loops for the styles, but when gzipped there is\n// virtually no difference in size, since the above can be easily compressed\n\n// Pattern matching for special number formats. Perhaps this should be exposed\n// via an API in future?\n// Ref: section 3.8.30 - built in formatters in open spreadsheet\n// https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%204%20-%20Markup%20Language%20Reference.pdf\nvar _excelSpecials = [\n\t{ match: /^\\-?\\d+\\.\\d%$/, style: 60, fmt: function (d) { return d/100; } }, // Precent with d.p.\n\t{ match: /^\\-?\\d+\\.?\\d*%$/, style: 56, fmt: function (d) { return d/100; } }, // Percent\n\t{ match: /^\\-?\\$[\\d,]+.?\\d*$/, style: 57 }, // Dollars\n\t{ match: /^\\-?£[\\d,]+.?\\d*$/, style: 58 }, // Pounds\n\t{ match: /^\\-?€[\\d,]+.?\\d*$/, style: 59 }, // Euros\n\t{ match: /^\\-?\\d+$/, style: 65 }, // Numbers without thousand separators\n\t{ match: /^\\-?\\d+\\.\\d{2}$/, style: 66 }, // Numbers 2 d.p. without thousands separators\n\t{ match: /^\\([\\d,]+\\)$/, style: 61, fmt: function (d) { return -1 * d.replace(/[\\(\\)]/g, ''); } }, // Negative numbers indicated by brackets\n\t{ match: /^\\([\\d,]+\\.\\d{2}\\)$/, style: 62, fmt: function (d) { return -1 * d.replace(/[\\(\\)]/g, ''); } }, // Negative numbers indicated by brackets - 2d.p.\n\t{ match: /^\\-?[\\d,]+$/, style: 63 }, // Numbers with thousand separators\n\t{ match: /^\\-?[\\d,]+\\.\\d{2}$/, style: 64 } // Numbers with 2 d.p. and thousands separators\n];\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Buttons\n */\n\n//\n// Copy to clipboard\n//\nDataTable.ext.buttons.copyHtml5 = {\n\tclassName: 'buttons-copy buttons-html5',\n\n\ttext: function ( dt ) {\n\t\treturn dt.i18n( 'buttons.copy', 'Copy' );\n\t},\n\n\taction: function ( e, dt, button, config ) {\n\t\tthis.processing( true );\n\n\t\tvar that = this;\n\t\tvar exportData = _exportData( dt, config );\n\t\tvar info = dt.buttons.exportInfo( config );\n\t\tvar newline = _newLine(config);\n\t\tvar output = exportData.str;\n\t\tvar hiddenDiv = $('
      ')\n\t\t\t.css( {\n\t\t\t\theight: 1,\n\t\t\t\twidth: 1,\n\t\t\t\toverflow: 'hidden',\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t} );\n\n\t\tif ( info.title ) {\n\t\t\toutput = info.title + newline + newline + output;\n\t\t}\n\n\t\tif ( info.messageTop ) {\n\t\t\toutput = info.messageTop + newline + newline + output;\n\t\t}\n\n\t\tif ( info.messageBottom ) {\n\t\t\toutput = output + newline + newline + info.messageBottom;\n\t\t}\n\n\t\tif ( config.customize ) {\n\t\t\toutput = config.customize( output, config, dt );\n\t\t}\n\n\t\tvar textarea = $('