handsontable
Version:
Handsontable is a JavaScript Data Grid available for React, Angular and Vue.
270 lines (261 loc) • 9.21 kB
JavaScript
;
exports.__esModule = true;
require("core-js/modules/es.error.cause.js");
var _base = require("../base");
var _dataProvider = _interopRequireDefault(require("./dataProvider"));
var _typeFactory = _interopRequireWildcard(require("./typeFactory"));
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const PLUGIN_KEY = exports.PLUGIN_KEY = 'exportFile';
const PLUGIN_PRIORITY = exports.PLUGIN_PRIORITY = 240;
/**
* @plugin ExportFile
* @class ExportFile
*
* @description
* The `ExportFile` plugin lets you export table data as a string, blob, or downloadable CSV file.
*
* See [the export file demo](@/guides/accessories-and-menus/export-to-csv/export-to-csv.md) for examples.
*
* @example
* ::: only-for javascript
* ```js
* const container = document.getElementById('example');
* const hot = new Handsontable(container, {
* data: getData()
* });
*
* // access to exportFile plugin instance
* const exportPlugin = hot.getPlugin('exportFile');
*
* // export as a string
* exportPlugin.exportAsString('csv');
*
* // export as a blob object
* exportPlugin.exportAsBlob('csv');
*
* // export to downloadable file (named: MyFile.csv)
* exportPlugin.downloadFile('csv', {filename: 'MyFile'});
*
* // export as a string (with specified data range):
* exportPlugin.exportAsString('csv', {
* exportHiddenRows: true, // default false
* exportHiddenColumns: true, // default false
* columnHeaders: true, // default false
* rowHeaders: true, // default false
* columnDelimiter: ';', // default ','
* range: [1, 1, 6, 6] // [startRow, endRow, startColumn, endColumn]
* });
* ```
* :::
*
* ::: only-for react
* ```jsx
* const hotRef = useRef(null);
*
* ...
*
* <HotTable
* ref={hotRef}
* data={getData()}
* />
*
* const hot = hotRef.current.hotInstance;
* // access to exportFile plugin instance
* const exportPlugin = hot.getPlugin('exportFile');
*
* // export as a string
* exportPlugin.exportAsString('csv');
*
* // export as a blob object
* exportPlugin.exportAsBlob('csv');
*
* // export to downloadable file (named: MyFile.csv)
* exportPlugin.downloadFile('csv', {filename: 'MyFile'});
*
* // export as a string (with specified data range):
* exportPlugin.exportAsString('csv', {
* exportHiddenRows: true, // default false
* exportHiddenColumns: true, // default false
* columnHeaders: true, // default false
* rowHeaders: true, // default false
* columnDelimiter: ';', // default ','
* range: [1, 1, 6, 6] // [startRow, endRow, startColumn, endColumn]
* });
* ```
* :::
*
* ::: only-for angular
* ```ts
* import { AfterViewInit, Component, ViewChild } from "@angular/core";
* import {
* GridSettings,
* HotTableModule,
* HotTableComponent,
* } from "@handsontable/angular-wrapper";
*
* `@Component`({
* selector: "app-example",
* standalone: true,
* imports: [HotTableModule],
* template: ` <div>
* <hot-table themeName="ht-theme-main" [settings]="gridSettings" />
* </div>`,
* })
* export class ExampleComponent implements AfterViewInit {
* `@ViewChild`(HotTableComponent, { static: false })
* readonly hotTable!: HotTableComponent;
*
* readonly gridSettings = <GridSettings>{
* data: this.getData(),
* };
*
* ngAfterViewInit(): void {
* // Access to plugin instance:
* const hot = this.hotTable.hotInstance;
* // Access to exportFile plugin instance
* const exportPlugin = hot.getPlugin("exportFile");
*
* // Export as a string
* exportPlugin.exportAsString("csv");
*
* // Export as a blob object
* exportPlugin.exportAsBlob("csv");
*
* // Export to downloadable file (named: MyFile.csv)
* exportPlugin.downloadFile("csv", { filename: "MyFile" });
*
* // Export as a string (with specified data range):
* exportPlugin.exportAsString("csv", {
* exportHiddenRows: true, // default false
* exportHiddenColumns: true, // default false
* columnHeaders: true, // default false
* rowHeaders: true, // default false
* columnDelimiter: ";", // default ','
* range: [1, 1, 6, 6], // [startRow, endRow, startColumn, endColumn]
* });
* }
*
* private getData(): any[] {
* // get some data
* }
* }
* ```
* :::
*/
class ExportFile extends _base.BasePlugin {
static get PLUGIN_KEY() {
return PLUGIN_KEY;
}
static get PLUGIN_PRIORITY() {
return PLUGIN_PRIORITY;
}
/**
* Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
* hook and if it returns `true` then the {@link ExportFile#enablePlugin} method is called.
*
* @returns {boolean}
*/
isEnabled() {
return true;
}
/**
* @typedef ExportOptions
* @memberof ExportFile
* @type {object}
* @property {boolean} [exportHiddenRows=false] Include hidden rows in the exported file.
* @property {boolean} [exportHiddenColumns=false] Include hidden columns in the exported file.
* @property {boolean} [columnHeaders=false] Include column headers in the exported file.
* @property {boolean} [rowHeaders=false] Include row headers in the exported file.
* @property {string} [columnDelimiter=','] Column delimiter.
* @property {string} [range=[]] Cell range that will be exported to file.
* @property {boolean|RegExp|Function} [sanitizeValues=false] Controls the sanitization of cell value.
*/
/**
* Exports table data as a string.
*
* @param {string} format Export format type eq. `'csv'`.
* @param {ExportOptions} options Export options.
* @returns {string}
*/
exportAsString(format) {
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return this._createTypeFormatter(format, options).export();
}
/**
* Exports table data as a blob object.
*
* @param {string} format Export format type eq. `'csv'`.
* @param {ExportOptions} options Export options.
* @returns {Blob}
*/
exportAsBlob(format) {
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return this._createBlob(this._createTypeFormatter(format, options));
}
/**
* Exports table data as a downloadable file.
*
* @param {string} format Export format type eg. `'csv'`.
* @param {ExportOptions} options Export options.
*/
downloadFile(format) {
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
const {
rootDocument,
rootWindow
} = this.hot;
const formatter = this._createTypeFormatter(format, options);
const blob = this._createBlob(formatter);
const URL = rootWindow.URL || rootWindow.webkitURL;
const a = rootDocument.createElement('a');
const name = `${formatter.options.filename}.${formatter.options.fileExtension}`;
if (a.download !== undefined) {
const url = URL.createObjectURL(blob);
a.style.display = 'none';
a.setAttribute('href', url);
a.setAttribute('download', name);
rootDocument.body.appendChild(a);
a.dispatchEvent(new MouseEvent('click'));
rootDocument.body.removeChild(a);
setTimeout(() => {
URL.revokeObjectURL(url);
}, 100);
} else if (navigator.msSaveOrOpenBlob) {
// IE10+
navigator.msSaveOrOpenBlob(blob, name);
}
}
/**
* Creates and returns class formatter for specified export type.
*
* @private
* @param {string} format Export format type eq. `'csv'`.
* @param {ExportOptions} options Export options.
* @returns {BaseType}
*/
_createTypeFormatter(format) {
let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (!_typeFactory.EXPORT_TYPES[format]) {
throw new Error(`Export format type "${format}" is not supported.`);
}
return (0, _typeFactory.default)(format, new _dataProvider.default(this.hot), options);
}
/**
* Creates blob object based on provided type formatter class.
*
* @private
* @param {BaseType} typeFormatter The instance of the specyfic formatter/exporter.
* @returns {Blob}
*/
_createBlob(typeFormatter) {
let formatter = null;
if (typeof Blob !== 'undefined') {
formatter = new Blob([typeFormatter.export()], {
type: `${typeFormatter.options.mimeType};charset=${typeFormatter.options.encoding}`
});
}
return formatter;
}
}
exports.ExportFile = ExportFile;