UNPKG

simple-datatables

Version:

A lightweight, dependency-free JavaScript HTML table plugin.

134 lines (108 loc) 3.66 kB
import { cellToText, isObject } from "../helpers" import {DataTable} from "../datatable" import { cellDataType, cellType, dataRowType, headerCellType } from "../types" /** * Export table to SQL */ interface sqlUserOptions { download?: boolean, skipColumn?: number[], tableName?: string, selection?: number | number[], filename?: string, } export const exportSQL = function(dt: DataTable, userOptions : sqlUserOptions = {}) { if (!dt.hasHeadings && !dt.hasRows) return false const defaults = { download: true, skipColumn: [], tableName: "myTable" } // Check for the options object if (!isObject(userOptions)) { return false } const options = { ...defaults, ...userOptions } const columnShown = (index: number) => !options.skipColumn.includes(index) && !dt.columns.settings[index]?.hidden // Selection or whole table let selectedRows: dataRowType[] = [] if (options.selection) { // Page number if (Array.isArray(options.selection)) { // Array of page numbers for (let i = 0; i < options.selection.length; i++) { selectedRows = selectedRows.concat(dt.pages[options.selection[i] - 1].map(row => row.row)) } } else { selectedRows = dt.pages[options.selection - 1].map(row => row.row) } } else { selectedRows = dt.data.data } const rows: cellDataType[][] = selectedRows.map((row: dataRowType) => { const shownCells = row.cells.filter((_cell: cellType, index: number) => columnShown(index)) return shownCells.map((cell: cellType) => cellToText(cell)) }) const headers = dt.data.headings.filter((_heading: headerCellType, index: number) => columnShown(index)).map((header: headerCellType) => header.text ?? String(header.data)) // Only proceed if we have data if (rows.length) { // Begin INSERT statement let str = `INSERT INTO \`${options.tableName}\` (` // Convert table headings to column names headers.forEach((header: string) => { str += `\`${header}\`,` }) // Remove trailing comma str = str.trim().substring(0, str.length - 1) // Begin VALUES str += ") VALUES " // Iterate rows and convert cell data to column values rows.forEach((row: cellDataType[]) => { str += "(" row.forEach((cell: cellDataType) => { if (typeof cell === "string") { str += `"${cell}",` } else { str += `${cell},` } }) // Remove trailing comma str = str.trim().substring(0, str.length - 1) // end VALUES str += ")," }) // Remove trailing comma str = str.trim().substring(0, str.length - 1) // Add trailing colon str += ";" if (options.download) { str = `data:application/sql;charset=utf-8,${str}` } // Download if (options.download) { // Create a link to trigger the download const link = document.createElement("a") link.href = encodeURI(str) link.download = `${options.filename || "datatable_export"}.sql` // Append the link document.body.appendChild(link) // Trigger the download link.click() // Remove the link document.body.removeChild(link) } return str } return false }