Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke "Jared" Bennett <lbennett@gitlab.com>2017-02-19 21:44:17 +0300
committerLuke "Jared" Bennett <lbennett@gitlab.com>2017-03-15 16:19:18 +0300
commit1f7c665733a7f3ac784537adad6875a171b61446 (patch)
tree2a7d08213ab4c4c48ce4606294063f78393d4dc3 /app/assets/javascripts/droplab/plugins
parent9226ce9e3090dcedcb5c9fa8595d75b5eb295726 (diff)
Updated droplab version to webpack version
Diffstat (limited to 'app/assets/javascripts/droplab/plugins')
-rw-r--r--app/assets/javascripts/droplab/plugins/ajax.js159
-rw-r--r--app/assets/javascripts/droplab/plugins/ajax_filter.js216
-rw-r--r--app/assets/javascripts/droplab/plugins/filter.js172
-rw-r--r--app/assets/javascripts/droplab/plugins/input_setter.js129
4 files changed, 676 insertions, 0 deletions
diff --git a/app/assets/javascripts/droplab/plugins/ajax.js b/app/assets/javascripts/droplab/plugins/ajax.js
new file mode 100644
index 00000000000..e68983416ec
--- /dev/null
+++ b/app/assets/javascripts/droplab/plugins/ajax.js
@@ -0,0 +1,159 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+/******/
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // identity function for calling harmony imports with the correct context
+/******/ __webpack_require__.i = function(value) { return value; };
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 10);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 10:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+function droplabAjaxException(message) {
+ this.message = message;
+}
+
+var droplabAjax = {
+ _loadUrlData: function _loadUrlData(url) {
+ var self = this;
+ return new Promise(function (resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url, true);
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === XMLHttpRequest.DONE) {
+ if (xhr.status === 200) {
+ var data = JSON.parse(xhr.responseText);
+ self.cache[url] = data;
+ return resolve(data);
+ } else {
+ return reject([xhr.responseText, xhr.status]);
+ }
+ }
+ };
+ xhr.send();
+ });
+ },
+ _loadData: function _loadData(data, config, self) {
+ if (config.loadingTemplate) {
+ var dataLoadingTemplate = self.hook.list.list.querySelector('[data-loading-template]');
+ if (dataLoadingTemplate) dataLoadingTemplate.outerHTML = self.listTemplate;
+ }
+
+ if (!self.destroyed) self.hook.list[config.method].call(self.hook.list, data);
+ },
+ init: function init(hook) {
+ var self = this;
+ self.destroyed = false;
+ self.cache = self.cache || {};
+ var config = hook.config.droplabAjax;
+ this.hook = hook;
+ if (!config || !config.endpoint || !config.method) {
+ return;
+ }
+ if (config.method !== 'setData' && config.method !== 'addData') {
+ return;
+ }
+ if (config.loadingTemplate) {
+ var dynamicList = hook.list.list.querySelector('[data-dynamic]');
+ var loadingTemplate = document.createElement('div');
+ loadingTemplate.innerHTML = config.loadingTemplate;
+ loadingTemplate.setAttribute('data-loading-template', '');
+ this.listTemplate = dynamicList.outerHTML;
+ dynamicList.outerHTML = loadingTemplate.outerHTML;
+ }
+ if (self.cache[config.endpoint]) {
+ self._loadData(self.cache[config.endpoint], config, self);
+ } else {
+ this._loadUrlData(config.endpoint).then(function (d) {
+ self._loadData(d, config, self);
+ }).catch(function (e) {
+ throw new droplabAjaxException(e.message || e);
+ });
+ }
+ },
+ destroy: function destroy() {
+ this.destroyed = true;
+
+ var dynamicList = this.hook.list.list.querySelector('[data-dynamic]');
+ if (this.listTemplate && dynamicList) {
+ dynamicList.outerHTML = this.listTemplate;
+ }
+ }
+};
+
+window.droplabAjax = droplabAjax;
+
+exports.default = droplabAjax;
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZjM3NjcyYjdmNTI4YjQ3MmE0NGM/ZWM1ZioqKiIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9hamF4LmpzIl0sIm5hbWVzIjpbImRyb3BsYWJBamF4RXhjZXB0aW9uIiwibWVzc2FnZSIsImRyb3BsYWJBamF4IiwiX2xvYWRVcmxEYXRhIiwidXJsIiwic2VsZiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvcGVuIiwib25yZWFkeXN0YXRlY2hhbmdlIiwicmVhZHlTdGF0ZSIsIkRPTkUiLCJzdGF0dXMiLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiY2FjaGUiLCJzZW5kIiwiX2xvYWREYXRhIiwiY29uZmlnIiwibG9hZGluZ1RlbXBsYXRlIiwiZGF0YUxvYWRpbmdUZW1wbGF0ZSIsImhvb2siLCJsaXN0IiwicXVlcnlTZWxlY3RvciIsIm91dGVySFRNTCIsImxpc3RUZW1wbGF0ZSIsImRlc3Ryb3llZCIsIm1ldGhvZCIsImNhbGwiLCJpbml0IiwiZW5kcG9pbnQiLCJkeW5hbWljTGlzdCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsInNldEF0dHJpYnV0ZSIsInRoZW4iLCJkIiwiY2F0Y2giLCJlIiwiZGVzdHJveSIsIndpbmRvdyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFB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QUFvQk0sWUFBWVAsU0FBaEM7QUFDQU8sa0JBQVlQLFNBQVosR0FBd0JMLGdCQUFnQkssU0FBeEM7QUFDRDtBQUNELFFBQUl4QixLQUFLZSxLQUFMLENBQVdHLE9BQU9ZLFFBQWxCLENBQUosRUFBaUM7QUFDL0I5QixXQUFLaUIsU0FBTCxDQUFlakIsS0FBS2UsS0FBTCxDQUFXRyxPQUFPWSxRQUFsQixDQUFmLEVBQTRDWixNQUE1QyxFQUFvRGxCLElBQXBEO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsV0FBS0YsWUFBTCxDQUFrQm9CLE9BQU9ZLFFBQXpCLEVBQ0dNLElBREgsQ0FDUSxVQUFTQyxDQUFULEVBQVk7QUFDaEJyQyxhQUFLaUIsU0FBTCxDQUFlb0IsQ0FBZixFQUFrQm5CLE1BQWxCLEVBQTBCbEIsSUFBMUI7QUFDRCxPQUhILEVBR0tzQyxLQUhMLENBR1csVUFBU0MsQ0FBVCxFQUFZO0FBQ25CLGNBQU0sSUFBSTVDLG9CQUFKLENBQXlCNEMsRUFBRTNDLE9BQUYsSUFBYTJDLENBQXRDLENBQU47QUFDRCxPQUxIO0FBTUQ7QUFDRixHQTFEaUI7QUEyRGxCQyxXQUFTLG1CQUFXO0FBQ2xCLFNBQUtkLFNBQUwsR0FBaUIsSUFBakI7O0FBRUEsUUFBSUssY0FBYyxLQUFLVixJQUFMLENBQVVDLElBQVYsQ0FBZUEsSUFBZixDQUFvQkMsYUFBcEIsQ0FBa0MsZ0JBQWxDLENBQWxCO0FBQ0EsUUFBSSxLQUFLRSxZQUFMLElBQXFCTSxXQUF6QixFQUFzQztBQUNwQ0Esa0JBQVlQLFNBQVosR0FBd0IsS0FBS0MsWUFBN0I7QUFDRDtBQUNGO0FBbEVpQixDQUFwQjs7QUFxRUFnQixPQUFPNUMsV0FBUCxHQUFxQkEsV0FBckI7O2tCQUVlQSxXIiwiZmlsZSI6Ii4vZGlzdC9wbHVnaW5zL2FqYXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgZjM3NjcyYjdmNTI4YjQ3MmE0NGMiLCJmdW5jdGlvbiBkcm9wbGFiQWpheEV4Y2VwdGlvbihtZXNzYWdlKSB7XG4gIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG59XG5cbmNvbnN0IGRyb3BsYWJBamF4ID0ge1xuICBfbG9hZFVybERhdGE6IGZ1bmN0aW9uIF9sb2FkVXJsRGF0YSh1cmwpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoeGhyLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBzZWxmLmNhY2hlW3VybF0gPSBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoW3hoci5yZXNwb25zZVRleHQsIHhoci5zdGF0dXNdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xuICB9LFxuICBfbG9hZERhdGE6IGZ1bmN0aW9uIF9sb2FkRGF0YShkYXRhLCBjb25maWcsIHNlbGYpIHtcbiAgICBpZiAoY29uZmlnLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgdmFyIGRhdGFMb2FkaW5nVGVtcGxhdGUgPSBzZWxmLmhvb2subGlzdC5saXN0LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWxvYWRpbmctdGVtcGxhdGVdJyk7XG4gICAgICBpZiAoZGF0YUxvYWRpbmdUZW1wbGF0ZSkgZGF0YUxvYWRpbmdUZW1wbGF0ZS5vdXRlckhUTUwgPSBzZWxmLmxpc3RUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoIXNlbGYuZGVzdHJveWVkKSBzZWxmLmhvb2subGlzdFtjb25maWcubWV0aG9kXS5jYWxsKHNlbGYuaG9vay5saXN0LCBkYXRhKTtcbiAgfSxcbiAgaW5pdDogZnVuY3Rpb24gaW5pdChob29rKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgc2VsZi5jYWNoZSA9IHNlbGYuY2FjaGUgfHwge307XG4gICAgdmFyIGNvbmZpZyA9IGhvb2suY29uZmlnLmRyb3BsYWJBamF4O1xuICAgIHRoaXMuaG9vayA9IGhvb2s7XG4gICAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy5lbmRwb2ludCB8fCAhY29uZmlnLm1ldGhvZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLm1ldGhvZCAhPT0gJ3NldERhdGEnICYmIGNvbmZpZy5tZXRob2QgIT09ICdhZGREYXRhJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgdmFyIGR5bmFtaWNMaXN0ID0gaG9vay5saXN0Lmxpc3QucXVlcnlTZWxlY3RvcignW2RhdGEtZHluYW1pY10nKTtcbiAgICAgIHZhciBsb2FkaW5nVGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGxvYWRpbmdUZW1wbGF0ZS5pbm5lckhUTUwgPSBjb25maWcubG9hZGluZ1RlbXBsYXRlO1xuICAgICAgbG9hZGluZ1RlbXBsYXRlLnNldEF0dHJpYnV0ZSgnZGF0YS1sb2FkaW5nLXRlbXBsYXRlJywgJycpO1xuICAgICAgdGhpcy5saXN0VGVtcGxhdGUgPSBkeW5hbWljTGlzdC5vdXRlckhUTUw7XG4gICAgICBkeW5hbWljTGlzdC5vdXRlckhUTUwgPSBsb2FkaW5nVGVtcGxhdGUub3V0ZXJIVE1MO1xuICAgIH1cbiAgICBpZiAoc2VsZi5jYWNoZVtjb25maWcuZW5kcG9pbnRdKSB7XG4gICAgICBzZWxmLl9sb2FkRGF0YShzZWxmLmNhY2hlW2NvbmZpZy5lbmRwb2ludF0sIGNvbmZpZywgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvYWRVcmxEYXRhKGNvbmZpZy5lbmRwb2ludClcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oZCkge1xuICAgICAgICAgIHNlbGYuX2xvYWREYXRhKGQsIGNvbmZpZywgc2VsZik7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgZHJvcGxhYkFqYXhFeGNlcHRpb24oZS5tZXNzYWdlIHx8IGUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcblxuICAgIHZhciBkeW5hbWljTGlzdCA9IHRoaXMuaG9vay5saXN0Lmxpc3QucXVlcnlTZWxlY3RvcignW2RhdGEtZHluYW1pY10nKTtcbiAgICBpZiAodGhpcy5saXN0VGVtcGxhdGUgJiYgZHluYW1pY0xpc3QpIHtcbiAgICAgIGR5bmFtaWNMaXN0Lm91dGVySFRNTCA9IHRoaXMubGlzdFRlbXBsYXRlO1xuICAgIH1cbiAgfVxufTtcblxud2luZG93LmRyb3BsYWJBamF4ID0gZHJvcGxhYkFqYXg7XG5cbmV4cG9ydCBkZWZhdWx0IGRyb3BsYWJBamF4O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BsdWdpbnMvYWpheC5qcyJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file
diff --git a/app/assets/javascripts/droplab/plugins/ajax_filter.js b/app/assets/javascripts/droplab/plugins/ajax_filter.js
new file mode 100644
index 00000000000..b5892694e60
--- /dev/null
+++ b/app/assets/javascripts/droplab/plugins/ajax_filter.js
@@ -0,0 +1,216 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+/******/
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // identity function for calling harmony imports with the correct context
+/******/ __webpack_require__.i = function(value) { return value; };
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 11);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 11:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var droplabAjaxFilter = {
+ init: function init(hook) {
+ this.destroyed = false;
+ this.hook = hook;
+ this.notLoading();
+
+ this.eventWrapper = {};
+ this.eventWrapper.debounceTrigger = this.debounceTrigger.bind(this);
+ this.hook.trigger.addEventListener('keydown.dl', this.eventWrapper.debounceTrigger);
+ this.hook.trigger.addEventListener('focus', this.eventWrapper.debounceTrigger);
+
+ this.trigger(true);
+ },
+
+ notLoading: function notLoading() {
+ this.loading = false;
+ },
+
+ debounceTrigger: function debounceTrigger(e) {
+ var NON_CHARACTER_KEYS = [16, 17, 18, 20, 37, 38, 39, 40, 91, 93];
+ var invalidKeyPressed = NON_CHARACTER_KEYS.indexOf(e.detail.which || e.detail.keyCode) > -1;
+ var focusEvent = e.type === 'focus';
+ if (invalidKeyPressed || this.loading) {
+ return;
+ }
+ if (this.timeout) {
+ clearTimeout(this.timeout);
+ }
+ this.timeout = setTimeout(this.trigger.bind(this, focusEvent), 200);
+ },
+
+ trigger: function trigger(getEntireList) {
+ var config = this.hook.config.droplabAjaxFilter;
+ var searchValue = this.trigger.value;
+ if (!config || !config.endpoint || !config.searchKey) {
+ return;
+ }
+ if (config.searchValueFunction) {
+ searchValue = config.searchValueFunction();
+ }
+ if (config.loadingTemplate && this.hook.list.data === undefined || this.hook.list.data.length === 0) {
+ var dynamicList = this.hook.list.list.querySelector('[data-dynamic]');
+ var loadingTemplate = document.createElement('div');
+ loadingTemplate.innerHTML = config.loadingTemplate;
+ loadingTemplate.setAttribute('data-loading-template', true);
+ this.listTemplate = dynamicList.outerHTML;
+ dynamicList.outerHTML = loadingTemplate.outerHTML;
+ }
+ if (getEntireList) {
+ searchValue = '';
+ }
+ if (config.searchKey === searchValue) {
+ return this.list.show();
+ }
+ this.loading = true;
+ var params = config.params || {};
+ params[config.searchKey] = searchValue;
+ var self = this;
+ self.cache = self.cache || {};
+ var url = config.endpoint + this.buildParams(params);
+ var urlCachedData = self.cache[url];
+ if (urlCachedData) {
+ self._loadData(urlCachedData, config, self);
+ } else {
+ this._loadUrlData(url).then(function (data) {
+ self._loadData(data, config, self);
+ });
+ }
+ },
+
+ _loadUrlData: function _loadUrlData(url) {
+ var self = this;
+ return new Promise(function (resolve, reject) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url, true);
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === XMLHttpRequest.DONE) {
+ if (xhr.status === 200) {
+ var data = JSON.parse(xhr.responseText);
+ self.cache[url] = data;
+ return resolve(data);
+ } else {
+ return reject([xhr.responseText, xhr.status]);
+ }
+ }
+ };
+ xhr.send();
+ });
+ },
+
+ _loadData: function _loadData(data, config, self) {
+ var list = self.hook.list;
+ if (config.loadingTemplate && list.data === undefined || list.data.length === 0) {
+ var dataLoadingTemplate = list.list.querySelector('[data-loading-template]');
+ if (dataLoadingTemplate) {
+ dataLoadingTemplate.outerHTML = self.listTemplate;
+ }
+ }
+ if (!self.destroyed) {
+ var hookListChildren = list.list.children;
+ var onlyDynamicList = hookListChildren.length === 1 && hookListChildren[0].hasAttribute('data-dynamic');
+ if (onlyDynamicList && data.length === 0) {
+ list.hide();
+ }
+ list.setData.call(list, data);
+ }
+ self.notLoading();
+ list.currentIndex = 0;
+ },
+
+ buildParams: function buildParams(params) {
+ if (!params) return '';
+ var paramsArray = Object.keys(params).map(function (param) {
+ return param + '=' + (params[param] || '');
+ });
+ return '?' + paramsArray.join('&');
+ },
+
+ destroy: function destroy() {
+ if (this.timeout) {
+ clearTimeout(this.timeout);
+ }
+
+ this.destroyed = true;
+ this.hook.trigger.removeEventListener('keydown.dl', this.eventWrapper.debounceTrigger);
+ this.hook.trigger.removeEventListener('focus', this.eventWrapper.debounceTrigger);
+ }
+};
+
+window.droplabAjaxFilter = droplabAjaxFilter;
+
+exports.default = droplabAjaxFilter;
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZjM3NjcyYjdmNTI4YjQ3MmE0NGM/ZWM1ZioqIiwid2VicGFjazovLy8uL3NyYy9wbHVnaW5zL2FqYXhfZmlsdGVyLmpzIl0sIm5hbWVzIjpbImRyb3BsYWJBamF4RmlsdGVyIiwiaW5pdCIsImhvb2siLCJkZXN0cm95ZWQiLCJub3RMb2FkaW5nIiwiZXZlbnRXcmFwcGVyIiwiZGVib3VuY2VUcmlnZ2VyIiwiYmluZCIsInRyaWdnZXIiLCJhZGRFdmVudExpc3RlbmVyIiwibG9hZGluZyIsImUiLCJOT05fQ0hBUkFDVEVSX0tFWVMiLCJpbnZhbGlkS2V5UHJlc3NlZCIsImluZGV4T2YiLCJkZXRhaWwiLCJ3aGljaCIsImtleUNvZGUiLCJmb2N1c0V2ZW50IiwidHlwZSIsInRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiZ2V0RW50aXJlTGlzdCIsImNvbmZpZyIsInNlYXJjaFZhbHVlIiwidmFsdWUiLCJlbmRwb2ludCIsInNlYXJjaEtleSIsInNlYXJjaFZhbHVlRnVuY3Rpb24iLCJsb2FkaW5nVGVtcGxhdGUiLCJsaXN0IiwiZGF0YSIsInVuZGVmaW5lZCIsImxlbmd0aCIsImR5bmFtaWNMaXN0IiwicXVlcnlTZWxlY3RvciIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsImlubmVySFRNTCIsInNldEF0dHJpYnV0ZSIsImxpc3RUZW1wbGF0ZSIsIm91dGVySFRNTCIsInNob3ciLCJwYXJhbXMiLCJzZWxmIiwiY2FjaGUiLCJ1cmwiLCJidWlsZFBhcmFtcyIsInVybENhY2hlZERhdGEiLCJfbG9hZERhdGEiLCJfbG9hZFVybERhdGEiLCJ0aGVuIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJyZWFkeVN0YXRlIiwiRE9ORSIsInN0YXR1cyIsIkpTT04iLCJwYXJzZSIsInJlc3BvbnNlVGV4dCIsInNlbmQiLCJkYXRhTG9hZGluZ1RlbXBsYXRlIiwiaG9va0xpc3RDaGlsZHJlbiIsImNoaWxkcmVuIiwib25seUR5bmFtaWNMaXN0IiwiaGFzQXR0cmlidXRlIiwiaGlkZSIsInNldERhdGEiLCJjYWxsIiwiY3VycmVudEluZGV4IiwicGFyYW1zQXJyYXkiLCJPYmplY3QiLCJrZXlzIiwibWFwIiwicGFyYW0iLCJqb2luIiwiZGVzdHJveSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ3aW5kb3ciXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtREFBMkMsY0FBYzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ2hFQSxJQUFNQSxvQkFBb0I7QUFDeEJDLFFBQU0sY0FBU0MsSUFBVCxFQUFlO0FBQ25CLFNBQUtDLFNBQUwsR0FBaUIsS0FBakI7QUFDQSxTQUFLRCxJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLRSxVQUFMOztBQUVBLFNBQUtDLFlBQUwsR0FBb0IsRUFBcEI7QUFDQSxTQUFLQSxZQUFMLENBQWtCQyxlQUFsQixHQUFvQyxLQUFLQSxlQUFMLENBQXFCQyxJQUFyQixDQUEwQixJQUExQixDQUFwQztBQUNBLFNBQUtMLElBQUwsQ0FBVU0sT0FBVixDQUFrQkMsZ0JBQWxCLENBQW1DLFlBQW5DLEVBQWlELEtBQUtKLFlBQUwsQ0FBa0JDLGVBQW5FO0FB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QU9BLFFBQVEsR0FBUixJQUFlcEMsT0FBT29DLEtBQVAsS0FBaUIsRUFBaEMsQ0FBUDtBQUNELEtBRmlCLENBQWxCO0FBR0EsV0FBTyxNQUFNSixZQUFZSyxJQUFaLENBQWlCLEdBQWpCLENBQWI7QUFDRCxHQXZIdUI7O0FBeUh4QkMsV0FBUyxTQUFTQSxPQUFULEdBQW1CO0FBQzFCLFFBQUksS0FBSzlELE9BQVQsRUFBa0I7QUFDaEJDLG1CQUFhLEtBQUtELE9BQWxCO0FBQ0Q7O0FBRUQsU0FBS2pCLFNBQUwsR0FBaUIsSUFBakI7QUFDQSxTQUFLRCxJQUFMLENBQVVNLE9BQVYsQ0FBa0IyRSxtQkFBbEIsQ0FBc0MsWUFBdEMsRUFBb0QsS0FBSzlFLFlBQUwsQ0FBa0JDLGVBQXRFO0FBQ0EsU0FBS0osSUFBTCxDQUFVTSxPQUFWLENBQWtCMkUsbUJBQWxCLENBQXNDLE9BQXRDLEVBQStDLEtBQUs5RSxZQUFMLENBQWtCQyxlQUFqRTtBQUNEO0FBakl1QixDQUExQjs7QUFvSUE4RSxPQUFPcEYsaUJBQVAsR0FBMkJBLGlCQUEzQjs7a0JBRWVBLGlCIiwiZmlsZSI6Ii4vZGlzdC9wbHVnaW5zL2FqYXhfZmlsdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTEpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGYzNzY3MmI3ZjUyOGI0NzJhNDRjIiwiY29uc3QgZHJvcGxhYkFqYXhGaWx0ZXIgPSB7XG4gIGluaXQ6IGZ1bmN0aW9uKGhvb2spIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHRoaXMuaG9vayA9IGhvb2s7XG4gICAgdGhpcy5ub3RMb2FkaW5nKCk7XG5cbiAgICB0aGlzLmV2ZW50V3JhcHBlciA9IHt9O1xuICAgIHRoaXMuZXZlbnRXcmFwcGVyLmRlYm91bmNlVHJpZ2dlciA9IHRoaXMuZGVib3VuY2VUcmlnZ2VyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5ob29rLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bi5kbCcsIHRoaXMuZXZlbnRXcmFwcGVyLmRlYm91bmNlVHJpZ2dlcik7XG4gICAgdGhpcy5ob29rLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLmV2ZW50V3JhcHBlci5kZWJvdW5jZVRyaWdnZXIpO1xuXG4gICAgdGhpcy50cmlnZ2VyKHRydWUpO1xuICB9LFxuXG4gIG5vdExvYWRpbmc6IGZ1bmN0aW9uIG5vdExvYWRpbmcoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gIH0sXG5cbiAgZGVib3VuY2VUcmlnZ2VyOiBmdW5jdGlvbiBkZWJvdW5jZVRyaWdnZXIoZSkge1xuICAgIHZhciBOT05fQ0hBUkFDVEVSX0tFWVMgPSBbMTYsIDE3LCAxOCwgMjAsIDM3LCAzOCwgMzksIDQwLCA5MSwgOTNdO1xuICAgIHZhciBpbnZhbGlkS2V5UHJlc3NlZCA9IE5PTl9DSEFSQUNURVJfS0VZUy5pbmRleE9mKGUuZGV0YWlsLndoaWNoIHx8IGUuZGV0YWlsLmtleUNvZGUpID4gLTE7XG4gICAgdmFyIGZvY3VzRXZlbnQgPSBlLnR5cGUgPT09ICdmb2N1cyc7XG4gICAgaWYgKGludmFsaWRLZXlQcmVzc2VkIHx8IHRoaXMubG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICB9XG4gICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLnRyaWdnZXIuYmluZCh0aGlzLCBmb2N1c0V2ZW50KSwgMjAwKTtcbiAgfSxcblxuICB0cmlnZ2VyOiBmdW5jdGlvbiB0cmlnZ2VyKGdldEVudGlyZUxpc3QpIHtcbiAgICB2YXIgY29uZmlnID0gdGhpcy5ob29rLmNvbmZpZy5kcm9wbGFiQWpheEZpbHRlcjtcbiAgICB2YXIgc2VhcmNoVmFsdWUgPSB0aGlzLnRyaWdnZXIudmFsdWU7XG4gICAgaWYgKCFjb25maWcgfHwgIWNvbmZpZy5lbmRwb2ludCB8fCAhY29uZmlnLnNlYXJjaEtleSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnNlYXJjaFZhbHVlRnVuY3Rpb24pIHtcbiAgICAgIHNlYXJjaFZhbHVlID0gY29uZmlnLnNlYXJjaFZhbHVlRnVuY3Rpb24oKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5sb2FkaW5nVGVtcGxhdGUgJiYgdGhpcy5ob29rLmxpc3QuZGF0YSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLmhvb2subGlzdC5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFyIGR5bmFtaWNMaXN0ID0gdGhpcy5ob29rLmxpc3QubGlzdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1keW5hbWljXScpO1xuICAgICAgdmFyIGxvYWRpbmdUZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbG9hZGluZ1RlbXBsYXRlLmlubmVySFRNTCA9IGNvbmZpZy5sb2FkaW5nVGVtcGxhdGU7XG4gICAgICBsb2FkaW5nVGVtcGxhdGUuc2V0QXR0cmlidXRlKCdkYXRhLWxvYWRpbmctdGVtcGxhdGUnLCB0cnVlKTtcbiAgICAgIHRoaXMubGlzdFRlbXBsYXRlID0gZHluYW1pY0xpc3Qub3V0ZXJIVE1MO1xuICAgICAgZHluYW1pY0xpc3Qub3V0ZXJIVE1MID0gbG9hZGluZ1RlbXBsYXRlLm91dGVySFRNTDtcbiAgICB9XG4gICAgaWYgKGdldEVudGlyZUxpc3QpIHtcbiAgICAgIHNlYXJjaFZhbHVlID0gJyc7XG4gICAgfVxuICAgIGlmIChjb25maWcuc2VhcmNoS2V5ID09PSBzZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGlzdC5zaG93KCk7XG4gICAgfVxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdmFyIHBhcmFtcyA9IGNvbmZpZy5wYXJhbXMgfHwge307XG4gICAgcGFyYW1zW2NvbmZpZy5zZWFyY2hLZXldID0gc2VhcmNoVmFsdWU7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHNlbGYuY2FjaGUgPSBzZWxmLmNhY2hlIHx8IHt9O1xuICAgIHZhciB1cmwgPSBjb25maWcuZW5kcG9pbnQgKyB0aGlzLmJ1aWxkUGFyYW1zKHBhcmFtcyk7XG4gICAgdmFyIHVybENhY2hlZERhdGEgPSBzZWxmLmNhY2hlW3VybF07XG4gICAgaWYgKHVybENhY2hlZERhdGEpIHtcbiAgICAgIHNlbGYuX2xvYWREYXRhKHVybENhY2hlZERhdGEsIGNvbmZpZywgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvYWRVcmxEYXRhKHVybClcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgIHNlbGYuX2xvYWREYXRhKGRhdGEsIGNvbmZpZywgc2VsZik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICBfbG9hZFVybERhdGE6IGZ1bmN0aW9uIF9sb2FkVXJsRGF0YSh1cmwpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoeGhyLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUpIHtcbiAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICBzZWxmLmNhY2hlW3VybF0gPSBkYXRhO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoW3hoci5yZXNwb25zZVRleHQsIHhoci5zdGF0dXNdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB4aHIuc2VuZCgpO1xuICAgIH0pO1xuICB9LFxuXG4gIF9sb2FkRGF0YTogZnVuY3Rpb24gX2xvYWREYXRhKGRhdGEsIGNvbmZpZywgc2VsZikge1xuICAgIGNvbnN0IGxpc3QgPSBzZWxmLmhvb2subGlzdDtcbiAgICBpZiAoY29uZmlnLmxvYWRpbmdUZW1wbGF0ZSAmJiBsaXN0LmRhdGEgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgbGlzdC5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgZGF0YUxvYWRpbmdUZW1wbGF0ZSA9IGxpc3QubGlzdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1sb2FkaW5nLXRlbXBsYXRlXScpO1xuICAgICAgaWYgKGRhdGFMb2FkaW5nVGVtcGxhdGUpIHtcbiAgICAgICAgZGF0YUxvYWRpbmdUZW1wbGF0ZS5vdXRlckhUTUwgPSBzZWxmLmxpc3RUZW1wbGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFzZWxmLmRlc3Ryb3llZCkge1xuICAgICAgdmFyIGhvb2tMaXN0Q2hpbGRyZW4gPSBsaXN0Lmxpc3QuY2hpbGRyZW47XG4gICAgICB2YXIgb25seUR5bmFtaWNMaXN0ID0gaG9va0xpc3RDaGlsZHJlbi5sZW5ndGggPT09IDEgJiYgaG9va0xpc3RDaGlsZHJlblswXS5oYXNBdHRyaWJ1dGUoJ2RhdGEtZHluYW1pYycpO1xuICAgICAgaWYgKG9ubHlEeW5hbWljTGlzdCAmJiBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsaXN0LmhpZGUoKTtcbiAgICAgIH1cbiAgICAgIGxpc3Quc2V0RGF0YS5jYWxsKGxpc3QsIGRhdGEpO1xuICAgIH1cbiAgICBzZWxmLm5vdExvYWRpbmcoKTtcbiAgICBsaXN0LmN1cnJlbnRJbmRleCA9IDA7XG4gIH0sXG5cbiAgYnVpbGRQYXJhbXM6IGZ1bmN0aW9uKHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zKSByZXR1cm4gJyc7XG4gICAgdmFyIHBhcmFtc0FycmF5ID0gT2JqZWN0LmtleXMocGFyYW1zKS5tYXAoZnVuY3Rpb24ocGFyYW0pIHtcbiAgICAgIHJldHVybiBwYXJhbSArICc9JyArIChwYXJhbXNbcGFyYW1dIHx8ICcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gJz8nICsgcGFyYW1zQXJyYXkuam9pbignJicpO1xuICB9LFxuXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgfVxuXG4gICAgdGhpcy5kZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMuaG9vay50cmlnZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24uZGwnLCB0aGlzLmV2ZW50V3JhcHBlci5kZWJvdW5jZVRyaWdnZXIpO1xuICAgIHRoaXMuaG9vay50cmlnZ2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5ldmVudFdyYXBwZXIuZGVib3VuY2VUcmlnZ2VyKTtcbiAgfVxufTtcblxud2luZG93LmRyb3BsYWJBamF4RmlsdGVyID0gZHJvcGxhYkFqYXhGaWx0ZXI7XG5cbmV4cG9ydCBkZWZhdWx0IGRyb3BsYWJBamF4RmlsdGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BsdWdpbnMvYWpheF9maWx0ZXIuanMiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file
diff --git a/app/assets/javascripts/droplab/plugins/filter.js b/app/assets/javascripts/droplab/plugins/filter.js
new file mode 100644
index 00000000000..183d137b3a3
--- /dev/null
+++ b/app/assets/javascripts/droplab/plugins/filter.js
@@ -0,0 +1,172 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+/******/
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // identity function for calling harmony imports with the correct context
+/******/ __webpack_require__.i = function(value) { return value; };
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 12);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 12:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var droplabFilter = {
+ keydown: function keydown(e) {
+ var hiddenCount = 0;
+ var dataHiddenCount = 0;
+
+ var list = e.detail.hook.list;
+ var data = list.data;
+ var value = e.detail.hook.trigger.value.toLowerCase();
+ var config = e.detail.hook.config.droplabFilter;
+ var matches = [];
+ var filterFunction;
+ // will only work on dynamically set data
+ if (!data) {
+ return;
+ }
+
+ if (config && config.filterFunction && typeof config.filterFunction === 'function') {
+ filterFunction = config.filterFunction;
+ } else {
+ filterFunction = function filterFunction(o) {
+ // cheap string search
+ o.droplab_hidden = o[config.template].toLowerCase().indexOf(value) === -1;
+ return o;
+ };
+ }
+
+ dataHiddenCount = data.filter(function (o) {
+ return !o.droplab_hidden;
+ }).length;
+
+ matches = data.map(function (o) {
+ return filterFunction(o, value);
+ });
+
+ hiddenCount = matches.filter(function (o) {
+ return !o.droplab_hidden;
+ }).length;
+
+ if (dataHiddenCount !== hiddenCount) {
+ list.render(matches);
+ list.currentIndex = 0;
+ }
+ },
+
+ debounceKeydown: function debounceKeydown(e) {
+ if ([13, // enter
+ 16, // shift
+ 17, // ctrl
+ 18, // alt
+ 20, // caps lock
+ 37, // left arrow
+ 38, // up arrow
+ 39, // right arrow
+ 40, // down arrow
+ 91, // left window
+ 92, // right window
+ 93].indexOf(e.detail.which || e.detail.keyCode) > -1) return;
+
+ if (this.timeout) clearTimeout(this.timeout);
+ this.timeout = setTimeout(this.keydown.bind(this, e), 200);
+ },
+
+ init: function init(hook) {
+ var config = hook.config.droplabFilter;
+
+ if (!config || !config.template) return;
+
+ this.hook = hook;
+
+ this.eventWrapper = {};
+ this.eventWrapper.debounceKeydown = this.debounceKeydown.bind(this);
+
+ this.hook.trigger.addEventListener('keydown.dl', this.eventWrapper.debounceKeydown);
+ },
+
+ destroy: function destroy() {
+ this.hook.trigger.removeEventListener('keydown.dl', this.eventWrapper.debounceKeydown);
+
+ var dynamicList = this.hook.list.list.querySelector('[data-dynamic]');
+ if (this.listTemplate && dynamicList) {
+ dynamicList.outerHTML = this.listTemplate;
+ }
+ }
+};
+
+window.droplabFilter = droplabFilter;
+
+exports.default = droplabFilter;
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZjM3NjcyYjdmNTI4YjQ3MmE0NGM/ZWM1ZioiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BsdWdpbnMvZmlsdGVyLmpzIl0sIm5hbWVzIjpbImRyb3BsYWJGaWx0ZXIiLCJrZXlkb3duIiwiZSIsImhpZGRlbkNvdW50IiwiZGF0YUhpZGRlbkNvdW50IiwibGlzdCIsImRldGFpbCIsImhvb2siLCJkYXRhIiwidmFsdWUiLCJ0cmlnZ2VyIiwidG9Mb3dlckNhc2UiLCJjb25maWciLCJtYXRjaGVzIiwiZmlsdGVyRnVuY3Rpb24iLCJvIiwiZHJvcGxhYl9oaWRkZW4iLCJ0ZW1wbGF0ZSIsImluZGV4T2YiLCJmaWx0ZXIiLCJsZW5ndGgiLCJtYXAiLCJyZW5kZXIiLCJjdXJyZW50SW5kZXgiLCJkZWJvdW5jZUtleWRvd24iLCJ3aGljaCIsImtleUNvZGUiLCJ0aW1lb3V0IiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImJpbmQiLCJpbml0IiwiZXZlbnRXcmFwcGVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRlc3Ryb3kiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZHluYW1pY0xpc3QiLCJxdWVyeVNlbGVjdG9yIiwibGlzdFRlbXBsYXRlIiwib3V0ZXJIVE1MIiwid2luZG93Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFF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QixZQUFMLEdBQW9CLEVBQXBCO0FBQ0EsU0FBS0EsWUFBTCxDQUFrQlIsZUFBbEIsR0FBb0MsS0FBS0EsZUFBTCxDQUFxQk0sSUFBckIsQ0FBMEIsSUFBMUIsQ0FBcEM7O0FBRUEsU0FBS3ZCLElBQUwsQ0FBVUcsT0FBVixDQUFrQnVCLGdCQUFsQixDQUFtQyxZQUFuQyxFQUFpRCxLQUFLRCxZQUFMLENBQWtCUixlQUFuRTtBQUNELEdBM0VtQjs7QUE2RXBCVSxXQUFTLFNBQVNBLE9BQVQsR0FBbUI7QUFDMUIsU0FBSzNCLElBQUwsQ0FBVUcsT0FBVixDQUFrQnlCLG1CQUFsQixDQUFzQyxZQUF0QyxFQUFvRCxLQUFLSCxZQUFMLENBQWtCUixlQUF0RTs7QUFFQSxRQUFJWSxjQUFjLEtBQUs3QixJQUFMLENBQVVGLElBQVYsQ0FBZUEsSUFBZixDQUFvQmdDLGFBQXBCLENBQWtDLGdCQUFsQyxDQUFsQjtBQUNBLFFBQUksS0FBS0MsWUFBTCxJQUFxQkYsV0FBekIsRUFBc0M7QUFDcENBLGtCQUFZRyxTQUFaLEdBQXdCLEtBQUtELFlBQTdCO0FBQ0Q7QUFDRjtBQXBGbUIsQ0FBdEI7O0FBdUZBRSxPQUFPeEMsYUFBUCxHQUF1QkEsYUFBdkI7O2tCQUVlQSxhIiwiZmlsZSI6Ii4vZGlzdC9wbHVnaW5zL2ZpbHRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuXG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBpZGVudGl0eSBmdW5jdGlvbiBmb3IgY2FsbGluZyBoYXJtb255IGltcG9ydHMgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbiBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4gXHRcdFx0XHRnZXQ6IGdldHRlclxuIFx0XHRcdH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEyKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCBmMzc2NzJiN2Y1MjhiNDcyYTQ0YyIsImNvbnN0IGRyb3BsYWJGaWx0ZXIgPSB7XG4gIGtleWRvd246IGZ1bmN0aW9uKGUpe1xuICAgIHZhciBoaWRkZW5Db3VudCA9IDA7XG4gICAgdmFyIGRhdGFIaWRkZW5Db3VudCA9IDA7XG5cbiAgICB2YXIgbGlzdCA9IGUuZGV0YWlsLmhvb2subGlzdDtcbiAgICB2YXIgZGF0YSA9IGxpc3QuZGF0YTtcbiAgICB2YXIgdmFsdWUgPSBlLmRldGFpbC5ob29rLnRyaWdnZXIudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgY29uZmlnID0gZS5kZXRhaWwuaG9vay5jb25maWcuZHJvcGxhYkZpbHRlcjtcbiAgICB2YXIgbWF0Y2hlcyA9IFtdO1xuICAgIHZhciBmaWx0ZXJGdW5jdGlvbjtcbiAgICAvLyB3aWxsIG9ubHkgd29yayBvbiBkeW5hbWljYWxseSBzZXQgZGF0YVxuICAgIGlmKCFkYXRhKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5maWx0ZXJGdW5jdGlvbiAmJiB0eXBlb2YgY29uZmlnLmZpbHRlckZ1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmaWx0ZXJGdW5jdGlvbiA9IGNvbmZpZy5maWx0ZXJGdW5jdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsdGVyRnVuY3Rpb24gPSBmdW5jdGlvbihvKXtcbiAgICAgICAgLy8gY2hlYXAgc3RyaW5nIHNlYXJjaFxuICAgICAgICBvLmRyb3BsYWJfaGlkZGVuID0gb1tjb25maWcudGVtcGxhdGVdLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih2YWx1ZSkgPT09IC0xO1xuICAgICAgICByZXR1cm4gbztcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZGF0YUhpZGRlbkNvdW50ID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24obykge1xuICAgICAgcmV0dXJuICFvLmRyb3BsYWJfaGlkZGVuO1xuICAgIH0pLmxlbmd0aDtcblxuICAgIG1hdGNoZXMgPSBkYXRhLm1hcChmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gZmlsdGVyRnVuY3Rpb24obywgdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaGlkZGVuQ291bnQgPSBtYXRjaGVzLmZpbHRlcihmdW5jdGlvbihvKSB7XG4gICAgICByZXR1cm4gIW8uZHJvcGxhYl9oaWRkZW47XG4gICAgfSkubGVuZ3RoO1xuXG4gICAgaWYgKGRhdGFIaWRkZW5Db3VudCAhPT0gaGlkZGVuQ291bnQpIHtcbiAgICAgIGxpc3QucmVuZGVyKG1hdGNoZXMpO1xuICAgICAgbGlzdC5jdXJyZW50SW5kZXggPSAwO1xuICAgIH1cbiAgfSxcblxuICBkZWJvdW5jZUtleWRvd246IGZ1bmN0aW9uIGRlYm91bmNlS2V5ZG93bihlKSB7XG4gICAgaWYgKFtcbiAgICAgIDEzLCAvLyBlbnRlclxuICAgICAgMTYsIC8vIHNoaWZ0XG4gICAgICAxNywgLy8gY3RybFxuICAgICAgMTgsIC8vIGFsdFxuICAgICAgMjAsIC8vIGNhcHMgbG9ja1xuICAgICAgMzcsIC8vIGxlZnQgYXJyb3dcbiAgICAgIDM4LCAvLyB1cCBhcnJvd1xuICAgICAgMzksIC8vIHJpZ2h0IGFycm93XG4gICAgICA0MCwgLy8gZG93biBhcnJvd1xuICAgICAgOTEsIC8vIGxlZnQgd2luZG93XG4gICAgICA5MiwgLy8gcmlnaHQgd2luZG93XG4gICAgICA5MywgLy8gc2VsZWN0XG4gICAgXS5pbmRleE9mKGUuZGV0YWlsLndoaWNoIHx8IGUuZGV0YWlsLmtleUNvZGUpID4gLTEpIHJldHVybjtcblxuICAgIGlmICh0aGlzLnRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5rZXlkb3duLmJpbmQodGhpcywgZSksIDIwMCk7XG4gIH0sXG5cbiAgaW5pdDogZnVuY3Rpb24gaW5pdChob29rKSB7XG4gICAgdmFyIGNvbmZpZyA9IGhvb2suY29uZmlnLmRyb3BsYWJGaWx0ZXI7XG5cbiAgICBpZiAoIWNvbmZpZyB8fCAhY29uZmlnLnRlbXBsYXRlKSByZXR1cm47XG5cbiAgICB0aGlzLmhvb2sgPSBob29rO1xuXG4gICAgdGhpcy5ldmVudFdyYXBwZXIgPSB7fTtcbiAgICB0aGlzLmV2ZW50V3JhcHBlci5kZWJvdW5jZUtleWRvd24gPSB0aGlzLmRlYm91bmNlS2V5ZG93bi5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5ob29rLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bi5kbCcsIHRoaXMuZXZlbnRXcmFwcGVyLmRlYm91bmNlS2V5ZG93bik7XG4gIH0sXG5cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB0aGlzLmhvb2sudHJpZ2dlci5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duLmRsJywgdGhpcy5ldmVudFdyYXBwZXIuZGVib3VuY2VLZXlkb3duKTtcblxuICAgIHZhciBkeW5hbWljTGlzdCA9IHRoaXMuaG9vay5saXN0Lmxpc3QucXVlcnlTZWxlY3RvcignW2RhdGEtZHluYW1pY10nKTtcbiAgICBpZiAodGhpcy5saXN0VGVtcGxhdGUgJiYgZHluYW1pY0xpc3QpIHtcbiAgICAgIGR5bmFtaWNMaXN0Lm91dGVySFRNTCA9IHRoaXMubGlzdFRlbXBsYXRlO1xuICAgIH1cbiAgfVxufTtcblxud2luZG93LmRyb3BsYWJGaWx0ZXIgPSBkcm9wbGFiRmlsdGVyO1xuXG5leHBvcnQgZGVmYXVsdCBkcm9wbGFiRmlsdGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BsdWdpbnMvZmlsdGVyLmpzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file
diff --git a/app/assets/javascripts/droplab/plugins/input_setter.js b/app/assets/javascripts/droplab/plugins/input_setter.js
new file mode 100644
index 00000000000..ffc9af0476d
--- /dev/null
+++ b/app/assets/javascripts/droplab/plugins/input_setter.js
@@ -0,0 +1,129 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+/******/
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // identity function for calling harmony imports with the correct context
+/******/ __webpack_require__.i = function(value) { return value; };
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 13);
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ 13:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var droplabInputSetter = {
+ init: function init(hook) {
+ this.hook = hook;
+ this.config = hook.config.droplabInputSetter || (this.hook.config.droplabInputSetter = {});
+
+ this.eventWrapper = {};
+
+ this.addEvents();
+ },
+ addEvents: function addEvents() {
+ this.eventWrapper.setInputs = this.setInputs.bind(this);
+ this.hook.list.list.addEventListener('click.dl', this.eventWrapper.setInputs);
+ },
+ removeEvents: function removeEvents() {
+ this.hook.list.list.removeEventListener('click.dl', this.eventWrapper.setInputs);
+ },
+ setInputs: function setInputs(e) {
+ var _this = this;
+
+ var selectedItem = e.detail.selected;
+
+ if (!Array.isArray(this.config)) this.config = [this.config];
+
+ this.config.forEach(function (config) {
+ return _this.setInput(config, selectedItem);
+ });
+ },
+ setInput: function setInput(config, selectedItem) {
+ var input = config.input || this.hook.trigger;
+ var newValue = selectedItem.getAttribute(config.valueAttribute);
+
+ if (input.tagName === 'INPUT') {
+ input.value = newValue;
+ } else {
+ input.textContent = newValue;
+ }
+ },
+ destroy: function destroy() {
+ this.removeEvents();
+ }
+};
+
+window.droplabInputSetter = droplabInputSetter;
+
+exports.default = droplabInputSetter;
+
+/***/ })
+
+/******/ });
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgZjM3NjcyYjdmNTI4YjQ3MmE0NGM/ZWM1ZiIsIndlYnBhY2s6Ly8vLi9zcmMvcGx1Z2lucy9pbnB1dF9zZXR0ZXIuanMiXSwibmFtZXMiOlsiZHJvcGxhYklucHV0U2V0dGVyIiwiaW5pdCIsImhvb2siLCJjb25maWciLCJldmVudFdyYXBwZXIiLCJhZGRFdmVudHMiLCJzZXRJbnB1dHMiLCJiaW5kIiwibGlzdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudHMiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiZSIsInNlbGVjdGVkSXRlbSIsImRldGFpbCIsInNlbGVjdGVkIiwiQXJyYXkiLCJpc0FycmF5IiwiZm9yRWFjaCIsInNldElucHV0IiwiaW5wdXQiLCJ0cmlnZ2VyIiwibmV3VmFsdWUiLCJnZXRBdHRyaWJ1dGUiLCJ2YWx1ZUF0dHJpYnV0ZSIsInRhZ05hbWUiLCJ2YWx1ZSIsInRleHRDb250ZW50IiwiZGVzdHJveSIsIndpbmRvdyJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1EQUEyQyxjQUFjOztBQUV6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDaEVBLElBQU1BLHFCQUFxQjtBQUN6QkMsTUFEeUIsZ0JBQ3BCQyxJQURvQixFQUNkO0FBQ1QsU0FBS0EsSUFBTCxHQUFZQSxJQUFaO0FBQ0EsU0FBS0MsTUFBTCxHQUFjRCxLQUFLQyxNQUFMLENBQVlILGtCQUFaLEtBQW1DLEtBQUtFLElBQUwsQ0FBVUMsTUFBVixDQUFpQkgsa0JBQWpCLEdBQXNDLEVBQXpFLENBQWQ7O0FBRUEsU0FBS0ksWUFBTCxHQUFvQixFQUFwQjs7QUFFQSxTQUFLQyxTQUFMO0FBQ0QsR0FSd0I7QUFVekJBLFdBVnlCLHVCQVViO0FBQ1YsU0FBS0QsWUFBTCxDQUFrQkUsU0FBbEIsR0FBOEIsS0FBS0EsU0FBTCxDQUFlQyxJQUFmLENBQW9CLElBQXBCLENBQTlCO0FBQ0EsU0FBS0wsSUFBTCxDQUFVTSxJQUFWLENBQWVBLElBQWYsQ0FBb0JDLGdCQUFwQixDQUFxQyxVQUFyQyxFQUFpRCxLQUFLTCxZQUFMLENBQWtCRSxTQUFuRTtBQUNELEdBYndCO0FBZXpCSSxjQWZ5QiwwQkFlVjtBQUNiLFNBQUtSLElBQUwsQ0FBVU0sSUFBVixDQUFlQSxJQUFmLENBQW9CRyxtQkFBcEIsQ0FBd0MsVUFBeEMsRUFBb0QsS0FBS1AsWUFBTCxDQUFrQkUsU0FBdEU7QUFDRCxHQWpCd0I7QUFtQnpCQSxXQW5CeUIscUJBbUJmTSxDQW5CZSxFQW1CWjtBQUFBOztBQUNYLFFBQU1DLGVBQWVELEVBQUVFLE1BQUYsQ0FBU0MsUUFBOUI7O0FBRUEsUUFBSSxDQUFDQyxNQUFNQyxPQUFOLENBQWMsS0FBS2QsTUFBbkIsQ0FBTCxFQUFpQyxLQUFLQSxNQUFMLEdBQWMsQ0FBQyxLQUFLQSxNQUFOLENBQWQ7O0FBRWpDLFNBQUtBLE1BQUwsQ0FBWWUsT0FBWixDQUFvQjtBQUFBLGFBQVUsTUFBS0MsUUFBTCxDQUFjaEIsTUFBZCxFQUFzQlUsWUFBdEIsQ0FBVjtBQUFBLEtBQXBCO0FBQ0QsR0F6QndCO0FBMkJ6Qk0sVUEzQnlCLG9CQTJCaEJoQixNQTNCZ0IsRUEyQlJVLFlBM0JRLEVBMkJNO0FBQzdCLFFBQU1PLFFBQVFqQixPQUFPaUIsS0FBUCxJQUFnQixLQUFLbEIsSUFBTCxDQUFVbUIsT0FBeEM7QUFDQSxRQUFNQyxXQUFXVCxhQUFhVSxZQUFiLENBQTBCcEIsT0FBT3FCLGNBQWpDLENBQWpCOztBQUVBLFFBQUlKLE1BQU1LLE9BQU4sS0FBa0IsT0FBdEIsRUFBK0I7QUFDN0JMLFlBQU1NLEtBQU4sR0FBY0osUUFBZDtBQUNELEtBRkQsTUFFTztBQUNMRixZQUFNTyxXQUFOLEdBQW9CTCxRQUFwQjtBQUNEO0FBQ0YsR0FwQ3dCO0FBc0N6Qk0sU0F0Q3lCLHFCQXNDZjtBQUNSLFNBQUtsQixZQUFMO0FBQ0Q7QUF4Q3dCLENBQTNCOztBQTJDQW1CLE9BQU83QixrQkFBUCxHQUE0QkEsa0JBQTVCOztrQkFFZUEsa0IiLCJmaWxlIjoiLi9kaXN0L3BsdWdpbnMvaW5wdXRfc2V0dGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTMpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIHdlYnBhY2svYm9vdHN0cmFwIGYzNzY3MmI3ZjUyOGI0NzJhNDRjIiwiY29uc3QgZHJvcGxhYklucHV0U2V0dGVyID0ge1xuICBpbml0KGhvb2spIHtcbiAgICB0aGlzLmhvb2sgPSBob29rO1xuICAgIHRoaXMuY29uZmlnID0gaG9vay5jb25maWcuZHJvcGxhYklucHV0U2V0dGVyIHx8ICh0aGlzLmhvb2suY29uZmlnLmRyb3BsYWJJbnB1dFNldHRlciA9IHt9KTtcblxuICAgIHRoaXMuZXZlbnRXcmFwcGVyID0ge307XG5cbiAgICB0aGlzLmFkZEV2ZW50cygpO1xuICB9LFxuXG4gIGFkZEV2ZW50cygpIHtcbiAgICB0aGlzLmV2ZW50V3JhcHBlci5zZXRJbnB1dHMgPSB0aGlzLnNldElucHV0cy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaG9vay5saXN0Lmxpc3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2suZGwnLCB0aGlzLmV2ZW50V3JhcHBlci5zZXRJbnB1dHMpO1xuICB9LFxuXG4gIHJlbW92ZUV2ZW50cygpIHtcbiAgICB0aGlzLmhvb2subGlzdC5saXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrLmRsJywgdGhpcy5ldmVudFdyYXBwZXIuc2V0SW5wdXRzKTtcbiAgfSxcblxuICBzZXRJbnB1dHMoZSkge1xuICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IGUuZGV0YWlsLnNlbGVjdGVkO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuY29uZmlnKSkgdGhpcy5jb25maWcgPSBbdGhpcy5jb25maWddO1xuXG4gICAgdGhpcy5jb25maWcuZm9yRWFjaChjb25maWcgPT4gdGhpcy5zZXRJbnB1dChjb25maWcsIHNlbGVjdGVkSXRlbSkpO1xuICB9LFxuXG4gIHNldElucHV0KGNvbmZpZywgc2VsZWN0ZWRJdGVtKSB7XG4gICAgY29uc3QgaW5wdXQgPSBjb25maWcuaW5wdXQgfHwgdGhpcy5ob29rLnRyaWdnZXI7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBzZWxlY3RlZEl0ZW0uZ2V0QXR0cmlidXRlKGNvbmZpZy52YWx1ZUF0dHJpYnV0ZSk7XG5cbiAgICBpZiAoaW5wdXQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xuICAgICAgaW5wdXQudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQudGV4dENvbnRlbnQgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50cygpO1xuICB9LFxufTtcblxud2luZG93LmRyb3BsYWJJbnB1dFNldHRlciA9IGRyb3BsYWJJbnB1dFNldHRlcjtcblxuZXhwb3J0IGRlZmF1bHQgZHJvcGxhYklucHV0U2V0dGVyO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3BsdWdpbnMvaW5wdXRfc2V0dGVyLmpzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file