UNPKG

flatfile-csv-importer

Version:

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

279 lines 21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); require("promise-polyfill/dist/polyfill"); var eventemitter3_1 = require("eventemitter3"); var when_dom_ready_1 = require("when-dom-ready"); var insert_css_1 = require("insert-css"); var element_class_1 = require("element-class"); var penpal_1 = require("penpal"); var results_1 = require("./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; }); when_dom_ready_1.default(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) { element_class_1.default(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 () { element_class_1.default(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; insert_css_1.default("\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_1.default.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 results_1.default(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; }(eventemitter3_1.EventEmitter)); exports.default = FlatfileImporter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMENBQXVDO0FBRXZDLCtDQUE0QztBQUM1QyxpREFBeUM7QUFDekMseUNBQWtDO0FBQ2xDLCtDQUF3QztBQUN4QyxpQ0FBMkI7QUFDM0IscUNBQXVDO0FBT3ZDO0lBQThDLDRDQUFZO0lBd0J4RCwwQkFBYSxNQUFjLEVBQUUsT0FBZSxFQUFFLFFBQXlCO1FBQXZFLFlBQ0UsaUJBQU8sU0FhUjtRQWhCTyxpQkFBVyxHQUFvRCxFQUFFLENBQUE7UUFJdkUsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsS0FBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFDdEIsS0FBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDeEIsS0FBSSxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDaEMsS0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ3pELEtBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFBO1lBQ3hCLEtBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO1FBRUYsd0JBQVksQ0FBQztZQUNYLEtBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNuQixDQUFDLENBQUMsQ0FBQTs7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNXLDRCQUFXLEdBQXpCLFVBQTJCLEdBQVc7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUE7SUFDdEIsQ0FBQztJQUVEOztPQUVHO0lBQ1csMkJBQVUsR0FBeEIsVUFBMEIsT0FBYztRQUN0QyxRQUFRLE9BQU8sRUFBRTtZQUNmLEtBQUssQ0FBQztnQkFDSixJQUFJLENBQUMsU0FBUyxHQUFHLDBDQUEw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