[ Mini Kiebo ]
Server: Windows NT AKFAR_SERVER 10.0 build 26200 (Windows 10) AMD64
Path:
D:
/
software bumsil
/
aplikasi
/
peminjaman
/
public
/
extensions
/
simple-datatables
/
module
/
[
Home
]
File: index.js.map
{"version":3,"file":"index.js","sources":["../../src/helpers.js","../../src/rows.js","../../src/columns.js","../../src/table.js","../../src/config.js","../../src/datatable.js"],"sourcesContent":["/**\n * Check is item is object\n * @return {Boolean}\n */\nexport const isObject = val => Object.prototype.toString.call(val) === \"[object Object]\"\n\n/**\n * Check for valid JSON string\n * @param {String} str\n * @return {Boolean|Array|Object}\n */\nexport const isJson = str => {\n let t = !1\n try {\n t = JSON.parse(str)\n } catch (e) {\n return !1\n }\n return !(null === t || (!Array.isArray(t) && !isObject(t))) && t\n}\n\n/**\n * Create DOM element node\n * @param {String} nodeName nodeName\n * @param {Object} attrs properties and attributes\n * @return {Object}\n */\nexport const createElement = (nodeName, attrs) => {\n const dom = document.createElement(nodeName)\n if (attrs && \"object\" == typeof attrs) {\n for (const attr in attrs) {\n if (\"html\" === attr) {\n dom.innerHTML = attrs[attr]\n } else {\n dom.setAttribute(attr, attrs[attr])\n }\n }\n }\n return dom\n}\n\nexport const flush = el => {\n if (el instanceof NodeList) {\n el.forEach(e => flush(e))\n } else {\n el.innerHTML = \"\"\n }\n}\n\n/**\n * Create button helper\n * @param {String} class\n * @param {Number} page\n * @param {String} text\n * @return {Object}\n */\nexport const button = (className, page, text) => createElement(\n \"li\",\n {\n class: className,\n html: `<a href=\"#\" data-page=\"${page}\">${text}</a>`\n }\n)\n\n/**\n * Bubble sort algorithm\n */\nexport const sortItems = (a, b) => {\n let c\n let d\n if (1 === b) {\n c = 0\n d = a.length\n } else {\n if (b === -1) {\n c = a.length - 1\n d = -1\n }\n }\n for (let e = !0; e;) {\n e = !1\n for (let f = c; f != d; f += b) {\n if (a[f + b] && a[f].value > a[f + b].value) {\n const g = a[f]\n const h = a[f + b]\n const i = g\n a[f] = h\n a[f + b] = i\n e = !0\n }\n }\n }\n return a\n}\n\n/**\n * Pager truncation algorithm\n */\nexport const truncate = (a, b, c, d, ellipsis) => {\n d = d || 2\n let j\n const e = 2 * d\n let f = b - d\n let g = b + d\n const h = []\n const i = []\n if (b < 4 - d + e) {\n g = 3 + e\n } else if (b > c - (3 - d + e)) {\n f = c - (2 + e)\n }\n for (let k = 1; k <= c; k++) {\n if (1 == k || k == c || (k >= f && k <= g)) {\n const l = a[k - 1]\n l.classList.remove(\"active\")\n h.push(l)\n }\n }\n h.forEach(c => {\n const d = c.children[0].getAttribute(\"data-page\")\n if (j) {\n const e = j.children[0].getAttribute(\"data-page\")\n if (d - e == 2) i.push(a[e])\n else if (d - e != 1) {\n const f = createElement(\"li\", {\n class: \"ellipsis\",\n html: `<a href=\"#\">${ellipsis}</a>`\n })\n i.push(f)\n }\n }\n i.push(c)\n j = c\n })\n\n return i\n}\n","import {createElement} from \"./helpers\"\n/**\n * Rows API\n * @param {Object} instance DataTable instance\n * @param {Array} rows\n */\nexport class Rows {\n constructor(dt, rows) {\n this.dt = dt\n this.rows = rows\n\n return this\n }\n\n /**\n * Build a new row\n * @param {Array} row\n * @return {HTMLElement}\n */\n build(row) {\n const tr = createElement(\"tr\")\n\n let headings = this.dt.headings\n\n if (!headings.length) {\n headings = row.map(() => \"\")\n }\n\n headings.forEach((h, i) => {\n const td = createElement(\"td\")\n\n // Fixes #29\n if (!row[i] || !row[i].length) {\n row[i] = \"\"\n }\n\n td.innerHTML = row[i]\n\n td.data = row[i]\n\n tr.appendChild(td)\n })\n\n return tr\n }\n\n render(row) {\n return row\n }\n\n /**\n * Add new row\n * @param {Array} select\n */\n add(data) {\n if (Array.isArray(data)) {\n const dt = this.dt\n // Check for multiple rows\n if (Array.isArray(data[0])) {\n data.forEach(row => {\n dt.data.push(this.build(row))\n })\n } else {\n dt.data.push(this.build(data))\n }\n\n // We may have added data to an empty table\n if ( dt.data.length ) {\n dt.hasRows = true\n }\n\n\n this.update()\n\n dt.columns().rebuild()\n }\n\n }\n\n /**\n * Remove row(s)\n * @param {Array|Number} select\n * @return {Void}\n */\n remove(select) {\n const dt = this.dt\n\n if (Array.isArray(select)) {\n // Remove in reverse otherwise the indexes will be incorrect\n select.sort((a, b) => b - a)\n\n select.forEach(row => {\n dt.data.splice(row, 1)\n })\n } else if (select == 'all') {\n dt.data = [];\n } else {\n dt.data.splice(select, 1)\n }\n\n // We may have emptied the table\n if ( !dt.data.length ) {\n dt.hasRows = false\n }\n\n this.update()\n dt.columns().rebuild()\n }\n\n /**\n * Update row indexes\n * @return {Void}\n */\n update() {\n this.dt.data.forEach((row, i) => {\n row.dataIndex = i\n })\n }\n}\n","import {sortItems} from \"./helpers\"\n\n/**\n * Columns API\n * @param {Object} instance DataTable instance\n * @param {Mixed} columns Column index or array of column indexes\n */\nexport class Columns {\n constructor(dt) {\n this.dt = dt\n return this\n }\n\n /**\n * Swap two columns\n * @return {Void}\n */\n swap(columns) {\n if (columns.length && columns.length === 2) {\n const cols = []\n\n // Get the current column indexes\n this.dt.headings.forEach((h, i) => {\n cols.push(i)\n })\n\n const x = columns[0]\n const y = columns[1]\n const b = cols[y]\n cols[y] = cols[x]\n cols[x] = b\n\n this.order(cols)\n }\n }\n\n /**\n * Reorder the columns\n * @return {Array} columns Array of ordered column indexes\n */\n order(columns) {\n let a\n let b\n let c\n let d\n let h\n let s\n let cell\n\n const temp = [\n [],\n [],\n [],\n []\n ]\n\n const dt = this.dt\n\n // Order the headings\n columns.forEach((column, x) => {\n h = dt.headings[column]\n s = h.getAttribute(\"data-sortable\") !== \"false\"\n a = h.cloneNode(true)\n a.originalCellIndex = x\n a.sortable = s\n\n temp[0].push(a)\n\n if (!dt.hiddenColumns.includes(column)) {\n b = h.cloneNode(true)\n b.originalCellIndex = x\n b.sortable = s\n\n temp[1].push(b)\n }\n })\n\n // Order the row cells\n dt.data.forEach((row, i) => {\n c = row.cloneNode(false)\n d = row.cloneNode(false)\n\n c.dataIndex = d.dataIndex = i\n\n if (row.searchIndex !== null && row.searchIndex !== undefined) {\n c.searchIndex = d.searchIndex = row.searchIndex\n }\n\n // Append the cell to the fragment in the correct order\n columns.forEach(column => {\n cell = row.cells[column].cloneNode(true)\n cell.data = row.cells[column].data\n c.appendChild(cell)\n\n if (!dt.hiddenColumns.includes(column)) {\n cell = row.cells[column].cloneNode(true)\n cell.data = row.cells[column].data\n d.appendChild(cell)\n }\n })\n\n temp[2].push(c)\n temp[3].push(d)\n })\n\n dt.headings = temp[0]\n dt.activeHeadings = temp[1]\n\n dt.data = temp[2]\n dt.activeRows = temp[3]\n\n // Update\n dt.update()\n }\n\n /**\n * Hide columns\n * @return {Void}\n */\n hide(columns) {\n if (columns.length) {\n const dt = this.dt\n\n columns.forEach(column => {\n if (!dt.hiddenColumns.includes(column)) {\n dt.hiddenColumns.push(column)\n }\n })\n\n this.rebuild()\n }\n }\n\n /**\n * Show columns\n * @return {Void}\n */\n show(columns) {\n if (columns.length) {\n let index\n const dt = this.dt\n\n columns.forEach(column => {\n index = dt.hiddenColumns.indexOf(column)\n if (index > -1) {\n dt.hiddenColumns.splice(index, 1)\n }\n })\n\n this.rebuild()\n }\n }\n\n /**\n * Check column(s) visibility\n * @return {Boolean}\n */\n visible(columns) {\n let cols\n const dt = this.dt\n\n columns = columns || dt.headings.map(th => th.originalCellIndex)\n\n if (!isNaN(columns)) {\n cols = !dt.hiddenColumns.includes(columns)\n } else if (Array.isArray(columns)) {\n cols = []\n columns.forEach(column => {\n cols.push(!dt.hiddenColumns.includes(column))\n })\n }\n\n return cols\n }\n\n /**\n * Add a new column\n * @param {Object} data\n */\n add(data) {\n let td\n const th = document.createElement(\"th\")\n\n if (!this.dt.headings.length) {\n this.dt.insert({\n headings: [data.heading],\n data: data.data.map(i => [i])\n })\n this.rebuild()\n return\n }\n\n if (!this.dt.hiddenHeader) {\n if (data.heading.nodeName) {\n th.appendChild(data.heading)\n } else {\n th.innerHTML = data.heading\n }\n } else {\n th.innerHTML = \"\"\n }\n\n this.dt.headings.push(th)\n\n this.dt.data.forEach((row, i) => {\n if (data.data[i]) {\n td = document.createElement(\"td\")\n\n if (data.data[i].nodeName) {\n td.appendChild(data.data[i])\n } else {\n td.innerHTML = data.data[i]\n }\n\n td.data = td.innerHTML\n\n if (data.render) {\n td.innerHTML = data.render.call(this, td.data, td, row)\n }\n\n row.appendChild(td)\n }\n })\n\n if (data.type) {\n th.setAttribute(\"data-type\", data.type)\n }\n if (data.format) {\n th.setAttribute(\"data-format\", data.format)\n }\n\n if (data.hasOwnProperty(\"sortable\")) {\n th.sortable = data.sortable\n th.setAttribute(\"data-sortable\", data.sortable === true ? \"true\" : \"false\")\n }\n\n this.rebuild()\n\n this.dt.renderHeader()\n }\n\n /**\n * Remove column(s)\n * @param {Array|Number} select\n * @return {Void}\n */\n remove(select) {\n if (Array.isArray(select)) {\n // Remove in reverse otherwise the indexes will be incorrect\n select.sort((a, b) => b - a)\n select.forEach(column => this.remove(column))\n } else {\n this.dt.headings.splice(select, 1)\n\n this.dt.data.forEach(row => {\n row.removeChild(row.cells[select])\n })\n }\n\n this.rebuild()\n }\n\n /**\n * Filter by column\n * @param {int} column - The column no.\n * @param {string} dir - asc or desc\n * @filter {array} filter - optional parameter with a list of strings\n * @return {void}\n */\n filter(column, dir, init, terms) {\n const dt = this.dt\n\n // Creates a internal state that manages filters if there are none\n if ( !dt.filterState ) {\n dt.filterState = {\n originalData: dt.data\n }\n }\n\n // If that column is was not filtered yet, we need to create its state\n if ( !dt.filterState[column] ) {\n\n // append a filter that selects all rows, 'resetting' the filter\n const filters = [...terms, () => true]\n\n dt.filterState[column] = (\n function() {\n let i = 0;\n return () => filters[i++ % (filters.length)]\n }()\n )\n }\n\n // Apply the filter and rebuild table\n const rowFilter = dt.filterState[column]() // fetches next filter\n const filteredRows = Array.from(dt.filterState.originalData).filter(tr => {\n const cell = tr.cells[column]\n const content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.innerText\n\n // If the filter is a function, call it, if it is a string, compare it\n return (typeof rowFilter) === 'function' ? rowFilter(content) : content === rowFilter;\n })\n\n dt.data = filteredRows\n this.rebuild()\n dt.update()\n if (!init) {\n dt.emit(\"datatable.sort\", column, dir)\n }\n }\n\n /**\n * Sort by column\n * @param {int} column - The column no.\n * @param {string} dir - asc or desc\n * @return {void}\n */\n sort(column, dir, init) {\n const dt = this.dt\n\n // Check column is present\n if (dt.hasHeadings && (column < 0 || column > dt.headings.length)) {\n return false\n }\n\n //If there is a filter for this column, apply it instead of sorting\n const filterTerms = dt.options.filters &&\n dt.options.filters[dt.headings[column].textContent]\n if ( filterTerms && filterTerms.length !== 0 ) {\n this.filter(column, dir, init, filterTerms)\n return;\n }\n\n dt.sorting = true\n\n if (!init) {\n dt.emit(\"datatable.sorting\", column, dir)\n }\n\n let rows = dt.data\n const alpha = []\n const numeric = []\n let a = 0\n let n = 0\n const th = dt.headings[column]\n\n const waitFor = []\n\n // Check for date format\n if (th.getAttribute(\"data-type\") === \"date\") {\n let format = false\n const formatted = th.hasAttribute(\"data-format\")\n\n if (formatted) {\n format = th.getAttribute(\"data-format\")\n }\n waitFor.push(import(\"./date\").then(({parseDate}) => date => parseDate(date, format)))\n }\n\n Promise.all(waitFor).then(importedFunctions => {\n const parseFunction = importedFunctions[0] // only defined if date\n Array.from(rows).forEach(tr => {\n const cell = tr.cells[column]\n const content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.innerText\n let num\n if (parseFunction) {\n num = parseFunction(content)\n } else if (typeof content===\"string\") {\n num = content.replace(/(\\$|,|\\s|%)/g, \"\")\n } else {\n num = content\n }\n\n if (parseFloat(num) == num) {\n numeric[n++] = {\n value: Number(num),\n row: tr\n }\n } else {\n alpha[a++] = {\n value: typeof content===\"string\" ? content.toLowerCase() : content,\n row: tr\n }\n }\n })\n\n /* Sort according to direction (ascending or descending) */\n if (!dir) {\n if (th.classList.contains(\"asc\")) {\n dir = \"desc\"\n } else {\n dir = \"asc\"\n }\n }\n let top\n let btm\n if (dir == \"desc\") {\n top = sortItems(alpha, -1)\n btm = sortItems(numeric, -1)\n th.classList.remove(\"asc\")\n th.classList.add(\"desc\")\n } else {\n top = sortItems(numeric, 1)\n btm = sortItems(alpha, 1)\n th.classList.remove(\"desc\")\n th.classList.add(\"asc\")\n }\n\n /* Clear asc/desc class names from the last sorted column's th if it isn't the same as the one that was just clicked */\n if (dt.lastTh && th != dt.lastTh) {\n dt.lastTh.classList.remove(\"desc\")\n dt.lastTh.classList.remove(\"asc\")\n }\n\n dt.lastTh = th\n\n /* Reorder the table */\n rows = top.concat(btm)\n\n dt.data = []\n const indexes = []\n\n rows.forEach((v, i) => {\n dt.data.push(v.row)\n\n if (v.row.searchIndex !== null && v.row.searchIndex !== undefined) {\n indexes.push(i)\n }\n })\n\n dt.searchData = indexes\n\n this.rebuild()\n\n dt.update()\n\n if (!init) {\n dt.emit(\"datatable.sort\", column, dir)\n }\n })\n }\n\n /**\n * Rebuild the columns\n * @return {Void}\n */\n rebuild() {\n let a\n let b\n let c\n let d\n const dt = this.dt\n const temp = []\n\n dt.activeRows = []\n dt.activeHeadings = []\n\n dt.headings.forEach((th, i) => {\n th.originalCellIndex = i\n th.sortable = th.getAttribute(\"data-sortable\") !== \"false\"\n if (!dt.hiddenColumns.includes(i)) {\n dt.activeHeadings.push(th)\n }\n })\n\n // Loop over the rows and reorder the cells\n dt.data.forEach((row, i) => {\n a = row.cloneNode(false)\n b = row.cloneNode(false)\n\n a.dataIndex = b.dataIndex = i\n\n if (row.searchIndex !== null && row.searchIndex !== undefined) {\n a.searchIndex = b.searchIndex = row.searchIndex\n }\n\n // Append the cell to the fragment in the correct order\n Array.from(row.cells).forEach(cell => {\n c = cell.cloneNode(true)\n c.data = cell.data\n a.appendChild(c)\n\n if (!dt.hiddenColumns.includes(c.cellIndex)) {\n d = c.cloneNode(true)\n d.data = c.data\n b.appendChild(d)\n }\n })\n\n // Append the fragment with the ordered cells\n temp.push(a)\n dt.activeRows.push(b)\n })\n\n dt.data = temp\n\n dt.update()\n }\n}\n","import {createElement} from \"./helpers\"\n\n/**\n * Parse data to HTML table\n */\nexport const dataToTable = function (data) {\n let thead = false\n let tbody = false\n\n data = data || this.options.data\n\n if (data.headings) {\n thead = createElement(\"thead\")\n const tr = createElement(\"tr\")\n data.headings.forEach(col => {\n const td = createElement(\"th\", {\n html: col\n })\n tr.appendChild(td)\n })\n\n thead.appendChild(tr)\n }\n\n if (data.data && data.data.length) {\n tbody = createElement(\"tbody\")\n data.data.forEach(rows => {\n if (data.headings) {\n if (data.headings.length !== rows.length) {\n throw new Error(\n \"The number of rows do not match the number of headings.\"\n )\n }\n }\n const tr = createElement(\"tr\")\n rows.forEach(value => {\n const td = createElement(\"td\", {\n html: value\n })\n tr.appendChild(td)\n })\n tbody.appendChild(tr)\n })\n }\n\n if (thead) {\n if (this.table.tHead !== null) {\n this.table.removeChild(this.table.tHead)\n }\n this.table.appendChild(thead)\n }\n\n if (tbody) {\n if (this.table.tBodies.length) {\n this.table.removeChild(this.table.tBodies[0])\n }\n this.table.appendChild(tbody)\n }\n}\n","/**\n * Default configuration\n * @typ {Object}\n */\nexport const defaultConfig = {\n sortable: true,\n searchable: true,\n\n // Pagination\n paging: true,\n perPage: 10,\n perPageSelect: [5, 10, 15, 20, 25],\n nextPrev: true,\n firstLast: false,\n prevText: \"‹\",\n nextText: \"›\",\n firstText: \"«\",\n lastText: \"»\",\n ellipsisText: \"…\",\n ascText: \"▴\",\n descText: \"▾\",\n truncatePager: true,\n pagerDelta: 2,\n\n scrollY: \"\",\n\n fixedColumns: true,\n fixedHeight: false,\n\n header: true,\n hiddenHeader: false,\n footer: false,\n\n // Customise the display text\n labels: {\n placeholder: \"Search...\", // The search input placeholder\n perPage: \"{select} entries per page\", // per-page dropdown label\n noRows: \"No entries found\", // Message shown when there are no search results\n info: \"Showing {start} to {end} of {rows} entries\" //\n },\n\n // Customise the layout\n layout: {\n top: \"{select}{search}\",\n bottom: \"{info}{pager}\"\n }\n}\n","import {Rows} from \"./rows\"\nimport {Columns} from \"./columns\"\nimport {dataToTable} from \"./table\"\nimport {defaultConfig} from \"./config\"\nimport {\n isObject,\n isJson,\n createElement,\n flush,\n button,\n truncate\n} from \"./helpers\"\n\n\nexport class DataTable {\n constructor(table, options = {}) {\n this.initialized = false\n\n // user options\n this.options = {\n ...defaultConfig,\n ...options,\n layout: {\n ...defaultConfig.layout,\n ...options.layout\n },\n labels: {\n ...defaultConfig.labels,\n ...options.labels\n }\n }\n\n if (typeof table === \"string\") {\n table = document.querySelector(table)\n }\n\n this.initialLayout = table.innerHTML\n this.initialSortable = this.options.sortable\n\n // Disable manual sorting if no header is present (#4)\n if (!this.options.header) {\n this.options.sortable = false\n }\n\n if (table.tHead === null) {\n if (!this.options.data ||\n (this.options.data && !this.options.data.headings)\n ) {\n this.options.sortable = false\n }\n }\n\n if (table.tBodies.length && !table.tBodies[0].rows.length) {\n if (this.options.data) {\n if (!this.options.data.data) {\n throw new Error(\n \"You seem to be using the data option, but you've not defined any rows.\"\n )\n }\n }\n }\n\n this.table = table\n\n this.listeners = {\n onResize: event => this.onResize(event)\n }\n\n this.init()\n }\n\n /**\n * Add custom property or method to extend DataTable\n * @param {String} prop - Method name or property\n * @param {Mixed} val - Function or property value\n * @return {Void}\n */\n static extend(prop, val) {\n if (typeof val === \"function\") {\n DataTable.prototype[prop] = val\n } else {\n DataTable[prop] = val\n }\n }\n\n /**\n * Initialize the instance\n * @param {Object} options\n * @return {Void}\n */\n init(options) {\n if (this.initialized || this.table.classList.contains(\"dataTable-table\")) {\n return false\n }\n\n Object.assign(this.options, options || {})\n\n this.currentPage = 1\n this.onFirstPage = true\n\n this.hiddenColumns = []\n this.columnRenderers = []\n this.selectedColumns = []\n\n this.render()\n\n setTimeout(() => {\n this.emit(\"datatable.init\")\n this.initialized = true\n\n if (this.options.plugins) {\n Object.entries(this.options.plugins).forEach(([plugin, options]) => {\n if (this[plugin] && typeof this[plugin] === \"function\") {\n this[plugin] = this[plugin](options, {createElement})\n\n // Init plugin\n if (options.enabled && this[plugin].init && typeof this[plugin].init === \"function\") {\n this[plugin].init()\n }\n }\n })\n }\n }, 10)\n }\n\n /**\n * Render the instance\n * @param {String} type\n * @return {Void}\n */\n render(type) {\n if (type) {\n switch (type) {\n case \"page\":\n this.renderPage()\n break\n case \"pager\":\n this.renderPager()\n break\n case \"header\":\n this.renderHeader()\n break\n }\n\n return false\n }\n\n const options = this.options\n let template = \"\"\n\n // Convert data to HTML\n if (options.data) {\n dataToTable.call(this)\n }\n\n // Store references\n this.body = this.table.tBodies[0]\n this.head = this.table.tHead\n this.foot = this.table.tFoot\n\n if (!this.body) {\n this.body = createElement(\"tbody\")\n\n this.table.appendChild(this.body)\n }\n\n this.hasRows = this.body.rows.length > 0\n\n // Make a tHead if there isn't one (fixes #8)\n if (!this.head) {\n const h = createElement(\"thead\")\n const t = createElement(\"tr\")\n\n if (this.hasRows) {\n Array.from(this.body.rows[0].cells).forEach(() => {\n t.appendChild(createElement(\"th\"))\n })\n\n h.appendChild(t)\n }\n\n this.head = h\n\n this.table.insertBefore(this.head, this.body)\n\n this.hiddenHeader = options.hiddenHeader\n }\n\n this.headings = []\n this.hasHeadings = this.head.rows.length > 0\n\n if (this.hasHeadings) {\n this.header = this.head.rows[0]\n this.headings = [].slice.call(this.header.cells)\n }\n\n // Header\n if (!options.header) {\n if (this.head) {\n this.table.removeChild(this.table.tHead)\n }\n }\n\n // Footer\n if (options.footer) {\n if (this.head && !this.foot) {\n this.foot = createElement(\"tfoot\", {\n html: this.head.innerHTML\n })\n this.table.appendChild(this.foot)\n }\n } else {\n if (this.foot) {\n this.table.removeChild(this.table.tFoot)\n }\n }\n\n // Build\n this.wrapper = createElement(\"div\", {\n class: \"dataTable-wrapper dataTable-loading\"\n })\n\n // Template for custom layouts\n template += \"<div class='dataTable-top'>\"\n template += options.layout.top\n template += \"</div>\"\n if (options.scrollY.length) {\n template += `<div class='dataTable-container' style='height: ${options.scrollY}; overflow-Y: auto;'></div>`\n } else {\n template += \"<div class='dataTable-container'></div>\"\n }\n template += \"<div class='dataTable-bottom'>\"\n template += options.layout.bottom\n template += \"</div>\"\n\n // Info placement\n template = template.replace(\"{info}\", options.paging ? \"<div class='dataTable-info'></div>\" : \"\")\n\n // Per Page Select\n if (options.paging && options.perPageSelect) {\n let wrap = \"<div class='dataTable-dropdown'><label>\"\n wrap += options.labels.perPage\n wrap += \"</label></div>\"\n\n // Create the select\n const select = createElement(\"select\", {\n class: \"dataTable-selector\"\n })\n\n // Create the options\n options.perPageSelect.forEach(val => {\n const selected = val === options.perPage\n const option = new Option(val, val, selected, selected)\n select.add(option)\n })\n\n // Custom label\n wrap = wrap.replace(\"{select}\", select.outerHTML)\n\n // Selector placement\n template = template.replace(\"{select}\", wrap)\n } else {\n template = template.replace(\"{select}\", \"\")\n }\n\n // Searchable\n if (options.searchable) {\n const form =\n `<div class='dataTable-search'><input class='dataTable-input' placeholder='${options.labels.placeholder}' type='text'></div>`\n\n // Search input placement\n template = template.replace(\"{search}\", form)\n } else {\n template = template.replace(\"{search}\", \"\")\n }\n\n if (this.hasHeadings) {\n // Sortable\n this.render(\"header\")\n }\n\n // Add table class\n this.table.classList.add(\"dataTable-table\")\n\n // Paginator\n const paginatorWrapper = createElement(\"nav\", {\n class: \"dataTable-pagination\"\n })\n const paginator = createElement(\"ul\", {\n class: \"dataTable-pagination-list\"\n })\n paginatorWrapper.appendChild(paginator)\n\n // Pager(s) placement\n template = template.replace(/\\{pager\\}/g, paginatorWrapper.outerHTML)\n this.wrapper.innerHTML = template\n\n this.container = this.wrapper.querySelector(\".dataTable-container\")\n\n this.pagers = this.wrapper.querySelectorAll(\".dataTable-pagination-list\")\n\n this.label = this.wrapper.querySelector(\".dataTable-info\")\n\n // Insert in to DOM tree\n this.table.parentNode.replaceChild(this.wrapper, this.table)\n this.container.appendChild(this.table)\n\n // Store the table dimensions\n this.rect = this.table.getBoundingClientRect()\n\n // Convert rows to array for processing\n this.data = Array.from(this.body.rows)\n this.activeRows = this.data.slice()\n this.activeHeadings = this.headings.slice()\n\n // Update\n this.update()\n\n\n this.setColumns()\n\n\n // Fix height\n this.fixHeight()\n\n // Fix columns\n this.fixColumns()\n\n // Class names\n if (!options.header) {\n this.wrapper.classList.add(\"no-header\")\n }\n\n if (!options.footer) {\n this.wrapper.classList.add(\"no-footer\")\n }\n\n if (options.sortable) {\n this.wrapper.classList.add(\"sortable\")\n }\n\n if (options.searchable) {\n this.wrapper.classList.add(\"searchable\")\n }\n\n if (options.fixedHeight) {\n this.wrapper.classList.add(\"fixed-height\")\n }\n\n if (options.fixedColumns) {\n this.wrapper.classList.add(\"fixed-columns\")\n }\n\n this.bindEvents()\n }\n\n /**\n * Render the page\n * @return {Void}\n */\n renderPage() {\n if (this.hasHeadings) {\n flush(this.header)\n\n this.activeHeadings.forEach(th => this.header.appendChild(th))\n }\n\n\n if (this.hasRows && this.totalPages) {\n if (this.currentPage > this.totalPages) {\n this.currentPage = 1\n }\n\n // Use a fragment to limit touching the DOM\n const index = this.currentPage - 1\n\n const frag = document.createDocumentFragment()\n this.pages[index].forEach(row => frag.appendChild(this.rows().render(row)))\n\n this.clear(frag)\n\n this.onFirstPage = this.currentPage === 1\n this.onLastPage = this.currentPage === this.lastPage\n } else {\n this.setMessage(this.options.labels.noRows)\n }\n\n // Update the info\n let current = 0\n\n let f = 0\n let t = 0\n let items\n\n if (this.totalPages) {\n current = this.currentPage - 1\n f = current * this.options.perPage\n t = f + this.pages[current].length\n f = f + 1\n items = this.searching ? this.searchData.length : this.data.length\n }\n\n if (this.label && this.options.labels.info.length) {\n // CUSTOM LABELS\n const string = this.options.labels.info\n .replace(\"{start}\", f)\n .replace(\"{end}\", t)\n .replace(\"{page}\", this.currentPage)\n .replace(\"{pages}\", this.totalPages)\n .replace(\"{rows}\", items)\n\n this.label.innerHTML = items ? string : \"\"\n }\n\n if (this.currentPage == 1) {\n this.fixHeight()\n }\n }\n\n /**\n * Render the pager(s)\n * @return {Void}\n */\n renderPager() {\n flush(this.pagers)\n\n if (this.totalPages > 1) {\n const c = \"pager\"\n const frag = document.createDocumentFragment()\n const prev = this.onFirstPage ? 1 : this.currentPage - 1\n const next = this.onLastPage ? this.totalPages : this.currentPage + 1\n\n // first button\n if (this.options.firstLast) {\n frag.appendChild(button(c, 1, this.options.firstText))\n }\n\n // prev button\n if (this.options.nextPrev) {\n frag.appendChild(button(c, prev, this.options.prevText))\n }\n\n let pager = this.links\n\n // truncate the links\n if (this.options.truncatePager) {\n pager = truncate(\n this.links,\n this.currentPage,\n this.pages.length,\n this.options.pagerDelta,\n this.options.ellipsisText\n )\n }\n\n // active page link\n this.links[this.currentPage - 1].classList.add(\"active\")\n\n // append the links\n pager.forEach(p => {\n p.classList.remove(\"active\")\n frag.appendChild(p)\n })\n\n this.links[this.currentPage - 1].classList.add(\"active\")\n\n // next button\n if (this.options.nextPrev) {\n frag.appendChild(button(c, next, this.options.nextText))\n }\n\n // first button\n if (this.options.firstLast) {\n frag.appendChild(button(c, this.totalPages, this.options.lastText))\n }\n\n // We may have more than one pager\n this.pagers.forEach(pager => {\n pager.appendChild(frag.cloneNode(true))\n })\n }\n }\n\n /**\n * Render the header\n * @return {Void}\n */\n renderHeader() {\n this.labels = []\n\n if (this.headings && this.headings.length) {\n this.headings.forEach((th, i) => {\n\n this.labels[i] = th.textContent\n\n if (th.firstElementChild && th.firstElementChild.classList.contains(\"dataTable-sorter\")) {\n th.innerHTML = th.firstElementChild.innerHTML\n }\n\n th.sortable = th.getAttribute(\"data-sortable\") !== \"false\"\n\n th.originalCellIndex = i\n if (this.options.sortable && th.sortable) {\n const link = createElement(\"a\", {\n href: \"#\",\n class: \"dataTable-sorter\",\n html: th.innerHTML\n })\n\n th.innerHTML = \"\"\n th.setAttribute(\"data-sortable\", \"\")\n th.appendChild(link)\n }\n })\n }\n\n this.fixColumns()\n }\n\n /**\n * Bind event listeners\n * @return {[type]} [description]\n */\n bindEvents() {\n const options = this.options\n // Per page selector\n if (options.perPageSelect) {\n const selector = this.wrapper.querySelector(\".dataTable-selector\")\n if (selector) {\n // Change per page\n selector.addEventListener(\"change\", () => {\n options.perPage = parseInt(selector.value, 10)\n this.update()\n\n this.fixHeight()\n\n this.emit(\"datatable.perpage\", options.perPage)\n }, false)\n }\n }\n\n // Search input\n if (options.searchable) {\n this.input = this.wrapper.querySelector(\".dataTable-input\")\n if (this.input) {\n this.input.addEventListener(\"keyup\", () => this.search(this.input.value), false)\n }\n }\n\n // Pager(s) / sorting\n this.wrapper.addEventListener(\"click\", e => {\n const t = e.target.closest('a')\n if (t && (t.nodeName.toLowerCase() === \"a\")) {\n if (t.hasAttribute(\"data-page\")) {\n this.page(t.getAttribute(\"data-page\"))\n e.preventDefault()\n } else if (\n options.sortable &&\n t.classList.contains(\"dataTable-sorter\") &&\n t.parentNode.getAttribute(\"data-sortable\") != \"false\"\n ) {\n this.columns().sort(this.headings.indexOf(t.parentNode))\n e.preventDefault()\n }\n }\n }, false)\n\n window.addEventListener(\"resize\", this.listeners.onResize)\n }\n\n /**\n * execute on resize\n */\n onResize() {\n this.rect = this.container.getBoundingClientRect()\n if (!this.rect.width) {\n // No longer shown, likely no longer part of DOM. Give up.\n return\n }\n this.fixColumns()\n }\n\n /**\n * Set up columns\n * @return {[type]} [description]\n */\n setColumns(ajax) {\n\n if (!ajax) {\n this.data.forEach(row => {\n Array.from(row.cells).forEach(cell => {\n cell.data = cell.innerHTML\n })\n })\n }\n\n // Check for the columns option\n if (this.options.columns && this.headings.length) {\n\n this.options.columns.forEach(data => {\n\n // convert single column selection to array\n if (!Array.isArray(data.select)) {\n data.select = [data.select]\n }\n\n if (data.hasOwnProperty(\"render\") && typeof data.render === \"function\") {\n this.selectedColumns = this.selectedColumns.concat(data.select)\n\n this.columnRenderers.push({\n columns: data.select,\n renderer: data.render\n })\n }\n\n // Add the data attributes to the th elements\n data.select.forEach(column => {\n const th = this.headings[column]\n if (data.type) {\n th.setAttribute(\"data-type\", data.type)\n }\n if (data.format) {\n th.setAttribute(\"data-format\", data.format)\n }\n if (data.hasOwnProperty(\"sortable\")) {\n th.setAttribute(\"data-sortable\", data.sortable)\n }\n\n if (data.hasOwnProperty(\"hidden\")) {\n if (data.hidden !== false) {\n this.columns().hide([column])\n }\n }\n\n if (data.hasOwnProperty(\"sort\") && data.select.length === 1) {\n this.columns().sort(data.select[0], data.sort, true)\n }\n })\n })\n }\n\n if (this.hasRows) {\n this.data.forEach((row, i) => {\n row.dataIndex = i\n Array.from(row.cells).forEach(cell => {\n cell.data = cell.innerHTML\n })\n })\n\n if (this.selectedColumns.length) {\n this.data.forEach(row => {\n Array.from(row.cells).forEach((cell, i) => {\n if (this.selectedColumns.includes(i)) {\n this.columnRenderers.forEach(options => {\n if (options.columns.includes(i)) {\n cell.innerHTML = options.renderer.call(this, cell.data, cell, row)\n }\n })\n }\n })\n })\n }\n\n this.columns().rebuild()\n }\n\n this.render(\"header\")\n }\n\n /**\n * Destroy the instance\n * @return {void}\n */\n destroy() {\n this.table.innerHTML = this.initialLayout\n\n // Remove the className\n this.table.classList.remove(\"dataTable-table\")\n\n // Remove the containers\n this.wrapper.parentNode.replaceChild(this.table, this.wrapper)\n\n this.initialized = false\n\n window.removeEventListener(\"resize\", this.listeners.onResize)\n }\n\n /**\n * Update the instance\n * @return {Void}\n */\n update() {\n this.wrapper.classList.remove(\"dataTable-empty\")\n\n this.paginate(this)\n this.render(\"page\")\n\n this.links = []\n\n let i = this.pages.length\n while (i--) {\n const num = i + 1\n this.links[i] = button(i === 0 ? \"active\" : \"\", num, num)\n }\n\n this.sorting = false\n\n this.render(\"pager\")\n\n this.rows().update()\n\n this.emit(\"datatable.update\")\n }\n\n /**\n * Sort rows into pages\n * @return {Number}\n */\n paginate() {\n const perPage = this.options.perPage\n let rows = this.activeRows\n\n if (this.searching) {\n rows = []\n\n this.searchData.forEach(index => rows.push(this.activeRows[index]))\n }\n\n if (this.options.paging) {\n // Check for hidden columns\n this.pages = rows\n .map((tr, i) => i % perPage === 0 ? rows.slice(i, i + perPage) : null)\n .filter(page => page)\n } else {\n this.pages = [rows]\n }\n\n this.totalPages = this.lastPage = this.pages.length\n\n return this.totalPages\n }\n\n /**\n * Fix column widths\n * @return {Void}\n */\n fixColumns() {\n\n if ((this.options.scrollY.length || this.options.fixedColumns) && this.activeHeadings && this.activeHeadings.length) {\n let cells\n let hd = false\n this.columnWidths = []\n\n // If we have headings we need only set the widths on them\n // otherwise we need a temp header and the widths need applying to all cells\n if (this.table.tHead) {\n\n if (this.options.scrollY.length) {\n hd = createElement(\"thead\")\n hd.appendChild(createElement(\"tr\"))\n hd.style.height = '0px'\n if (this.headerTable) {\n // move real header back into place\n this.table.tHead = this.headerTable.tHead\n }\n }\n\n // Reset widths\n this.activeHeadings.forEach(cell => {\n cell.style.width = \"\"\n })\n\n this.activeHeadings.forEach((cell, i) => {\n const ow = cell.offsetWidth\n const w = ow / this.rect.width * 100\n cell.style.width = `${w}%`\n this.columnWidths[i] = ow\n if (this.options.scrollY.length) {\n const th = createElement(\"th\")\n hd.firstElementChild.appendChild(th)\n th.style.width = `${w}%`\n th.style.paddingTop = \"0\"\n th.style.paddingBottom = \"0\"\n th.style.border = \"0\"\n }\n })\n\n if (this.options.scrollY.length) {\n const container = this.table.parentElement\n if (!this.headerTable) {\n this.headerTable = createElement(\"table\", {\n class: \"dataTable-table\"\n })\n const headercontainer = createElement(\"div\", {\n class: \"dataTable-headercontainer\"\n })\n headercontainer.appendChild(this.headerTable)\n container.parentElement.insertBefore(headercontainer, container)\n }\n const thd = this.table.tHead\n this.table.replaceChild(hd, thd)\n this.headerTable.tHead = thd\n\n // Compensate for scrollbars.\n this.headerTable.parentElement.style.paddingRight = `${\n this.headerTable.clientWidth -\n this.table.clientWidth +\n parseInt(\n this.headerTable.parentElement.style.paddingRight ||\n '0',\n 10\n )\n }px`\n\n if (container.scrollHeight > container.clientHeight) {\n // scrollbars on one page means scrollbars on all pages.\n container.style.overflowY = 'scroll'\n }\n }\n\n } else {\n cells = []\n\n // Make temperary headings\n hd = createElement(\"thead\")\n const r = createElement(\"tr\")\n Array.from(this.table.tBodies[0].rows[0].cells).forEach(() => {\n const th = createElement(\"th\")\n r.appendChild(th)\n cells.push(th)\n })\n\n hd.appendChild(r)\n this.table.insertBefore(hd, this.body)\n\n const widths = []\n cells.forEach((cell, i) => {\n const ow = cell.offsetWidth\n const w = ow / this.rect.width * 100\n widths.push(w)\n this.columnWidths[i] = ow\n })\n\n this.data.forEach(row => {\n Array.from(row.cells).forEach((cell, i) => {\n if (this.columns(cell.cellIndex).visible())\n cell.style.width = `${widths[i]}%`\n })\n })\n\n // Discard the temp header\n this.table.removeChild(hd)\n }\n }\n }\n\n /**\n * Fix the container height\n * @return {Void}\n */\n fixHeight() {\n if (this.options.fixedHeight) {\n this.container.style.height = null\n this.rect = this.container.getBoundingClientRect()\n this.container.style.height = `${this.rect.height}px`\n }\n }\n\n /**\n * Perform a search of the data set\n * @param {string} query\n * @return {void}\n */\n search(query) {\n if (!this.hasRows) return false\n\n query = query.toLowerCase()\n\n this.currentPage = 1\n this.searching = true\n this.searchData = []\n\n if (!query.length) {\n this.searching = false\n this.update()\n this.emit(\"datatable.search\", query, this.searchData)\n this.wrapper.classList.remove(\"search-results\")\n return false\n }\n\n this.clear()\n\n this.data.forEach((row, idx) => {\n const inArray = this.searchData.includes(row)\n\n // https://github.com/Mobius1/Vanilla-DataTables/issues/12\n const doesQueryMatch = query.split(\" \").reduce((bool, word) => {\n let includes = false\n let cell = null\n let content = null\n\n for (let x = 0; x < row.cells.length; x++) {\n cell = row.cells[x]\n content = cell.hasAttribute('data-content') ? cell.getAttribute('data-content') : cell.textContent\n\n if (\n content.toLowerCase().includes(word) &&\n this.columns(cell.cellIndex).visible()\n ) {\n includes = true\n break\n }\n }\n\n return bool && includes\n }, true)\n\n if (doesQueryMatch && !inArray) {\n row.searchIndex = idx\n this.searchData.push(idx)\n } else {\n row.searchIndex = null\n }\n })\n\n this.wrapper.classList.add(\"search-results\")\n\n if (!this.searchData.length) {\n this.wrapper.classList.remove(\"search-results\")\n\n this.setMessage(this.options.labels.noRows)\n } else {\n this.update()\n }\n\n this.emit(\"datatable.search\", query, this.searchData)\n }\n\n /**\n * Change page\n * @param {int} page\n * @return {void}\n */\n page(page) {\n // We don't want to load the current page again.\n if (page == this.currentPage) {\n return false\n }\n\n if (!isNaN(page)) {\n this.currentPage = parseInt(page, 10)\n }\n\n if (page > this.pages.length || page < 0) {\n return false\n }\n\n this.render(\"page\")\n this.render(\"pager\")\n\n this.emit(\"datatable.page\", page)\n }\n\n /**\n * Sort by column\n * @param {int} column - The column no.\n * @param {string} direction - asc or desc\n * @return {void}\n */\n sortColumn(column, direction) {\n // Use columns API until sortColumn method is removed\n this.columns().sort(column, direction)\n }\n\n /**\n * Add new row data\n * @param {object} data\n */\n insert(data) {\n let rows = []\n if (isObject(data)) {\n if (data.headings) {\n if (!this.hasHeadings && !this.hasRows) {\n const tr = createElement(\"tr\")\n data.headings.forEach(heading => {\n const th = createElement(\"th\", {\n html: heading\n })\n\n tr.appendChild(th)\n })\n this.head.appendChild(tr)\n\n this.header = tr\n this.headings = [].slice.call(tr.cells)\n this.hasHeadings = true\n\n // Re-enable sorting if it was disabled due\n // to missing header\n this.options.sortable = this.initialSortable\n\n // Allow sorting on new header\n this.render(\"header\")\n\n // Activate newly added headings\n this.activeHeadings = this.headings.slice()\n }\n }\n\n if (data.data && Array.isArray(data.data)) {\n rows = data.data\n }\n } else if (Array.isArray(data)) {\n data.forEach(row => {\n const r = []\n Object.entries(row).forEach(([heading, cell]) => {\n\n const index = this.labels.indexOf(heading)\n\n if (index > -1) {\n r[index] = cell\n }\n })\n rows.push(r)\n })\n }\n\n if (rows.length) {\n this.rows().add(rows)\n\n this.hasRows = true\n }\n\n this.update()\n this.setColumns()\n this.fixColumns()\n }\n\n /**\n * Refresh the instance\n * @return {void}\n */\n refresh() {\n if (this.options.searchable) {\n this.input.value = \"\"\n this.searching = false\n }\n this.currentPage = 1\n this.onFirstPage = true\n this.update()\n\n this.emit(\"datatable.refresh\")\n }\n\n /**\n * Truncate the table\n * @param {mixes} html - HTML string or HTMLElement\n * @return {void}\n */\n clear(html) {\n if (this.body) {\n flush(this.body)\n }\n\n let parent = this.body\n if (!this.body) {\n parent = this.table\n }\n\n if (html) {\n if (typeof html === \"string\") {\n const frag = document.createDocumentFragment()\n frag.innerHTML = html\n }\n\n parent.appendChild(html)\n }\n }\n\n /**\n * Export table to various formats (csv, txt or sql)\n * @param {Object} userOptions User options\n * @return {Boolean}\n */\n export(userOptions) {\n if (!this.hasHeadings && !this.hasRows) return false\n\n const headers = this.activeHeadings\n let rows = []\n const arr = []\n let i\n let x\n let str\n let link\n\n const defaults = {\n download: true,\n skipColumn: [],\n\n // csv\n lineDelimiter: \"\\n\",\n columnDelimiter: \",\",\n\n // sql\n tableName: \"myTable\",\n\n // json\n replacer: null,\n space: 4\n }\n\n // Check for the options object\n if (!isObject(userOptions)) {\n return false\n }\n\n const options = {\n ...defaults,\n ...userOptions\n }\n\n if (options.type) {\n if (options.type === \"txt\" || options.type === \"csv\") {\n // Include headings\n rows[0] = this.header\n }\n\n // Selection or whole table\n if (options.selection) {\n // Page number\n if (!isNaN(options.selection)) {\n rows = rows.concat(this.pages[options.selection - 1])\n } else if (Array.isArray(options.selection)) {\n // Array of page numbers\n for (i = 0; i < options.selection.length; i++) {\n rows = rows.concat(this.pages[options.selection[i] - 1])\n }\n }\n } else {\n rows = rows.concat(this.activeRows)\n }\n\n // Only proceed if we have data\n if (rows.length) {\n if (options.type === \"txt\" || options.type === \"csv\") {\n str = \"\"\n\n for (i = 0; i < rows.length; i++) {\n for (x = 0; x < rows[i].cells.length; x++) {\n // Check for column skip and visibility\n if (\n !options.skipColumn.includes(headers[x].originalCellIndex) &&\n this.columns(headers[x].originalCellIndex).visible()\n ) {\n let text = rows[i].cells[x].textContent\n text = text.trim()\n text = text.replace(/\\s{2,}/g, ' ')\n text = text.replace(/\\n/g, ' ')\n text = text.replace(/\"/g, '\"\"')\n //have to manually encode \"#\" as encodeURI leaves it as is.\n text = text.replace(/#/g, \"%23\")\n if (text.includes(\",\"))\n text = `\"${text}\"`\n\n\n str += text + options.columnDelimiter\n }\n }\n // Remove trailing column delimiter\n str = str.trim().substring(0, str.length - 1)\n\n // Apply line delimiter\n str += options.lineDelimiter\n }\n\n // Remove trailing line delimiter\n str = str.trim().substring(0, str.length - 1)\n\n if (options.download) {\n str = `data:text/csv;charset=utf-8,${str}`\n }\n } else if (options.type === \"sql\") {\n // Begin INSERT statement\n str = `INSERT INTO \\`${options.tableName}\\` (`\n\n // Convert table headings to column names\n for (i = 0; i < headers.length; i++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[i].originalCellIndex) &&\n this.columns(headers[i].originalCellIndex).visible()\n ) {\n str += `\\`${headers[i].textContent}\\`,`\n }\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // Begin VALUES\n str += \") VALUES \"\n\n // Iterate rows and convert cell data to column values\n for (i = 0; i < rows.length; i++) {\n str += \"(\"\n\n for (x = 0; x < rows[i].cells.length; x++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[x].originalCellIndex) &&\n this.columns(headers[x].originalCellIndex).visible()\n ) {\n str += `\"${rows[i].cells[x].textContent}\",`\n }\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // end VALUES\n str += \"),\"\n }\n\n // Remove trailing comma\n str = str.trim().substring(0, str.length - 1)\n\n // Add trailing colon\n str += \";\"\n\n if (options.download) {\n str = `data:application/sql;charset=utf-8,${str}`\n }\n } else if (options.type === \"json\") {\n // Iterate rows\n for (x = 0; x < rows.length; x++) {\n arr[x] = arr[x] || {}\n // Iterate columns\n for (i = 0; i < headers.length; i++) {\n // Check for column skip and column visibility\n if (\n !options.skipColumn.includes(headers[i].originalCellIndex) &&\n this.columns(headers[i].originalCellIndex).visible()\n ) {\n arr[x][headers[i].textContent] = rows[x].cells[i].textContent\n }\n }\n }\n\n // Convert the array of objects to JSON string\n str = JSON.stringify(arr, options.replacer, options.space)\n\n if (options.download) {\n str = `data:application/json;charset=utf-8,${str}`\n }\n }\n\n // Download\n if (options.download) {\n // Filename\n options.filename = options.filename || \"datatable_export\"\n options.filename += `.${options.type}`\n\n str = encodeURI(str)\n\n // Create a link to trigger the download\n link = document.createElement(\"a\")\n link.href = str\n link.download = options.filename\n\n // Append the link\n document.body.appendChild(link)\n\n // Trigger the download\n link.click()\n\n // Remove the link\n document.body.removeChild(link)\n }\n\n return str\n }\n }\n\n return false\n }\n\n /**\n * Import data to the table\n * @param {Object} userOptions User options\n * @return {Boolean}\n */\n import(userOptions) {\n let obj = false\n const defaults = {\n // csv\n lineDelimiter: \"\\n\",\n columnDelimiter: \",\"\n }\n\n // Check for the options object\n if (!isObject(userOptions)) {\n return false\n }\n\n const options = {\n ...defaults,\n ...userOptions\n }\n\n if (options.data.length || isObject(options.data)) {\n // Import CSV\n if (options.type === \"csv\") {\n obj = {\n data: []\n }\n\n // Split the string into rows\n const rows = options.data.split(options.lineDelimiter)\n\n if (rows.length) {\n\n if (options.headings) {\n obj.headings = rows[0].split(options.columnDelimiter)\n\n rows.shift()\n }\n\n rows.forEach((row, i) => {\n obj.data[i] = []\n\n // Split the rows into values\n const values = row.split(options.columnDelimiter)\n\n if (values.length) {\n values.forEach(value => {\n obj.data[i].push(value)\n })\n }\n })\n }\n } else if (options.type === \"json\") {\n const json = isJson(options.data)\n\n // Valid JSON string\n if (json) {\n obj = {\n headings: [],\n data: []\n }\n\n json.forEach((data, i) => {\n obj.data[i] = []\n Object.entries(data).forEach(([column, value]) => {\n if (!obj.headings.includes(column)) {\n obj.headings.push(column)\n }\n\n obj.data[i].push(value)\n })\n })\n } else {\n // console.warn(\"That's not valid JSON!\")\n }\n }\n\n if (isObject(options.data)) {\n obj = options.data\n }\n\n if (obj) {\n // Add the rows\n this.insert(obj)\n }\n }\n\n return false\n }\n\n /**\n * Print the table\n * @return {void}\n */\n print() {\n const headings = this.activeHeadings\n const rows = this.activeRows\n const table = createElement(\"table\")\n const thead = createElement(\"thead\")\n const tbody = createElement(\"tbody\")\n\n const tr = createElement(\"tr\")\n headings.forEach(th => {\n tr.appendChild(\n createElement(\"th\", {\n html: th.textContent\n })\n )\n })\n\n thead.appendChild(tr)\n\n rows.forEach(row => {\n const tr = createElement(\"tr\")\n Array.from(row.cells).forEach(cell => {\n tr.appendChild(\n createElement(\"td\", {\n html: cell.textContent\n })\n )\n })\n tbody.appendChild(tr)\n })\n\n table.appendChild(thead)\n table.appendChild(tbody)\n\n // Open new window\n const w = window.open()\n\n // Append the table to the body\n w.document.body.appendChild(table)\n\n // Print\n w.print()\n }\n\n /**\n * Show a message in the table\n * @param {string} message\n */\n setMessage(message) {\n let colspan = 1\n\n if (this.hasRows) {\n colspan = this.data[0].cells.length\n } else if (this.activeHeadings.length) {\n colspan = this.activeHeadings.length\n }\n\n this.wrapper.classList.add(\"dataTable-empty\")\n\n if (this.label) {\n this.label.innerHTML = \"\"\n }\n this.totalPages = 0\n this.render(\"pager\")\n\n this.clear(\n createElement(\"tr\", {\n html: `<td class=\"dataTables-empty\" colspan=\"${colspan}\">${message}</td>`\n })\n )\n }\n\n /**\n * Columns API access\n * @return {Object} new Columns instance\n */\n columns(columns) {\n return new Columns(this, columns)\n }\n\n /**\n * Rows API access\n * @return {Object} new Rows instance\n */\n rows(rows) {\n return new Rows(this, rows)\n }\n\n /**\n * Add custom event listener\n * @param {String} event\n * @param {Function} callback\n * @return {Void}\n */\n on(event, callback) {\n this.events = this.events || {}\n this.events[event] = this.events[event] || []\n this.events[event].push(callback)\n }\n\n /**\n * Remove custom event listener\n * @param {String} event\n * @param {Function} callback\n * @return {Void}\n */\n off(event, callback) {\n this.events = this.events || {}\n if (event in this.events === false) return\n this.events[event].splice(this.events[event].indexOf(callback), 1)\n }\n\n /**\n * Fire custom event\n * @param {String} event\n * @return {Void}\n */\n emit(event) {\n this.events = this.events || {}\n if (event in this.events === false) return\n for (let i = 0; i < this.events[event].length; i++) {\n this.events[event][i].apply(this, Array.prototype.slice.call(arguments, 1))\n }\n }\n}\n"],"names":["isObject","val","Object","prototype","toString","call","createElement","nodeName","attrs","dom","document","attr","innerHTML","setAttribute","flush","el","NodeList","forEach","e","button","className","page","text","class","html","sortItems","a","b","c","d","length","f","value","g","h","i","Rows","constructor","dt","rows","this","build","row","tr","headings","map","td","data","appendChild","render","add","Array","isArray","push","hasRows","update","columns","rebuild","remove","select","sort","splice","dataIndex","Columns","swap","cols","x","y","order","s","cell","temp","column","getAttribute","cloneNode","originalCellIndex","sortable","hiddenColumns","includes","searchIndex","undefined","cells","activeHeadings","activeRows","hide","show","index","indexOf","visible","th","isNaN","insert","heading","hiddenHeader","type","format","hasOwnProperty","renderHeader","removeChild","filter","dir","init","terms","filterState","originalData","filters","rowFilter","filteredRows","from","content","hasAttribute","innerText","emit","hasHeadings","filterTerms","options","textContent","sorting","alpha","numeric","n","waitFor","import","then","parseDate","date","Promise","all","importedFunctions","parseFunction","top","btm","num","replace","parseFloat","Number","toLowerCase","classList","contains","lastTh","concat","indexes","v","searchData","cellIndex","dataToTable","thead","tbody","col","Error","table","tHead","tBodies","defaultConfig","searchable","paging","perPage","perPageSelect","nextPrev","firstLast","prevText","nextText","firstText","lastText","ellipsisText","ascText","descText","truncatePager","pagerDelta","scrollY","fixedColumns","fixedHeight","header","footer","labels","placeholder","noRows","info","layout","bottom","DataTable","initialized","querySelector","initialLayout","initialSortable","listeners","onResize","event","prop","assign","currentPage","onFirstPage","columnRenderers","selectedColumns","setTimeout","plugins","entries","plugin","enabled","renderPage","renderPager","template","body","head","foot","tFoot","t","insertBefore","slice","wrapper","wrap","selected","option","Option","outerHTML","form","paginatorWrapper","paginator","container","pagers","querySelectorAll","label","parentNode","replaceChild","rect","getBoundingClientRect","setColumns","fixHeight","fixColumns","bindEvents","totalPages","frag","createDocumentFragment","pages","clear","onLastPage","lastPage","setMessage","items","current","searching","string","prev","next","pager","links","ellipsis","j","k","l","children","truncate","p","firstElementChild","link","href","selector","addEventListener","parseInt","input","search","target","closest","preventDefault","window","width","ajax","renderer","hidden","destroy","removeEventListener","paginate","hd","columnWidths","style","height","headerTable","ow","offsetWidth","w","paddingTop","paddingBottom","border","parentElement","headercontainer","thd","paddingRight","clientWidth","scrollHeight","clientHeight","overflowY","r","widths","query","idx","inArray","split","reduce","bool","word","sortColumn","direction","refresh","parent","export","userOptions","headers","arr","str","download","skipColumn","lineDelimiter","columnDelimiter","tableName","replacer","space","selection","trim","substring","JSON","stringify","filename","encodeURI","click","obj","shift","values","json","parse","isJson","print","open","message","colspan","on","callback","events","off","apply","arguments"],"mappings":"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"}