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