UNPKG

flatfile-csv-importer

Version:

A simple adapter for elegantly importing CSV files via flatfile.io (Typescript, ES6, Browser)

277 lines 21 kB
import * as tslib_1 from "tslib"; import 'promise-polyfill/dist/polyfill'; import { EventEmitter } from 'eventemitter3'; import whenDomReady from 'when-dom-ready'; import insertCss from 'insert-css'; import elementClass from 'element-class'; import Penpal from 'penpal'; import FlatfileResults from './results'; var FlatfileImporter = /** @class */ (function (_super) { tslib_1.__extends(FlatfileImporter, _super); function FlatfileImporter(apiKey, options, customer) { var _this = _super.call(this) || this; _this.$fieldHooks = []; _this.apiKey = apiKey; _this.options = options; _this.customer = customer; _this.uuid = _this.$generateUuid(); _this.$ready = new FlatfileImporter.Promise(function (resolve, reject) { _this.$resolver = resolve; _this.$rejecter = reject; }); whenDomReady(function () { _this.initialize(); }); return _this; } /** * This will by default always be `https://www.flatfile.io/importer/:key` unless you are * an enterprise customer that is self-hosting the application. In which case, this * will be the URL of your enterprise installd Flatfile importer index page */ FlatfileImporter.setMountUrl = function (url) { this.MOUNT_URL = url; }; /** * This allows you to opt into or out of specific versions of the Flatfile SDK */ FlatfileImporter.setVersion = function (version) { switch (version) { case 1: this.MOUNT_URL = 'https://kiosk-lite.flatfile.io/?key=:key'; break; case 2: this.MOUNT_URL = 'https://portal-2.flatfile.io/?key=:key'; break; default: throw new Error(version + " is not a valid version"); } }; /** * Call open() to activate the importer overlay dialog. */ FlatfileImporter.prototype.open = function (options) { var _this = this; if (options === void 0) { options = {}; } options = tslib_1.__assign({}, options, { hasRecordHook: !!this.$recordHook, fieldHooks: this.$fieldHooks.map(function (v) { return v.field; }), endUser: this.customer }); this.$ready.then(function (child) { elementClass(document.body).add('flatfile-active'); var el = document.getElementById("flatfile-" + _this.uuid); if (el) { el.style.display = 'block'; } child.open(options); }); }; /** * Use load() when you want a promise returned. This is necessary if you want to use * async/await for an es6 implementation * @deprecated */ FlatfileImporter.prototype.load = function () { var _this = this; return new FlatfileImporter.Promise(function (resolve, reject) { _this.open(); var cleanup = function () { _this.removeListener('close', loadRejectHandler); _this.removeListener('complete', loadResolveHandler); }; function loadResolveHandler(rows) { resolve(rows); cleanup(); } function loadRejectHandler(err) { reject(err); cleanup(); } _this.on('close', loadRejectHandler); _this.on('complete', loadResolveHandler); }); }; /** * Use requestDataFromUser() when you want a promise returned. This is necessary if you want to use * async/await for an es6 implementation */ FlatfileImporter.prototype.requestDataFromUser = function (options) { if (options === void 0) { options = {}; } this.open(tslib_1.__assign({}, options, { inChunks: options.inChunks || null, expectsExpandedResults: true })); return this.responsePromise(); }; /** * This will display a progress indicator inside the importer if you anticipate that handling * the output of the importer may take some time. */ FlatfileImporter.prototype.displayLoader = function (msg) { this.$ready.then(function (child) { child.displayLoader(msg); }); }; /** * This will display a dialog inside of the importer with an error icon and the message you * pass. The user will be able to acknowledge the error and be returned to the import data * spreadsheet to ideally fix any issues or attempt submitting again. * @deprecated */ FlatfileImporter.prototype.displayError = function (msg) { this.$ready.then(function (child) { child.displayError(msg); }); }; /** * This will display a dialog inside of the importer with an error icon and the message you * pass. The user will be able to acknowledge the error and be returned to the import data * spreadsheet to ideally fix any issues or attempt submitting again. */ FlatfileImporter.prototype.requestCorrectionsFromUser = function (msg) { this.$ready.then(function (child) { child.displayError(msg); }); return this.responsePromise(); }; /** * This will display a dialog inside of the importer with a success icon and the message you * pass. */ FlatfileImporter.prototype.displaySuccess = function (msg) { this.$ready.then(function (child) { child.displaySuccess(msg); }); }; /** * This will fetch the data from the importer */ FlatfileImporter.prototype.getMeta = function () { var _this = this; return new Promise(function (resolve, reject) { _this.$ready.then(function (child) { child.getMeta() .then(resolve) .catch(reject); }).catch(reject); }); }; /** * Set the customer information for this import */ FlatfileImporter.prototype.setCustomer = function (customer) { this.customer = customer; }; /** * Set the customer information for this import */ FlatfileImporter.prototype.registerValidatorCallback = function (callback) { this.$validatorCallback = callback; this.$ready.then(function (child) { child.parentHasValidator(); }); }; /** * Set the customer information for this import */ FlatfileImporter.prototype.registerRecordHook = function (callback) { this.$recordHook = callback; }; /** * Set the customer information for this import */ FlatfileImporter.prototype.registerFieldHook = function (field, cb) { this.$fieldHooks.push({ field: field, cb: cb }); }; /** * Call close() from the parent window in order to hide the importer. You can do this after * handling the import callback so your users don't have to click the confirmation button */ FlatfileImporter.prototype.close = function () { this.$ready.then(function (child) { child.close(); }); }; FlatfileImporter.prototype.handleClose = function () { elementClass(document.body).remove('flatfile-active'); var el = document.getElementById("flatfile-" + this.uuid); if (el) { el.style.display = 'none'; } }; FlatfileImporter.prototype.initialize = function () { var _this = this; insertCss("\n .flatfile-component {\n position: fixed;\n top: 0;\n bottom: 0;\n right: 0;\n left: 0;\n display: none;\n z-index: 100000;\n }\n .flatfile-component iframe {\n width: 100%;\n height: 100%;\n position: absolute;\n border-width: 0;\n }\n body.flatfile-active {\n overflow: hidden;\n overscroll-behavior-x: none;\n }\n "); document.body.insertAdjacentHTML('beforeend', "<div id=\"flatfile-" + this.uuid + "\" class=\"flatfile-component\"></div>"); this.handshake = Penpal.connectToChild({ appendTo: document.getElementById("flatfile-" + this.uuid) || undefined, url: FlatfileImporter.MOUNT_URL.replace(':key', this.apiKey), methods: { results: function (data) { _this.emit('results', data.results, data.meta); }, complete: function (data) { _this.emit('complete', data.rows, data.meta); }, close: function () { _this.emit('close'); _this.handleClose(); }, validatorCallback: function (row) { return _this.$validatorCallback ? _this.$validatorCallback(row) : undefined; }, dataHookCallback: function (row, index, mode) { return _this.$recordHook ? _this.$recordHook(row, index, mode) : undefined; }, fieldHookCallback: function (values, meta) { var fieldHook = _this.$fieldHooks.find(function (v) { return v.field === meta.field; }); if (!fieldHook) { return undefined; } return fieldHook.cb(values, meta); }, ready: function () { _this.handshake.promise.then(function (child) { _this.$resolver(child); if (_this.customer) { child.setUser(_this.customer); } }).catch(function (err) { console.error(err); }); return _this.options; } } }); this.handshake.promise.catch(function (err) { _this.$rejecter(err); }); }; FlatfileImporter.prototype.$generateUuid = function () { return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); }; FlatfileImporter.prototype.responsePromise = function () { var _this = this; return new Promise(function (resolve, reject) { var loadResolveHandler = function (rows, meta) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var results; return tslib_1.__generator(this, function (_a) { results = new FlatfileResults(rows, meta, this); resolve(results); cleanup(); return [2 /*return*/]; }); }); }; function loadRejectHandler(err) { reject(err); cleanup(); } var self = _this; function cleanup() { self.removeListener('close', loadRejectHandler); self.removeListener('results', loadResolveHandler); } _this.on('close', loadRejectHandler); _this.on('results', loadResolveHandler); }); }; FlatfileImporter.Promise = Promise; FlatfileImporter.MOUNT_URL = 'https://kiosk-lite.flatfile.io/?key=:key'; return FlatfileImporter; }(EventEmitter)); export default FlatfileImporter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sZ0NBQWdDLENBQUE7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1QyxPQUFPLFlBQVksTUFBTSxnQkFBZ0IsQ0FBQTtBQUN6QyxPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUE7QUFDbEMsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFBO0FBQ3hDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUMzQixPQUFPLGVBQWUsTUFBTSxXQUFXLENBQUE7QUFPdkM7SUFBOEMsNENBQVk7SUF3QnhELDBCQUFhLE1BQWMsRUFBRSxPQUFlLEVBQUUsUUFBeUI7UUFBdkUsWUFDRSxpQkFBTyxTQWFSO1FBaEJPLGlCQUFXLEdBQW9ELEVBQUUsQ0FBQTtRQUl2RSxLQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixLQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTtRQUN0QixLQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixLQUFJLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNoQyxLQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU07WUFDekQsS0FBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUE7WUFDeEIsS0FBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUE7UUFDekIsQ0FBQyxDQUFDLENBQUE7UUFFRixZQUFZLENBQUM7WUFDWCxLQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDbkIsQ0FBQyxDQUFDLENBQUE7O0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDVyw0QkFBVyxHQUF6QixVQUEyQixHQUFXO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcs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