flatfile-csv-importer
Version:
A simple adapter for elegantly importing CSV files via flatfile.io (Typescript, ES6, Browser)
277 lines • 21 kB
JavaScript
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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