diff --git a/dist/css/style.css b/dist/css/style.css index 211c57c9..61de9bce 100644 --- a/dist/css/style.css +++ b/dist/css/style.css @@ -7129,6 +7129,179 @@ div.CodeMirror-dragcursors { /* Help users use markselection to safely style text background */ span.CodeMirror-selectedtext { background: none; } +/* variables */ +.data-table { + /* styling */ + width: 100%; + position: relative; + overflow: auto; } +/* resets */ +.data-table *, .data-table *::after, .data-table *::before { + -webkit-box-sizing: border-box; + box-sizing: border-box; } +.data-table button, .data-table input { + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; + margin: 0; + padding: 0; } +.data-table .input-style { + outline: none; + width: 100%; + border: none; } +.data-table *, .data-table *:focus { + outline: none; + border-radius: 0px; + -webkit-box-shadow: none; + box-shadow: none; } +.data-table table { + border-collapse: collapse; } +.data-table table td { + padding: 0; + border: 1px solid #d1d8dd; } +.data-table thead td { + border-bottom-width: 1px; } +.data-table .freeze-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -ms-flex-line-pack: center; + align-content: center; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background-color: #f5f7fa; + opacity: 0.5; + font-size: 2em; } +.data-table .freeze-container span { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + transform: translateY(-50%); } +.data-table .trash-container { + position: absolute; + bottom: 0; + left: 30%; + right: 30%; + height: 70px; + background: palevioletred; + opacity: 0.5; } +.data-table .hide { + display: none; } +.body-scrollable { + max-height: 500px; + overflow: auto; + border-bottom: 1px solid #d1d8dd; } +.body-scrollable.row-highlight-all .data-table-row:not(.row-unhighlight) { + background-color: #f5f7fa; } +.data-table-header { + position: absolute; + top: 0; + left: 0; + background-color: white; + font-weight: bold; } +.data-table-header .content span:not(.column-resizer) { + cursor: pointer; } +.data-table-header .column-resizer { + display: none; + position: absolute; + right: 0; + top: 0; + width: 4px; + width: 0.25rem; + height: 100%; + background-color: #5292f7; + cursor: col-resize; } +.data-table-header .data-table-dropdown { + position: absolute; + right: 10px; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: top; + text-align: left; } +.data-table-header .data-table-dropdown.is-active .data-table-dropdown-list { + display: block; } +.data-table-header .data-table-dropdown.is-active .data-table-dropdown-toggle { + display: block; } +.data-table-header .data-table-dropdown-toggle { + display: none; + background-color: transparent; + border: none; } +.data-table-header .data-table-dropdown-list { + display: none; + font-weight: normal; + position: absolute; + min-width: 128px; + min-width: 8rem; + top: 100%; + right: 0; + z-index: 1; + background-color: white; + border-radius: 3px; + -webkit-box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + padding-bottom: 8px; + padding-bottom: 0.5rem; + padding-top: 8px; + padding-top: 0.5rem; } +.data-table-header .data-table-dropdown-list > div { + padding: 8px 16px; + padding: 0.5rem 1rem; } +.data-table-header .data-table-dropdown-list > div:hover { + background-color: #f5f7fa; } +.data-table-header .data-table-col.remove-column { + background-color: #FD8B8B; + -webkit-transition: 300ms background-color ease-in-out; + transition: 300ms background-color ease-in-out; } +.data-table-header .data-table-col.sortable-chosen { + background-color: #f5f7fa; } +.data-table-col { + position: relative; } +.data-table-col .content { + padding: 8px; + padding: 0.5rem; + border: 2px solid transparent; } +.data-table-col .content.ellipsis { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } +.data-table-col .edit-cell { + display: none; + padding: 8px; + padding: 0.5rem; + background: #fff; + z-index: 1; + height: 100%; } +.data-table-col.selected .content { + border: 2px solid #5292f7; } +.data-table-col.editing .content { + display: none; } +.data-table-col.editing .edit-cell { + border: 2px solid #5292f7; + display: block; } +.data-table-col.highlight { + background-color: #f5f7fa; } +.data-table-col:hover .column-resizer { + display: inline-block; } +.data-table-col:hover .data-table-dropdown-toggle { + display: block; } +.data-table-row.row-highlight { + background-color: #f5f7fa; } +.noselect { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } +body.data-table-resize { + cursor: col-resize; } .indicator, .indicator-right { background: none; vertical-align: middle; } @@ -7172,17 +7345,14 @@ html { min-height: 100vh; } .desk-center { border-left: 1px solid #dee2e6; } -.desk-menu .list-group-item { - padding: 0.5rem 1rem; - border: none; } .hide { display: none !important; } .page { padding-bottom: 2rem; } .page .page-head { padding: 0.5rem 1rem; - background-color: #343a40; - color: #f8f9fa; } + background-color: #f8f9fa; + border-bottom: 1px solid #dee2e6; } .page .page-head .page-title { display: inline-block; margin-top: 0.3rem; } @@ -7192,7 +7362,7 @@ html { text-align: center; padding: 200px 0px; } .form-body { - padding: 1rem; } + padding: 2rem; } .form-body .form-control.font-weight-bold { background-color: lightyellow; } .form-body .alert { @@ -7213,6 +7383,26 @@ html { background-color: #e9ecef; } .dropdown-item { padding: 0.5rem 1rem; } +.bottom-right-float { + position: fixed; + margin-bottom: 0px; + bottom: 1rem; + right: 1rem; + max-width: 200px; + padding: 0.5rem 1rem; } +.desk-menu { + background-color: #e9ecef; } +.desk-menu .list-row { + border-bottom: 1px solid #e9ecef; } +.desk-menu .list-row:hover { + background-color: #dee2e6; } +.desk-menu .list-row.active { + background-color: #ced4da; } +.print-page { + padding: 3rem; + line-height: 1.8; } +.print-page td, .print-page th { + padding: 0.5rem; } .CodeMirror { font-family: "SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace; border: 1px solid #dee2e6; @@ -7260,8 +7450,3 @@ mark { left: auto; width: auto; min-width: 120px; } -.print-page { - padding: 3rem; - line-height: 1.8; } -.print-page td, .print-page th { - padding: 0.5rem; } diff --git a/dist/js/bundle.js b/dist/js/bundle.js index 440264b3..40765424 100644 --- a/dist/js/bundle.js +++ b/dist/js/bundle.js @@ -18,10 +18,10 @@ var utils = { _(text, args) { // should return translated text - return this.string_replace(text, args); + return this.stringReplace(text, args); }, - string_replace(str, args) { + stringReplace(str, args) { if (!Array.isArray(args)) { args = [args]; } @@ -9190,7 +9190,7 @@ var frappejs = { async getDuplicate(doc) { const newDoc = await this.getNewDoc(doc.doctype); for (let field of this.getMeta(doc.doctype).getValidFields()) { - if (field.fieldname === 'name') continue; + if (['name', 'submitted'].includes(field.fieldname)) continue; if (field.fieldtype === 'Table') { newDoc[field.fieldname] = (doc[field.fieldname] || []).map(d => { let newd = Object.assign({}, d); @@ -9291,6 +9291,7 @@ class ValidationError extends BaseError { var errors = { ValidationError: ValidationError, ValueError: class ValueError extends ValidationError { }, + Conflict: class Conflict extends ValidationError { }, NotFound: class NotFound extends BaseError { constructor(...params) { super(404, ...params); } }, @@ -9301,117 +9302,118 @@ var errors = { var observable = class Observable { constructor() { - this._isHot = {}; - this._eventQueue = {}; + this._observable = { + isHot: {}, + eventQueue: {}, + listeners: {}, + onceListeners: {} + }; } on(event, listener) { - this._addListener('_listeners', event, listener); - if (this._socketClient) { - this._socketClient.on(event, listener); + this._addListener('listeners', event, listener); + if (this._observable.socketClient) { + this._observable.socketClient.on(event, listener); } } // remove listener off(event, listener) { - for (let type of ['_listeners', '_onceListeners']) { - let index = this[type] && this[type][event] && this[type][event].indexOf(listener); + for (let type of ['listeners', 'onceListeners']) { + let index = this._observable[type][event] && this._observable[type][event].indexOf(listener); if (index) { - this[type][event].splice(index, 1); + this._observable[type][event].splice(index, 1); } } } once(event, listener) { - this._addListener('_onceListeners', event, listener); + this._addListener('onceListeners', event, listener); + } + + async trigger(event, params, throttle=false) { + if (throttle) { + if (this._throttled(event, params, throttle)) return; + params = [params]; + } + + await this._executeTriggers(event, params); + } + + async _executeTriggers(event, params) { + let response = await this._triggerEvent('listeners', event, params); + if (response === false) return false; + + response = await this._triggerEvent('onceListeners', event, params); + if (response === false) return false; + + // emit via socket + if (this._observable.socketServer) { + this._observable.socketServer.emit(event, params); + } + + // clear once-listeners + if (this._observable.onceListeners && this._observable.onceListeners[event]) { + delete this._observable.onceListeners[event]; + } + + } + + clearListeners() { + this._observable.listeners = {}; + this._observable.onceListeners = {}; } bindSocketClient(socket) { // also send events with sockets - this._socketClient = socket; + this._observable.socketClient = socket; } bindSocketServer(socket) { // also send events with sockets - this._socketServer = socket; - } - - async trigger(event, params, throttle=false) { - if (this._throttled(event, params, throttle)) return; - - // listify if throttled - if (throttle) params = [params]; - - await this._triggerEvent('_listeners', event, params); - await this._triggerEvent('_onceListeners', event, params); - - if (this._socketServer) { - this._socketServer.emit(event, params); - } - - // clear once-listeners - if (this._onceListeners && this._onceListeners[event]) { - delete this._onceListeners[event]; - } - - + this._observable.socketServer = socket; } _throttled(event, params, throttle) { - if (throttle) { - if (this._isHot[event]) { + if (this._observable.isHot[event]) { + // hot, add to queue + if (!this._observable.eventQueue[event]) this._observable.eventQueue[event] = []; + this._observable.eventQueue[event].push(params); - // hot, add to queue - if (this._eventQueue[event]) { - - // queue exists, just add - this._eventQueue[event].push(params); - } else { - - // create a new queue to be called after cool-off - this._eventQueue[event] = [params]; - - // call after cool-off - setTimeout(() => { - let _queuedParams = this._eventQueue[event]; - - // reset queues - this._isHot[event] = false; - this._eventQueue[event] = null; - - this.trigger(event, _queuedParams, true); - }, throttle); - - } - return true; - } - this._isHot[event] = true; + // aleady hot, quit + return true; } + this._observable.isHot[event] = true; + + // cool-off + setTimeout(() => { + this._observable.isHot[event] = false; + + // flush queue + if (this._observable.eventQueue[event]) { + let _queuedParams = this._observable.eventQueue[event]; + this._observable.eventQueue[event] = null; + this._executeTriggers(event, _queuedParams); + } + }, throttle); + return false; } - _addListener(name, event, listener) { - if (!this[name]) { - this[name] = {}; + _addListener(type, event, listener) { + if (!this._observable[type][event]) { + this._observable[type][event] = []; } - if (!this[name][event]) { - this[name][event] = []; - } - this[name][event].push(listener); + this._observable[type][event].push(listener); } - async _triggerEvent(name, event, params) { - if (this[name] && this[name][event]) { - for (let listener of this[name][event]) { + async _triggerEvent(type, event, params) { + if (this._observable[type][event]) { + for (let listener of this._observable[type][event]) { await listener(params); } } } - - clearListeners() { - this._listeners = {}; - this._onceListeners = {}; - } }; var model = { @@ -9429,12 +9431,12 @@ var model = { let next = await series.next(); return prefix + next; }, - common_fields: [ + commonFields: [ { fieldname: 'name', fieldtype: 'Data', required: 1 } ], - parent_fields: [ + parentFields: [ { fieldname: 'owner', fieldtype: 'Data', required: 1 }, @@ -9449,12 +9451,9 @@ var model = { }, { fieldname: 'keywords', fieldtype: 'Text' - }, - { - fieldname: 'docstatus', fieldtype: 'Int', required: 1, default: 0 } ], - child_fields: [ + childFields: [ { fieldname: 'idx', fieldtype: 'Int', required: 1 }, @@ -9596,16 +9595,17 @@ var document$1 = class BaseDocument extends observable { } setStandardValues() { - let now = new Date(); - if (this.docstatus === null || this.docstatus === undefined) { - this.docstatus = 0; + // set standard values on server-side only + if (frappejs.isServer) { + let now = new Date(); + if (!this.submitted) this.submitted = 0; + if (!this.owner) { + this.owner = frappejs.session.user; + this.creation = now; + } + this.modifieldBy = frappejs.session.user; + this.modified = now; } - if (!this.owner) { - this.owner = frappejs.session.user; - this.creation = now; - } - this.modifieldBy = frappejs.session.user; - this.modified = now; } async load() { @@ -9646,6 +9646,30 @@ var document$1 = class BaseDocument extends observable { } } + async compareWithCurrentDoc() { + if (frappejs.isServer && !this._notInserted) { + let currentDoc = await frappejs.db.get(this.doctype, this.name); + + // check for conflict + if (currentDoc && this.modified != currentDoc.modified) { + throw new frappejs.errors.Conflict(frappejs._('Document {0} {1} has been modified after loading', [this.doctype, this.name])); + } + + if (this.submitted && !this.meta.isSubmittable) { + throw new frappejs.errors.ValidationError(frappejs._('Document type {1} is not submittable', [this.doctype])); + } + + // set submit action flag + if (this.submitted && !currentDoc.submitted) { + this.submitAction = true; + } + + if (currentDoc.submitted && !this.submitted) { + this.unSubmitAction = true; + } + } + } + async applyFormula() { if (!this.meta.hasFormula()) { return false; @@ -9687,20 +9711,25 @@ var document$1 = class BaseDocument extends observable { async insert() { await this.commit(); - await this.trigger('before_insert'); + await this.trigger('beforeInsert'); this.syncValues(await frappejs.db.insert(this.doctype, this.getValidDict())); - await this.trigger('after_insert'); - await this.trigger('after_save'); + await this.trigger('afterInsert'); + await this.trigger('afterSave'); return this; } async update() { + await this.compareWithCurrentDoc(); await this.commit(); - await this.trigger('before_update'); + await this.trigger('beforeUpdate'); + if (this.submitAction) this.trigger('beforeSubmit'); + if (this.unSubmitAction) this.trigger('beforeUnSubmit'); this.syncValues(await frappejs.db.update(this.doctype, this.getValidDict())); - await this.trigger('after_update'); - await this.trigger('after_save'); + await this.trigger('afterUpdate'); + await this.trigger('afterSave'); + if (this.submitAction) this.trigger('afterSubmit'); + if (this.unSubmitAction) this.trigger('afterUnSubmit'); return this; } @@ -9711,6 +9740,8 @@ var document$1 = class BaseDocument extends observable { await this.trigger('after_delete'); } + // trigger methods on the class if they match + // with the trigger name async trigger(event, params) { if (this[event]) { await this[event](params); @@ -9800,36 +9831,40 @@ var meta = class BaseMeta extends document$1 { } getValidFields({ withChildren = true } = {}) { - if (!this._valid_fields) { + if (!this._validFields) { - this._valid_fields = []; - this._valid_fields_withChildren = []; + this._validFields = []; + this._validFieldsWithChildren = []; const _add = (field) => { - this._valid_fields.push(field); - this._valid_fields_withChildren.push(field); + this._validFields.push(field); + this._validFieldsWithChildren.push(field); }; const doctype_fields = this.fields.map((field) => field.fieldname); // standard fields - for (let field of model.common_fields) { - if (frappejs.db.type_map[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { + for (let field of model.commonFields) { + if (frappejs.db.typeMap[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { _add(field); } } + if (this.isSubmittable) { + _add({fieldtype:'Check', fieldname: 'submitted', label: frappejs._('Submitted')}); + } + if (this.isChild) { // child fields - for (let field of model.child_fields) { - if (frappejs.db.type_map[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { + for (let field of model.childFields) { + if (frappejs.db.typeMap[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { _add(field); } } } else { // parent fields - for (let field of model.parent_fields) { - if (frappejs.db.type_map[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { + for (let field of model.parentFields) { + if (frappejs.db.typeMap[field.fieldtype] && !doctype_fields.includes(field.fieldname)) { _add(field); } } @@ -9837,7 +9872,7 @@ var meta = class BaseMeta extends document$1 { // doctype fields for (let field of this.fields) { - let include = frappejs.db.type_map[field.fieldtype]; + let include = frappejs.db.typeMap[field.fieldtype]; if (include) { _add(field); @@ -9845,15 +9880,15 @@ var meta = class BaseMeta extends document$1 { // include tables if (withChildren = True) if (!include && field.fieldtype === 'Table') { - this._valid_fields_withChildren.push(field); + this._validFieldsWithChildren.push(field); } } } if (withChildren) { - return this._valid_fields_withChildren; + return this._validFieldsWithChildren; } else { - return this._valid_fields; + return this._validFields; } } @@ -9893,14 +9928,15 @@ var meta = class BaseMeta extends document$1 { setDefaultIndicators() { if (!this.indicators) { - this.indicators = { - key: 'docstatus', - colors: { - 0: 'gray', - 1: 'blue', - 2: 'red' - } - }; + if (this.isSubmittable) { + this.indicators = { + key: 'submitted', + colors: { + 0: 'gray', + 1: 'blue' + } + }; + } } } @@ -9908,9 +9944,13 @@ var meta = class BaseMeta extends document$1 { if (frappejs.isDirty(this.name, doc.name)) { return 'orange'; } else { - let value = doc[this.indicators.key]; - if (value) { - return this.indicators.colors[value] || 'gray'; + if (this.indicators) { + let value = doc[this.indicators.key]; + if (value) { + return this.indicators.colors[value] || 'gray'; + } else { + return 'gray'; + } } else { return 'gray'; } @@ -10047,7 +10087,7 @@ var http = class HTTPClient extends observable { } initTypeMap() { - this.type_map = { + this.typeMap = { 'Currency': true , 'Int': true , 'Float': true @@ -26875,8 +26915,14 @@ var ui = { make_dropdown(label, parent, btn_class = 'btn-secondary') { return new dropdown({parent: parent, label:label, btn_class:btn_class}); - } + }, + showAlert({message, color='yellow', timeout=4}) { + let alert = this.add('div', 'alert alert-warning bottom-right-float', document.body); + alert.innerHTML = `${message}`; + frappejs.sleep(timeout).then(() => alert.remove()); + return alert; + } }; var router = class Router extends observable { @@ -27050,6 +27096,11 @@ var page = class Page extends observable { } } + addTitleBadge(message, title='', style='secondary') { + this.titleElement.innerHTML += ` + ${message}`; + } + hide() { this.parent.activePage = null; this.wrapper.classList.add('hide'); @@ -27206,9 +27257,11 @@ var list = class BaseList { } async getData() { + let fields = this.getFields(); + this.updateStandardFields(fields); return await frappejs.db.getAll({ doctype: this.doctype, - fields: this.getFields(), + fields: fields, filters: this.getFilters(), start: this.start, limit: this.pageLength + 1 @@ -27216,7 +27269,13 @@ var list = class BaseList { } getFields() { - return ['name']; + return []; + } + + updateStandardFields(fields) { + if (!fields.includes('name')) fields.push('name'); + if (!fields.includes('modified')) fields.push('modified'); + if (this.meta.isSubmittable && !fields.includes('submitted')) fields.push('submitted'); } async append() { @@ -27467,6 +27526,7 @@ class BaseControl { } else { this.setDocValue(); } + this.setDisabled(); } renderTemplate() { @@ -27516,10 +27576,12 @@ class BaseControl { } + isDisabled() { + return this.disabled || this.formula || (this.doc && this.doc.submitted); + } + setDisabled() { - if (this.disabled) { - this.input.disabled = true; - } + this.input.disabled = this.isDisabled(); } getInputParent() { @@ -41670,6 +41732,13 @@ class DateControl extends base { }); } + setDisabled() { + this.input.disabled = this.isDisabled(); + if (this.flatpickr && this.flatpickr.altInput) { + this.flatpickr.altInput.disabled = this.isDisabled(); + } + } + setInputValue(value) { super.setInputValue(value); this.flatpickr.setDate(value); @@ -42254,7 +42323,7 @@ class LinkControl extends base { formModal.form.doc.set('name', this.input.value); } - formModal.once('submit', async () => { + formModal.once('save', async () => { await this.updateDocValue(formModal.form.doc.name); }); } @@ -44167,127 +44236,56 @@ var clusterize = createCommonjsModule(function (module) { })); }); -var frappeDatatable = createCommonjsModule(function (module, exports) { -(function webpackUniversalModuleDefinition(root, factory) { - module.exports = factory(Sortable, clusterize); -})(typeof self !== 'undefined' ? self : commonjsGlobal, function(__WEBPACK_EXTERNAL_MODULE_7__, __WEBPACK_EXTERNAL_MODULE_10__) { -return /******/ (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; -/******/ -/******/ // 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 = 3); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { +var frappeDatatable_cjs = createCommonjsModule(function (module) { +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } -Object.defineProperty(exports, "__esModule", { - value: true -}); +var Sortable$$1 = _interopDefault(Sortable); +var Clusterize = _interopDefault(clusterize); -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -exports.default = $; function $(expr, con) { - return typeof expr === 'string' ? (con || document).querySelector(expr) : expr || null; + return typeof expr === 'string' ? + (con || document).querySelector(expr) : + expr || null; } -$.each = function (expr, con) { - return typeof expr === 'string' ? Array.from((con || document).querySelectorAll(expr)) : expr || null; +$.each = (expr, con) => { + return typeof expr === 'string' ? + Array.from((con || document).querySelectorAll(expr)) : + expr || null; }; -$.create = function (tag, o) { - var element = document.createElement(tag); +$.create = (tag, o) => { + let element = document.createElement(tag); - var _loop = function _loop(i) { - var val = o[i]; + for (let i in o) { + let val = o[i]; if (i === 'inside') { $(val).appendChild(element); - } else if (i === 'around') { - var ref = $(val); - ref.parentNode.insertBefore(element, ref); - element.appendChild(ref); - } else if (i === 'styles') { - if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object') { - Object.keys(val).map(function (prop) { - element.style[prop] = val[prop]; - }); - } - } else if (i in element) { - element[i] = val; - } else { - element.setAttribute(i, val); - } - }; - - for (var i in o) { - _loop(i); + } else + if (i === 'around') { + let ref = $(val); + ref.parentNode.insertBefore(element, ref); + element.appendChild(ref); + } else + if (i === 'styles') { + if (typeof val === 'object') { + Object.keys(val).map(prop => { + element.style[prop] = val[prop]; + }); + } + } else + if (i in element) { + element[i] = val; + } else { + element.setAttribute(i, val); + } } return element; }; -$.on = function (element, event, selector, callback) { +$.on = (element, event, selector, callback) => { if (!callback) { callback = selector; $.bind(element, event, callback); @@ -44296,19 +44294,19 @@ $.on = function (element, event, selector, callback) { } }; -$.off = function (element, event, handler) { +$.off = (element, event, handler) => { element.removeEventListener(event, handler); }; -$.bind = function (element, event, callback) { +$.bind = (element, event, callback) => { event.split(/\s+/).forEach(function (event) { element.addEventListener(event, callback); }); }; -$.delegate = function (element, event, selector, callback) { +$.delegate = (element, event, selector, callback) => { element.addEventListener(event, function (e) { - var delegatedTarget = e.target.closest(selector); + const delegatedTarget = e.target.closest(selector); if (delegatedTarget) { e.delegatedTarget = delegatedTarget; callback.call(this, e, delegatedTarget); @@ -44316,47 +44314,41 @@ $.delegate = function (element, event, selector, callback) { }); }; -$.unbind = function (element, o) { +$.unbind = (element, o) => { if (element) { - var _loop2 = function _loop2(event) { - var callback = o[event]; + for (let event in o) { + let callback = o[event]; event.split(/\s+/).forEach(function (event) { element.removeEventListener(event, callback); }); - }; - - for (var event in o) { - _loop2(event); } } }; -$.fire = function (target, type, properties) { - var evt = document.createEvent('HTMLEvents'); +$.fire = (target, type, properties) => { + let evt = document.createEvent('HTMLEvents'); evt.initEvent(type, true, true); - for (var j in properties) { + for (let j in properties) { evt[j] = properties[j]; } return target.dispatchEvent(evt); }; -$.data = function (element, attrs) { - // eslint-disable-line +$.data = (element, attrs) => { // eslint-disable-line if (!attrs) { return element.dataset; } - for (var attr in attrs) { + for (const attr in attrs) { element.dataset[attr] = attrs[attr]; } }; -$.style = function (elements, styleMap) { - // eslint-disable-line +$.style = (elements, styleMap) => { // eslint-disable-line if (typeof styleMap === 'string') { return $.getStyle(elements, styleMap); @@ -44366,14 +44358,14 @@ $.style = function (elements, styleMap) { elements = [elements]; } - elements.map(function (element) { - for (var prop in styleMap) { + elements.map(element => { + for (const prop in styleMap) { element.style[prop] = styleMap[prop]; } }); }; -$.removeStyle = function (elements, styleProps) { +$.removeStyle = (elements, styleProps) => { if (!Array.isArray(elements)) { elements = [elements]; } @@ -44382,36 +44374,15 @@ $.removeStyle = function (elements, styleProps) { styleProps = [styleProps]; } - elements.map(function (element) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = styleProps[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var prop = _step.value; - - element.style[prop] = ''; - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } + elements.map(element => { + for (const prop of styleProps) { + element.style[prop] = ''; } }); }; -$.getStyle = function (element, prop) { - var val = getComputedStyle(element)[prop]; +$.getStyle = (element, prop) => { + let val = getComputedStyle(element)[prop]; if (['width', 'height'].includes(prop)) { val = parseFloat(val); @@ -44420,7 +44391,7 @@ $.getStyle = function (element, prop) { return val; }; -$.closest = function (selector, element) { +$.closest = (selector, element) => { if (!element) return null; if (element.matches(selector)) { @@ -44430,147 +44401,584 @@ $.closest = function (selector, element) { return $.closest(selector, element.parentNode); }; -$.inViewport = function (el, parentEl) { - var _el$getBoundingClient = el.getBoundingClientRect(), - top = _el$getBoundingClient.top, - left = _el$getBoundingClient.left, - bottom = _el$getBoundingClient.bottom, - right = _el$getBoundingClient.right; - - var _parentEl$getBounding = parentEl.getBoundingClientRect(), - pTop = _parentEl$getBounding.top, - pLeft = _parentEl$getBounding.left, - pBottom = _parentEl$getBounding.bottom, - pRight = _parentEl$getBounding.right; +$.inViewport = (el, parentEl) => { + const { top, left, bottom, right } = el.getBoundingClientRect(); + const { top: pTop, left: pLeft, bottom: pBottom, right: pRight } = parentEl.getBoundingClientRect(); return top >= pTop && left >= pLeft && bottom <= pBottom && right <= pRight; }; $.scrollTop = function scrollTop(element, pixels) { - requestAnimationFrame(function () { + requestAnimationFrame(() => { element.scrollTop = pixels; }); }; -module.exports = exports['default']; -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.camelCaseToDash = camelCaseToDash; -exports.makeDataAttributeString = makeDataAttributeString; -exports.getDefault = getDefault; -exports.escapeRegExp = escapeRegExp; -exports.getCSSString = getCSSString; -exports.getCSSRuleBlock = getCSSRuleBlock; -exports.buildCSSRule = buildCSSRule; -exports.removeCSSRule = removeCSSRule; -exports.copyTextToClipboard = copyTextToClipboard; -exports.isNumeric = isNumeric; -exports.throttle = throttle; -exports.promisify = promisify; -exports.chainPromises = chainPromises; -exports.linkProperties = linkProperties; -function camelCaseToDash(str) { - return str.replace(/([A-Z])/g, function (g) { - return '-' + g[0].toLowerCase(); +var isObject_1 = isObject; + +var commonjsGlobal$$1 = typeof window !== 'undefined' ? window : typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof self !== 'undefined' ? self : {}; + +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof commonjsGlobal$$1 == 'object' && commonjsGlobal$$1 && commonjsGlobal$$1.Object === Object && commonjsGlobal$$1; + +var _freeGlobal = freeGlobal; + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = _freeGlobal || freeSelf || Function('return this')(); + +var _root = root; + +/** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ +var now = function() { + return _root.Date.now(); +}; + +var now_1 = now; + +/** Built-in value references. */ +var Symbol = _root.Symbol; + +var _Symbol = Symbol; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Built-in value references. */ +var symToStringTag = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +var _getRawTag = getRawTag; + +/** Used for built-in method references. */ +var objectProto$1 = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString$1 = objectProto$1.toString; + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString$1.call(value); +} + +var _objectToString = objectToString; + +/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + +/** Built-in value references. */ +var symToStringTag$1 = _Symbol ? _Symbol.toStringTag : undefined; + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag$1 && symToStringTag$1 in Object(value)) + ? _getRawTag(value) + : _objectToString(value); +} + +var _baseGetTag = baseGetTag; + +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +var isObjectLike_1 = isObjectLike; + +/** `Object#toString` result references. */ +var symbolTag = '[object Symbol]'; + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike_1(value) && _baseGetTag(value) == symbolTag); +} + +var isSymbol_1 = isSymbol; + +/** Used as references for various `Number` constants. */ +var NAN = 0 / 0; + +/** Used to match leading and trailing whitespace. */ +var reTrim = /^\s+|\s+$/g; + +/** Used to detect bad signed hexadecimal string values. */ +var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + +/** Used to detect binary string values. */ +var reIsBinary = /^0b[01]+$/i; + +/** Used to detect octal string values. */ +var reIsOctal = /^0o[0-7]+$/i; + +/** Built-in method references without a dependency on `root`. */ +var freeParseInt = parseInt; + +/** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ +function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol_1(value)) { + return NAN; + } + if (isObject_1(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject_1(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); +} + +var toNumber_1 = toNumber; + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ +function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber_1(wait) || 0; + if (isObject_1(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber_1(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now_1(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now_1()); + } + + function debounced() { + var time = now_1(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; +} + +var debounce_1 = debounce; + +/** Error message constants. */ +var FUNC_ERROR_TEXT$1 = 'Expected a function'; + +/** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ +function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT$1); + } + if (isObject_1(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce_1(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing }); } +var throttle_1 = throttle; + +function camelCaseToDash(str) { + return str.replace(/([A-Z])/g, (g) => `-${g[0].toLowerCase()}`); +} + function makeDataAttributeString(props) { - var keys = Object.keys(props); + const keys = Object.keys(props); - return keys.map(function (key) { - var _key = camelCaseToDash(key); - var val = props[key]; + return keys + .map((key) => { + const _key = camelCaseToDash(key); + const val = props[key]; - if (val === undefined) return ''; - return 'data-' + _key + '="' + val + '" '; - }).join('').trim(); + if (val === undefined) return ''; + return `data-${_key}="${val}" `; + }) + .join('') + .trim(); } function getDefault(a, b) { return a !== undefined ? a : b; } -function escapeRegExp(str) { - // https://stackoverflow.com/a/6969486 - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); -} - -function getCSSString(styleMap) { - var style = ''; - - for (var prop in styleMap) { - if (styleMap.hasOwnProperty(prop)) { - style += prop + ': ' + styleMap[prop] + '; '; - } - } - - return style.trim(); -} - -function getCSSRuleBlock(rule, styleMap) { - return rule + ' { ' + getCSSString(styleMap) + ' }'; -} - -function buildCSSRule(rule, styleMap) { - var cssRulesString = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; - - // build css rules efficiently, - // append new rule if doesnt exist, - // update existing ones - - var rulePatternStr = escapeRegExp(rule) + ' {([^}]*)}'; - var rulePattern = new RegExp(rulePatternStr, 'g'); - - if (cssRulesString && cssRulesString.match(rulePattern)) { - var _loop = function _loop(property) { - var value = styleMap[property]; - var propPattern = new RegExp(escapeRegExp(property) + ':([^;]*);'); - - cssRulesString = cssRulesString.replace(rulePattern, function (match, propertyStr) { - if (propertyStr.match(propPattern)) { - // property exists, replace value with new value - propertyStr = propertyStr.replace(propPattern, function (match, valueStr) { - return property + ': ' + value + ';'; - }); - } - propertyStr = propertyStr.trim(); - - var replacer = rule + ' { ' + propertyStr + ' }'; - - return replacer; - }); - }; - - for (var property in styleMap) { - _loop(property); - } - - return cssRulesString; - } - // no match, append new rule block - return '' + cssRulesString + getCSSRuleBlock(rule, styleMap); -} - -function removeCSSRule(rule) { - var cssRulesString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; - - var rulePatternStr = escapeRegExp(rule) + ' {([^}]*)}'; - var rulePattern = new RegExp(rulePatternStr, 'g'); - var output = cssRulesString; - - if (cssRulesString && cssRulesString.match(rulePattern)) { - output = cssRulesString.replace(rulePattern, ''); - } - - return output.trim(); -} - function copyTextToClipboard(text) { // https://stackoverflow.com/a/30810322/5353542 var textArea = document.createElement('textarea'); @@ -44630,68 +45038,24 @@ function isNumeric(val) { return !isNaN(val); } -// https://stackoverflow.com/a/27078401 -function throttle(func, wait, options) { - var context, args, result; - var timeout = null; - var previous = 0; - if (!options) options = {}; +let throttle$1 = throttle_1; - var later = function later() { - previous = options.leading === false ? 0 : Date.now(); - timeout = null; - result = func.apply(context, args); - if (!timeout) context = args = null; - }; +let debounce$1 = debounce_1; - return function () { - var now = Date.now(); - if (!previous && options.leading === false) previous = now; - var remaining = wait - (now - previous); - context = this; - args = arguments; - if (remaining <= 0 || remaining > wait) { - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - previous = now; - result = func.apply(context, args); - if (!timeout) context = args = null; - } else if (!timeout && options.trailing !== false) { - timeout = setTimeout(later, remaining); - } - return result; - }; -} - -function promisify(fn) { - var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - - return function () { - for (var _len = arguments.length, args = Array(_len), _key2 = 0; _key2 < _len; _key2++) { - args[_key2] = arguments[_key2]; - } - - return new Promise(function (resolve) { - setTimeout(function () { - fn.apply(context, args); - resolve('done', fn.name); +function promisify(fn, context = null) { + return (...args) => { + return new Promise(resolve => { + setTimeout(() => { + const out = fn.apply(context, args); + resolve(out); }, 0); }); }; } - -function chainPromises(promises) { - return promises.reduce(function (prev, cur) { - return prev.then(cur); - }, Promise.resolve()); -} - function linkProperties(target, source, properties) { - var props = properties.reduce(function (acc, prop) { + const props = properties.reduce((acc, prop) => { acc[prop] = { - get: function get() { + get() { return source[prop]; } }; @@ -44700,999 +45064,220 @@ function linkProperties(target, source, properties) { Object.defineProperties(target, props); } -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getDropdownHTML = undefined; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _dom = __webpack_require__(0); - -var _dom2 = _interopRequireDefault(_dom); - -var _sortablejs = __webpack_require__(7); - -var _sortablejs2 = _interopRequireDefault(_sortablejs); - -var _utils = __webpack_require__(1); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var ColumnManager = function () { - function ColumnManager(instance) { - _classCallCheck(this, ColumnManager); - - this.instance = instance; - - (0, _utils.linkProperties)(this, this.instance, ['options', 'fireEvent', 'header', 'datamanager', 'style', 'wrapper', 'rowmanager', 'bodyScrollable']); - - this.bindEvents(); - exports.getDropdownHTML = getDropdownHTML = getDropdownHTML.bind(this, this.options.dropdownButton); - } - - _createClass(ColumnManager, [{ - key: 'renderHeader', - value: function renderHeader() { - this.header.innerHTML = ''; - this.refreshHeader(); - } - }, { - key: 'refreshHeader', - value: function refreshHeader() { - var _this = this; - - var columns = this.datamanager.getColumns(); - - if (!(0, _dom2.default)('.data-table-col', this.header)) { - // insert html - (0, _dom2.default)('thead', this.header).innerHTML = this.rowmanager.getRowHTML(columns, { isHeader: 1 }); - } else { - // refresh dom state - var $cols = _dom2.default.each('.data-table-col', this.header); - if (columns.length < $cols.length) { - // deleted column - (0, _dom2.default)('thead', this.header).innerHTML = this.rowmanager.getRowHTML(columns, { isHeader: 1 }); - return; - } - - $cols.map(function ($col, i) { - var column = columns[i]; - // column sorted or order changed - // update colIndex of each header cell - _dom2.default.data($col, { - colIndex: column.colIndex - }); - - // refresh sort indicator - var sortIndicator = (0, _dom2.default)('.sort-indicator', $col); - if (sortIndicator) { - sortIndicator.innerHTML = _this.options.sortIndicator[column.sortOrder]; - } - }); - } - // reset columnMap - this.$columnMap = []; - } - }, { - key: 'bindEvents', - value: function bindEvents() { - this.bindDropdown(); - this.bindResizeColumn(); - this.bindMoveColumn(); - } - }, { - key: 'bindDropdown', - value: function bindDropdown() { - var _this2 = this; - - var $activeDropdown = void 0; - _dom2.default.on(this.header, 'click', '.data-table-dropdown-toggle', function (e, $button) { - var $dropdown = _dom2.default.closest('.data-table-dropdown', $button); - - if (!$dropdown.classList.contains('is-active')) { - deactivateDropdown(); - $dropdown.classList.add('is-active'); - $activeDropdown = $dropdown; - } else { - deactivateDropdown(); - } - }); - - _dom2.default.on(document.body, 'click', function (e) { - if (e.target.matches('.data-table-dropdown-toggle')) return; - deactivateDropdown(); - }); - - var dropdownItems = this.options.headerDropdown; - - _dom2.default.on(this.header, 'click', '.data-table-dropdown-list > div', function (e, $item) { - var $col = _dom2.default.closest('.data-table-col', $item); - - var _$$data = _dom2.default.data($item), - index = _$$data.index; - - var _$$data2 = _dom2.default.data($col), - colIndex = _$$data2.colIndex; - - var callback = dropdownItems[index].action; - - callback && callback.call(_this2.instance, _this2.getColumn(colIndex)); - }); - - function deactivateDropdown(e) { - $activeDropdown && $activeDropdown.classList.remove('is-active'); - $activeDropdown = null; - } - } - }, { - key: 'bindResizeColumn', - value: function bindResizeColumn() { - var _this3 = this; - - var isDragging = false; - var $resizingCell = void 0, - startWidth = void 0, - startX = void 0; - - _dom2.default.on(this.header, 'mousedown', '.data-table-col .column-resizer', function (e, $handle) { - document.body.classList.add('data-table-resize'); - var $cell = $handle.parentNode.parentNode; - $resizingCell = $cell; - - var _$$data3 = _dom2.default.data($resizingCell), - colIndex = _$$data3.colIndex; - - var col = _this3.getColumn(colIndex); - - if (col && col.resizable === false) { - return; - } - - isDragging = true; - startWidth = _dom2.default.style((0, _dom2.default)('.content', $resizingCell), 'width'); - startX = e.pageX; - }); - - _dom2.default.on(document.body, 'mouseup', function (e) { - document.body.classList.remove('data-table-resize'); - if (!$resizingCell) return; - isDragging = false; - - var _$$data4 = _dom2.default.data($resizingCell), - colIndex = _$$data4.colIndex; - - _this3.setColumnWidth(colIndex); - _this3.style.setBodyStyle(); - $resizingCell = null; - }); - - _dom2.default.on(document.body, 'mousemove', function (e) { - if (!isDragging) return; - var finalWidth = startWidth + (e.pageX - startX); - - var _$$data5 = _dom2.default.data($resizingCell), - colIndex = _$$data5.colIndex; - - if (_this3.getColumnMinWidth(colIndex) > finalWidth) { - // don't resize past minWidth - return; - } - _this3.datamanager.updateColumn(colIndex, { width: finalWidth }); - _this3.setColumnHeaderWidth(colIndex); - }); - } - }, { - key: 'bindMoveColumn', - value: function bindMoveColumn() { - var _this4 = this; - - var initialized = void 0; - - var initialize = function initialize() { - if (initialized) { - _dom2.default.off(document.body, 'mousemove', initialize); - return; - } - var ready = (0, _dom2.default)('.data-table-col', _this4.header); - if (!ready) return; - - var $parent = (0, _dom2.default)('.data-table-row', _this4.header); - - _this4.sortable = _sortablejs2.default.create($parent, { - onEnd: function onEnd(e) { - var oldIndex = e.oldIndex, - newIndex = e.newIndex; - - var $draggedCell = e.item; - - var _$$data6 = _dom2.default.data($draggedCell), - colIndex = _$$data6.colIndex; - - if (+colIndex === newIndex) return; - - _this4.switchColumn(oldIndex, newIndex); - }, - preventOnFilter: false, - filter: '.column-resizer, .data-table-dropdown', - animation: 150 - }); - }; - - _dom2.default.on(document.body, 'mousemove', initialize); - } - }, { - key: 'bindSortColumn', - value: function bindSortColumn() { - var _this5 = this; - - _dom2.default.on(this.header, 'click', '.data-table-col .column-title', function (e, span) { - var $cell = span.closest('.data-table-col'); - - var _$$data7 = _dom2.default.data($cell), - colIndex = _$$data7.colIndex, - sortOrder = _$$data7.sortOrder; - - sortOrder = (0, _utils.getDefault)(sortOrder, 'none'); - var col = _this5.getColumn(colIndex); - - if (col && col.sortable === false) { - return; - } - - // reset sort indicator - (0, _dom2.default)('.sort-indicator', _this5.header).textContent = ''; - _dom2.default.each('.data-table-col', _this5.header).map(function ($cell) { - _dom2.default.data($cell, { - sortOrder: 'none' - }); - }); - - var nextSortOrder = void 0, - textContent = void 0; - if (sortOrder === 'none') { - nextSortOrder = 'asc'; - textContent = '▲'; - } else if (sortOrder === 'asc') { - nextSortOrder = 'desc'; - textContent = '▼'; - } else if (sortOrder === 'desc') { - nextSortOrder = 'none'; - textContent = ''; - } - - _dom2.default.data($cell, { - sortOrder: nextSortOrder - }); - (0, _dom2.default)('.sort-indicator', $cell).textContent = textContent; - - _this5.sortColumn(colIndex, nextSortOrder); - }); - } - }, { - key: 'sortColumn', - value: function sortColumn(colIndex, nextSortOrder) { - var _this6 = this; - - this.instance.freeze(); - this.sortRows(colIndex, nextSortOrder).then(function () { - _this6.refreshHeader(); - return _this6.rowmanager.refreshRows(); - }).then(function () { - return _this6.instance.unfreeze(); - }).then(function () { - _this6.fireEvent('onSortColumn', _this6.getColumn(colIndex)); - }); - } - }, { - key: 'removeColumn', - value: function removeColumn(colIndex) { - var _this7 = this; - - var removedCol = this.getColumn(colIndex); - this.instance.freeze(); - this.datamanager.removeColumn(colIndex).then(function () { - _this7.refreshHeader(); - return _this7.rowmanager.refreshRows(); - }).then(function () { - return _this7.instance.unfreeze(); - }).then(function () { - _this7.fireEvent('onRemoveColumn', removedCol); - }); - } - }, { - key: 'switchColumn', - value: function switchColumn(oldIndex, newIndex) { - var _this8 = this; - - this.instance.freeze(); - this.datamanager.switchColumn(oldIndex, newIndex).then(function () { - _this8.refreshHeader(); - return _this8.rowmanager.refreshRows(); - }).then(function () { - _this8.setColumnWidth(oldIndex); - _this8.setColumnWidth(newIndex); - _this8.instance.unfreeze(); - }).then(function () { - _this8.fireEvent('onSwitchColumn', _this8.getColumn(oldIndex), _this8.getColumn(newIndex)); - }); - } - }, { - key: 'sortRows', - value: function sortRows(colIndex, sortOrder) { - return this.datamanager.sortRows(colIndex, sortOrder); - } - }, { - key: 'getColumn', - value: function getColumn(colIndex) { - return this.datamanager.getColumn(colIndex); - } - }, { - key: 'getColumns', - value: function getColumns() { - return this.datamanager.getColumns(); - } - }, { - key: 'setColumnWidth', - value: function setColumnWidth(colIndex) { - colIndex = +colIndex; - this._columnWidthMap = this._columnWidthMap || []; - - var _getColumn = this.getColumn(colIndex), - width = _getColumn.width; - - var index = this._columnWidthMap[colIndex]; - var selector = '[data-col-index="' + colIndex + '"] .content, [data-col-index="' + colIndex + '"] .edit-cell'; - var styles = { - width: width + 'px' - }; - - index = this.style.setStyle(selector, styles, index); - this._columnWidthMap[colIndex] = index; - } - }, { - key: 'setColumnHeaderWidth', - value: function setColumnHeaderWidth(colIndex) { - colIndex = +colIndex; - this.$columnMap = this.$columnMap || []; - var selector = '[data-col-index="' + colIndex + '"][data-is-header] .content'; - - var _getColumn2 = this.getColumn(colIndex), - width = _getColumn2.width; - - var $column = this.$columnMap[colIndex]; - if (!$column) { - $column = this.header.querySelector(selector); - this.$columnMap[colIndex] = $column; - } - - $column.style.width = width + 'px'; - } - }, { - key: 'getColumnMinWidth', - value: function getColumnMinWidth(colIndex) { - colIndex = +colIndex; - return this.getColumn(colIndex).minWidth || 24; - } - }, { - key: 'getFirstColumnIndex', - value: function getFirstColumnIndex() { - if (this.options.addCheckboxColumn && this.options.addSerialNoColumn) { - return 2; - } - - if (this.options.addCheckboxColumn || this.options.addSerialNoColumn) { - return 1; - } - - return 0; - } - }, { - key: 'getHeaderCell$', - value: function getHeaderCell$(colIndex) { - return (0, _dom2.default)('.data-table-col[data-col-index="' + colIndex + '"]', this.header); - } - }, { - key: 'getLastColumnIndex', - value: function getLastColumnIndex() { - return this.datamanager.getColumnCount() - 1; - } - }, { - key: 'getSerialColumnIndex', - value: function getSerialColumnIndex() { - var columns = this.datamanager.getColumns(); - - return columns.findIndex(function (column) { - return column.content.includes('Sr. No'); - }); - } - }]); - - return ColumnManager; -}(); - -// eslint-disable-next-line - - -exports.default = ColumnManager; -var getDropdownHTML = function getDropdownHTML() { - var dropdownButton = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'v'; - - // add dropdown buttons - var dropdownItems = this.options.headerDropdown; - - return '
' + dropdownButton + '
\n
\n ' + dropdownItems.map(function (d, i) { - return '
' + d.label + '
'; - }).join('') + '\n
\n '; -}; - -exports.getDropdownHTML = getDropdownHTML; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _datatable = __webpack_require__(4); - -var _datatable2 = _interopRequireDefault(_datatable); - -var _package = __webpack_require__(19); - -var _package2 = _interopRequireDefault(_package); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -_datatable2.default.__version__ = _package2.default.version; - -exports.default = _datatable2.default; -module.exports = exports['default']; - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _dom = __webpack_require__(0); - -var _dom2 = _interopRequireDefault(_dom); - -var _datamanager = __webpack_require__(5); - -var _datamanager2 = _interopRequireDefault(_datamanager); - -var _cellmanager = __webpack_require__(6); - -var _cellmanager2 = _interopRequireDefault(_cellmanager); - -var _columnmanager = __webpack_require__(2); - -var _columnmanager2 = _interopRequireDefault(_columnmanager); - -var _rowmanager = __webpack_require__(8); - -var _rowmanager2 = _interopRequireDefault(_rowmanager); - -var _bodyRenderer = __webpack_require__(9); - -var _bodyRenderer2 = _interopRequireDefault(_bodyRenderer); - -var _style = __webpack_require__(11); - -var _style2 = _interopRequireDefault(_style); - -var _keyboard = __webpack_require__(12); - -var _keyboard2 = _interopRequireDefault(_keyboard); - -var _defaults = __webpack_require__(13); - -var _defaults2 = _interopRequireDefault(_defaults); - -__webpack_require__(14); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var DataTable = function () { - function DataTable(wrapper, options) { - _classCallCheck(this, DataTable); - - DataTable.instances++; - - if (typeof wrapper === 'string') { - // css selector - wrapper = document.querySelector(wrapper); - } - this.wrapper = wrapper; - if (!(this.wrapper instanceof HTMLElement)) { - throw new Error('Invalid argument given for `wrapper`'); - } - - this.options = Object.assign({}, _defaults2.default, options); - this.options.headerDropdown = _defaults2.default.headerDropdown.concat(options.headerDropdown || []); - // custom user events - this.events = Object.assign({}, _defaults2.default.events, options.events || {}); - this.fireEvent = this.fireEvent.bind(this); - - this.prepare(); - - this.style = new _style2.default(this); - this.keyboard = new _keyboard2.default(this.wrapper); - this.datamanager = new _datamanager2.default(this.options); - this.rowmanager = new _rowmanager2.default(this); - this.columnmanager = new _columnmanager2.default(this); - this.cellmanager = new _cellmanager2.default(this); - this.bodyRenderer = new _bodyRenderer2.default(this); - - if (this.options.data) { - this.refresh(); - } - } - - _createClass(DataTable, [{ - key: 'prepare', - value: function prepare() { - this.prepareDom(); - this.unfreeze(); - } - }, { - key: 'prepareDom', - value: function prepareDom() { - this.wrapper.innerHTML = '\n
\n \n
\n
\n
\n
\n ' + this.options.freezeMessage + '\n
\n \n
\n '; - - this.datatableWrapper = (0, _dom2.default)('.data-table', this.wrapper); - this.header = (0, _dom2.default)('.data-table-header', this.wrapper); - this.bodyScrollable = (0, _dom2.default)('.body-scrollable', this.wrapper); - this.freezeContainer = (0, _dom2.default)('.freeze-container', this.wrapper); - } - }, { - key: 'refresh', - value: function refresh(data) { - this.datamanager.init(data); - this.render(); - this.setDimensions(); - } - }, { - key: 'destroy', - value: function destroy() { - this.wrapper.innerHTML = ''; - this.style.destroy(); - } - }, { - key: 'appendRows', - value: function appendRows(rows) { - this.datamanager.appendRows(rows); - this.rowmanager.refreshRows(); - } - }, { - key: 'refreshRow', - value: function refreshRow(row, rowIndex) { - this.rowmanager.refreshRow(row, rowIndex); - } - }, { - key: 'render', - value: function render() { - this.renderHeader(); - this.renderBody(); - } - }, { - key: 'renderHeader', - value: function renderHeader() { - this.columnmanager.renderHeader(); - } - }, { - key: 'renderBody', - value: function renderBody() { - this.bodyRenderer.render(); - } - }, { - key: 'setDimensions', - value: function setDimensions() { - this.style.setDimensions(); - } - }, { - key: 'getColumn', - value: function getColumn(colIndex) { - return this.datamanager.getColumn(colIndex); - } - }, { - key: 'getColumns', - value: function getColumns() { - return this.datamanager.getColumns(); - } - }, { - key: 'getRows', - value: function getRows() { - return this.datamanager.getRows(); - } - }, { - key: 'getCell', - value: function getCell(colIndex, rowIndex) { - return this.datamanager.getCell(colIndex, rowIndex); - } - }, { - key: 'getColumnHeaderElement', - value: function getColumnHeaderElement(colIndex) { - return this.columnmanager.getColumnHeaderElement(colIndex); - } - }, { - key: 'getViewportHeight', - value: function getViewportHeight() { - if (!this.viewportHeight) { - this.viewportHeight = _dom2.default.style(this.bodyScrollable, 'height'); - } - - return this.viewportHeight; - } - }, { - key: 'sortColumn', - value: function sortColumn(colIndex, sortOrder) { - this.columnmanager.sortColumn(colIndex, sortOrder); - } - }, { - key: 'removeColumn', - value: function removeColumn(colIndex) { - this.columnmanager.removeColumn(colIndex); - } - }, { - key: 'scrollToLastColumn', - value: function scrollToLastColumn() { - this.datatableWrapper.scrollLeft = 9999; - } - }, { - key: 'freeze', - value: function freeze() { - _dom2.default.style(this.freezeContainer, { - display: '' - }); - } - }, { - key: 'unfreeze', - value: function unfreeze() { - _dom2.default.style(this.freezeContainer, { - display: 'none' - }); - } - }, { - key: 'fireEvent', - value: function fireEvent(eventName) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - this.events[eventName].apply(this, args); - } - }, { - key: 'log', - value: function log() { - if (this.options.enableLogs) { - console.log.apply(console, arguments); - } - } - }]); - - return DataTable; -}(); - -DataTable.instances = 0; - -exports.default = DataTable; -module.exports = exports['default']; - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.DataError = undefined; - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _utils = __webpack_require__(1); - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -function _extendableBuiltin(cls) { - function ExtendableBuiltin() { - var instance = Reflect.construct(cls, Array.from(arguments)); - Object.setPrototypeOf(instance, Object.getPrototypeOf(this)); - return instance; - } - - ExtendableBuiltin.prototype = Object.create(cls.prototype, { - constructor: { - value: cls, - enumerable: false, - writable: true, - configurable: true - } - }); - - if (Object.setPrototypeOf) { - Object.setPrototypeOf(ExtendableBuiltin, cls); - } else { - ExtendableBuiltin.__proto__ = cls; - } - - return ExtendableBuiltin; -} - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var DataManager = function () { - function DataManager(options) { - _classCallCheck(this, DataManager); - +class DataManager { + constructor(options) { this.options = options; - this.sortRows = (0, _utils.promisify)(this.sortRows, this); - this.switchColumn = (0, _utils.promisify)(this.switchColumn, this); - this.removeColumn = (0, _utils.promisify)(this.removeColumn, this); + this.sortRows = promisify(this.sortRows, this); + this.switchColumn = promisify(this.switchColumn, this); + this.removeColumn = promisify(this.removeColumn, this); + this.filterRows = promisify(this.filterRows, this); } - _createClass(DataManager, [{ - key: 'init', - value: function init(data) { - if (!data) { - data = this.options.data; - } - - this.data = data; - - this.rowCount = 0; - this.columns = []; - this.rows = []; - - this.prepareColumns(); - this.prepareRows(); - - this.prepareNumericColumns(); + init(data) { + if (!data) { + data = this.options.data; } - // computed property + this.data = data; - }, { - key: 'prepareColumns', - value: function prepareColumns() { - this.columns = []; - this.validateColumns(); - this.prepareDefaultColumns(); - this.prepareHeader(); + this.rowCount = 0; + this.columns = []; + this.rows = []; + + this.prepareColumns(); + this.prepareRows(); + + this.prepareNumericColumns(); + } + + // computed property + get currentSort() { + const col = this.columns.find(col => col.sortOrder !== 'none'); + return col || { + colIndex: -1, + sortOrder: 'none' + }; + } + + prepareColumns() { + this.columns = []; + this.validateColumns(); + this.prepareDefaultColumns(); + this.prepareHeader(); + } + + prepareDefaultColumns() { + if (this.options.addCheckboxColumn && !this.hasColumnById('_checkbox')) { + const cell = { + id: '_checkbox', + content: this.getCheckboxHTML(), + editable: false, + resizable: false, + sortable: false, + focusable: false, + dropdown: false, + width: 25 + }; + this.columns.push(cell); } - }, { - key: 'prepareDefaultColumns', - value: function prepareDefaultColumns() { - if (this.options.addCheckboxColumn && !this.hasColumnById('_checkbox')) { - var cell = { - id: '_checkbox', - content: this.getCheckboxHTML(), - editable: false, - resizable: false, - sortable: false, - focusable: false, - dropdown: false, - width: 25 - }; - this.columns.push(cell); - } - if (this.options.addSerialNoColumn && !this.hasColumnById('_rowIndex')) { - var _cell = { - id: '_rowIndex', - content: '', - align: 'center', - editable: false, - resizable: false, - focusable: false, - dropdown: false, - width: 30 - }; - - this.columns.push(_cell); - } - } - }, { - key: 'prepareRow', - value: function prepareRow(row, i) { - var _this = this; - - var baseRowCell = { - rowIndex: i + if (this.options.addSerialNoColumn && !this.hasColumnById('_rowIndex')) { + let cell = { + id: '_rowIndex', + content: '', + align: 'center', + editable: false, + resizable: false, + focusable: false, + dropdown: false }; - return row.map(function (cell, i) { - return _this.prepareCell(cell, i); - }).map(function (cell) { - return Object.assign({}, baseRowCell, cell); - }); + this.columns.push(cell); } - }, { - key: 'prepareHeader', - value: function prepareHeader() { - var _this2 = this; + } - var columns = this.columns.concat(this.options.columns); - var baseCell = { - isHeader: 1, - editable: true, - sortable: true, - resizable: true, - focusable: true, - dropdown: true, - width: null, - format: function format(value) { - if (value === null || value === undefined) { - return ''; - } - return value + ''; + prepareRow(row, i) { + const baseRowCell = { + rowIndex: i + }; + + return row + .map((cell, i) => this.prepareCell(cell, i)) + .map(cell => Object.assign({}, baseRowCell, cell)); + } + + prepareHeader() { + let columns = this.columns.concat(this.options.columns); + const baseCell = { + isHeader: 1, + editable: true, + sortable: true, + resizable: true, + focusable: true, + dropdown: true, + width: null, + format: (value) => { + if (value === null || value === undefined) { + return ''; } - }; + return value + ''; + } + }; - this.columns = columns.map(function (cell, i) { - return _this2.prepareCell(cell, i); - }).map(function (col) { - return Object.assign({}, baseCell, col); - }).map(function (col) { + this.columns = columns + .map((cell, i) => this.prepareCell(cell, i)) + .map(col => Object.assign({}, baseCell, col)) + .map(col => { col.id = col.id || col.content; return col; }); - } - }, { - key: 'prepareCell', - value: function prepareCell(content, i) { - var cell = { - content: '', - align: 'left', - sortOrder: 'none', - colIndex: i, - column: this.columns[i] - }; + } + + prepareCell(content, i) { + const cell = { + content: '', + align: 'left', + sortOrder: 'none', + colIndex: i, + column: this.columns[i] + }; + + if (content !== null && typeof content === 'object') { + // passed as column/header + Object.assign(cell, content); + } else { + cell.content = content; + } + + return cell; + } + + prepareNumericColumns() { + const row0 = this.getRow(0); + if (!row0) return; + this.columns = this.columns.map((column, i) => { + + const cellValue = row0[i].content; + if (!column.align && cellValue && isNumeric(cellValue)) { + column.align = 'right'; + } + + return column; + }); + } + + prepareRows() { + this.validateData(this.data); + + this.rows = this.data.map((d, i) => { + const index = this._getNextRowCount(); + + let row = []; + + if (Array.isArray(d)) { + // row is an array + if (this.options.addCheckboxColumn) { + row.push(this.getCheckboxHTML()); + } + if (this.options.addSerialNoColumn) { + row.push((index + 1) + ''); + } + row = row.concat(d); + + while (row.length < this.columns.length) { + row.push(''); + } - if (content !== null && (typeof content === 'undefined' ? 'undefined' : _typeof(content)) === 'object') { - // passed as column/header - Object.assign(cell, content); } else { - cell.content = content; - } - - return cell; - } - }, { - key: 'prepareNumericColumns', - value: function prepareNumericColumns() { - var row0 = this.getRow(0); - if (!row0) return; - this.columns = this.columns.map(function (column, i) { - - var cellValue = row0[i].content; - if (!column.align && cellValue && (0, _utils.isNumeric)(cellValue)) { - column.align = 'right'; - } - - return column; - }); - } - }, { - key: 'prepareRows', - value: function prepareRows() { - var _this3 = this; - - this.validateData(this.data); - - this.rows = this.data.map(function (d, i) { - var index = _this3._getNextRowCount(); - - var row = []; - - if (Array.isArray(d)) { - // row is an array - if (_this3.options.addCheckboxColumn) { - row.push(_this3.getCheckboxHTML()); - } - if (_this3.options.addSerialNoColumn) { - row.push(index + 1 + ''); - } - row = row.concat(d); - - while (row.length < _this3.columns.length) { - row.push(''); - } - } else { - // row is a dict - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = _this3.columns[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var col = _step.value; - - if (col.id === '_checkbox') { - row.push(_this3.getCheckboxHTML()); - } else if (col.id === '_rowIndex') { - row.push(index + 1 + ''); - } else { - row.push(col.format(d[col.id])); - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } + // row is a dict + for (let col of this.columns) { + if (col.id === '_checkbox') { + row.push(this.getCheckboxHTML()); + } else if (col.id === '_rowIndex') { + row.push((index + 1) + ''); + } else { + row.push(d[col.id]); } } - - return _this3.prepareRow(row, index); - }); - } - }, { - key: 'validateColumns', - value: function validateColumns() { - var columns = this.options.columns; - if (!Array.isArray(columns)) { - throw new DataError('`columns` must be an array'); } - columns.forEach(function (column, i) { - if (typeof column !== 'string' && (typeof column === 'undefined' ? 'undefined' : _typeof(column)) !== 'object') { - throw new DataError('column "' + i + '" must be a string or an object'); - } - }); + return this.prepareRow(row, index); + }); + } + + validateColumns() { + const columns = this.options.columns; + if (!Array.isArray(columns)) { + throw new DataError('`columns` must be an array'); } - }, { - key: 'validateData', - value: function validateData(data) { - if (Array.isArray(data) && (data.length === 0 || Array.isArray(data[0]) || _typeof(data[0]) === 'object')) { - return true; + + columns.forEach((column, i) => { + if (typeof column !== 'string' && typeof column !== 'object') { + throw new DataError(`column "${i}" must be a string or an object`); } - throw new DataError('`data` must be an array of arrays or objects'); + }); + } + + validateData(data) { + if (Array.isArray(data) && + (data.length === 0 || Array.isArray(data[0]) || typeof data[0] === 'object')) { + return true; } - }, { - key: 'appendRows', - value: function appendRows(rows) { - this.validateData(rows); + throw new DataError('`data` must be an array of arrays or objects'); + } - this.rows = this.rows.concat(this.prepareRows(rows)); - } - }, { - key: 'sortRows', - value: function sortRows(colIndex) { - var sortOrder = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'none'; + appendRows(rows) { + this.validateData(rows); - colIndex = +colIndex; + this.rows = this.rows.concat(this.prepareRows(rows)); + } - // reset sortOrder and update for colIndex - this.getColumns().map(function (col) { + sortRows(colIndex, sortOrder = 'none') { + colIndex = +colIndex; + + // reset sortOrder and update for colIndex + this.getColumns() + .map(col => { if (col.colIndex === colIndex) { col.sortOrder = sortOrder; } else { @@ -45700,361 +45285,699 @@ var DataManager = function () { } }); - this._sortRows(colIndex, sortOrder); - } - }, { - key: '_sortRows', - value: function _sortRows(colIndex, sortOrder) { - - if (this.currentSort.colIndex === colIndex) { - // reverse the array if only sortOrder changed - if (this.currentSort.sortOrder === 'asc' && sortOrder === 'desc' || this.currentSort.sortOrder === 'desc' && sortOrder === 'asc') { - this.reverseArray(this.rows); - this.currentSort.sortOrder = sortOrder; - return; - } - } - - this.rows.sort(function (a, b) { - var _aIndex = a[0].rowIndex; - var _bIndex = b[0].rowIndex; - var _a = a[colIndex].content; - var _b = b[colIndex].content; - - if (sortOrder === 'none') { - return _aIndex - _bIndex; - } else if (sortOrder === 'asc') { - if (_a < _b) return -1; - if (_a > _b) return 1; - if (_a === _b) return 0; - } else if (sortOrder === 'desc') { - if (_a < _b) return 1; - if (_a > _b) return -1; - if (_a === _b) return 0; - } - return 0; - }); - - if (this.hasColumnById('_rowIndex')) { - // update row index - var srNoColIndex = this.getColumnIndexById('_rowIndex'); - this.rows = this.rows.map(function (row, index) { - return row.map(function (cell) { - if (cell.colIndex === srNoColIndex) { - cell.content = index + 1 + ''; - } - return cell; - }); - }); - } - } - }, { - key: 'reverseArray', - value: function reverseArray(array) { - var left = null; - var right = null; - var length = array.length; - - for (left = 0, right = length - 1; left < right; left += 1, right -= 1) { - var temporary = array[left]; - - array[left] = array[right]; - array[right] = temporary; - } - } - }, { - key: 'switchColumn', - value: function switchColumn(index1, index2) { - // update columns - var temp = this.columns[index1]; - this.columns[index1] = this.columns[index2]; - this.columns[index2] = temp; - - this.columns[index1].colIndex = index1; - this.columns[index2].colIndex = index2; - - // update rows - this.rows = this.rows.map(function (row) { - var newCell1 = Object.assign({}, row[index1], { colIndex: index2 }); - var newCell2 = Object.assign({}, row[index2], { colIndex: index1 }); - - var newRow = row.map(function (cell) { - // make object copy - return Object.assign({}, cell); - }); - - newRow[index2] = newCell1; - newRow[index1] = newCell2; - - return newRow; - }); - } - }, { - key: 'removeColumn', - value: function removeColumn(index) { - index = +index; - var filter = function filter(cell) { - return cell.colIndex !== index; - }; - var map = function map(cell, i) { - return Object.assign({}, cell, { colIndex: i }); - }; - // update columns - this.columns = this.columns.filter(filter).map(map); - - // update rows - this.rows = this.rows.map(function (row) { - var newRow = row.filter(filter).map(map); - - return newRow; - }); - } - }, { - key: 'updateRow', - value: function updateRow(row, rowIndex) { - if (row.length < this.columns.length) { - if (this.hasColumnById('_rowIndex')) { - var val = rowIndex + 1 + ''; - - row = [val].concat(row); - } - - if (this.hasColumnById('_checkbox')) { - var _val = ''; - - row = [_val].concat(row); - } - } - - var _row = this.prepareRow(row, rowIndex); - var index = this.rows.findIndex(function (row) { - return row[0].rowIndex === rowIndex; - }); - this.rows[index] = _row; - - return _row; - } - }, { - key: 'updateCell', - value: function updateCell(colIndex, rowIndex, options) { - var cell = void 0; - if ((typeof colIndex === 'undefined' ? 'undefined' : _typeof(colIndex)) === 'object') { - // cell object was passed, - // must have colIndex, rowIndex - cell = colIndex; - colIndex = cell.colIndex; - rowIndex = cell.rowIndex; - // the object passed must be merged with original cell - options = cell; - } - cell = this.getCell(colIndex, rowIndex); - - // mutate object directly - for (var key in options) { - var newVal = options[key]; - if (newVal !== undefined) { - cell[key] = newVal; - } - } - - return cell; - } - }, { - key: 'updateColumn', - value: function updateColumn(colIndex, keyValPairs) { - var column = this.getColumn(colIndex); - for (var key in keyValPairs) { - var newVal = keyValPairs[key]; - if (newVal !== undefined) { - column[key] = newVal; - } - } - return column; - } - }, { - key: 'getRowCount', - value: function getRowCount() { - return this.rowCount; - } - }, { - key: '_getNextRowCount', - value: function _getNextRowCount() { - var val = this.rowCount; - - this.rowCount++; - return val; - } - }, { - key: 'getRows', - value: function getRows(start, end) { - return this.rows.slice(start, end); - } - }, { - key: 'getColumns', - value: function getColumns(skipStandardColumns) { - var columns = this.columns; - - if (skipStandardColumns) { - columns = columns.slice(this.getStandardColumnCount()); - } - - return columns; - } - }, { - key: 'getStandardColumnCount', - value: function getStandardColumnCount() { - if (this.options.addCheckboxColumn && this.options.addSerialNoColumn) { - return 2; - } - - if (this.options.addCheckboxColumn || this.options.addSerialNoColumn) { - return 1; - } - - return 0; - } - }, { - key: 'getColumnCount', - value: function getColumnCount(skipStandardColumns) { - var val = this.columns.length; - - if (skipStandardColumns) { - val = val - this.getStandardColumnCount(); - } - - return val; - } - }, { - key: 'getColumn', - value: function getColumn(colIndex) { - colIndex = +colIndex; - return this.columns.find(function (col) { - return col.colIndex === colIndex; - }); - } - }, { - key: 'getRow', - value: function getRow(rowIndex) { - rowIndex = +rowIndex; - return this.rows.find(function (row) { - return row[0].rowIndex === rowIndex; - }); - } - }, { - key: 'getCell', - value: function getCell(colIndex, rowIndex) { - rowIndex = +rowIndex; - colIndex = +colIndex; - return this.rows.find(function (row) { - return row[0].rowIndex === rowIndex; - })[colIndex]; - } - }, { - key: 'get', - value: function get() { - return { - columns: this.columns, - rows: this.rows - }; - } - }, { - key: 'hasColumn', - value: function hasColumn(name) { - return Boolean(this.columns.find(function (col) { - return col.content === name; - })); - } - }, { - key: 'hasColumnById', - value: function hasColumnById(id) { - return Boolean(this.columns.find(function (col) { - return col.id === id; - })); - } - }, { - key: 'getColumnIndex', - value: function getColumnIndex(name) { - return this.columns.findIndex(function (col) { - return col.content === name; - }); - } - }, { - key: 'getColumnIndexById', - value: function getColumnIndexById(id) { - return this.columns.findIndex(function (col) { - return col.id === id; - }); - } - }, { - key: 'getCheckboxHTML', - value: function getCheckboxHTML() { - return ''; - } - }, { - key: 'currentSort', - get: function get() { - var col = this.columns.find(function (col) { - return col.sortOrder !== 'none'; - }); - return col || { - colIndex: -1, - sortOrder: 'none' - }; - } - }]); - - return DataManager; -}(); - -// Custom Errors - - -exports.default = DataManager; - -var DataError = exports.DataError = function (_extendableBuiltin2) { - _inherits(DataError, _extendableBuiltin2); - - function DataError() { - _classCallCheck(this, DataError); - - return _possibleConstructorReturn(this, (DataError.__proto__ || Object.getPrototypeOf(DataError)).apply(this, arguments)); + this._sortRows(colIndex, sortOrder); } - return DataError; -}(_extendableBuiltin(TypeError)); + _sortRows(colIndex, sortOrder) { + if (this.currentSort.colIndex === colIndex) { + // reverse the array if only sortOrder changed + if ( + (this.currentSort.sortOrder === 'asc' && sortOrder === 'desc') || + (this.currentSort.sortOrder === 'desc' && sortOrder === 'asc') + ) { + this.reverseArray(this.rows); + this.currentSort.sortOrder = sortOrder; + return; + } + } + this.rows.sort((a, b) => { + const _aIndex = a[0].rowIndex; + const _bIndex = b[0].rowIndex; + const _a = a[colIndex].content; + const _b = b[colIndex].content; -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { + if (sortOrder === 'none') { + return _aIndex - _bIndex; + } else if (sortOrder === 'asc') { + if (_a < _b) return -1; + if (_a > _b) return 1; + if (_a === _b) return 0; + } else if (sortOrder === 'desc') { + if (_a < _b) return 1; + if (_a > _b) return -1; + if (_a === _b) return 0; + } + return 0; + }); -Object.defineProperty(exports, "__esModule", { - value: true -}); + if (this.hasColumnById('_rowIndex')) { + // update row index + const srNoColIndex = this.getColumnIndexById('_rowIndex'); + this.rows = this.rows.map((row, index) => { + return row.map(cell => { + if (cell.colIndex === srNoColIndex) { + cell.content = (index + 1) + ''; + } + return cell; + }); + }); + } + } -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + reverseArray(array) { + let left = null; + let right = null; + let length = array.length; -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + for (left = 0, right = length - 1; left < right; left += 1, right -= 1) { + const temporary = array[left]; -var _utils = __webpack_require__(1); + array[left] = array[right]; + array[right] = temporary; + } + } -var _dom = __webpack_require__(0); + switchColumn(index1, index2) { + // update columns + const temp = this.columns[index1]; + this.columns[index1] = this.columns[index2]; + this.columns[index2] = temp; -var _dom2 = _interopRequireDefault(_dom); + this.columns[index1].colIndex = index1; + this.columns[index2].colIndex = index2; -var _columnmanager = __webpack_require__(2); + // update rows + this.rows = this.rows.map(row => { + const newCell1 = Object.assign({}, row[index1], { colIndex: index2 }); + const newCell2 = Object.assign({}, row[index2], { colIndex: index1 }); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + let newRow = row.map(cell => { + // make object copy + return Object.assign({}, cell); + }); -function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + newRow[index2] = newCell1; + newRow[index1] = newCell2; -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + return newRow; + }); + } -var CellManager = function () { - function CellManager(instance) { - _classCallCheck(this, CellManager); + removeColumn(index) { + index = +index; + const filter = cell => cell.colIndex !== index; + const map = (cell, i) => Object.assign({}, cell, { colIndex: i }); + // update columns + this.columns = this.columns + .filter(filter) + .map(map); + // update rows + this.rows = this.rows.map(row => { + const newRow = row + .filter(filter) + .map(map); + + return newRow; + }); + } + + updateRow(row, rowIndex) { + if (row.length < this.columns.length) { + if (this.hasColumnById('_rowIndex')) { + const val = (rowIndex + 1) + ''; + + row = [val].concat(row); + } + + if (this.hasColumnById('_checkbox')) { + const val = ''; + + row = [val].concat(row); + } + } + + const _row = this.prepareRow(row, rowIndex); + const index = this.rows.findIndex(row => row[0].rowIndex === rowIndex); + this.rows[index] = _row; + + return _row; + } + + updateCell(colIndex, rowIndex, options) { + let cell; + if (typeof colIndex === 'object') { + // cell object was passed, + // must have colIndex, rowIndex + cell = colIndex; + colIndex = cell.colIndex; + rowIndex = cell.rowIndex; + // the object passed must be merged with original cell + options = cell; + } + cell = this.getCell(colIndex, rowIndex); + + // mutate object directly + for (let key in options) { + const newVal = options[key]; + if (newVal !== undefined) { + cell[key] = newVal; + } + } + + return cell; + } + + updateColumn(colIndex, keyValPairs) { + const column = this.getColumn(colIndex); + for (let key in keyValPairs) { + const newVal = keyValPairs[key]; + if (newVal !== undefined) { + column[key] = newVal; + } + } + return column; + } + + filterRows(keyword, colIndex) { + let rowsToHide = []; + let rowsToShow = []; + const cells = this.rows.map(row => row[colIndex]); + + cells.forEach(cell => { + const hay = cell.content.toLowerCase(); + const needle = (keyword || '').toLowerCase(); + + if (!needle || hay.includes(needle)) { + rowsToShow.push(cell.rowIndex); + } else { + rowsToHide.push(cell.rowIndex); + } + }); + + return {rowsToHide, rowsToShow}; + } + + getRowCount() { + return this.rowCount; + } + + _getNextRowCount() { + const val = this.rowCount; + + this.rowCount++; + return val; + } + + getRows(start, end) { + return this.rows.slice(start, end); + } + + getColumns(skipStandardColumns) { + let columns = this.columns; + + if (skipStandardColumns) { + columns = columns.slice(this.getStandardColumnCount()); + } + + return columns; + } + + getStandardColumnCount() { + if (this.options.addCheckboxColumn && this.options.addSerialNoColumn) { + return 2; + } + + if (this.options.addCheckboxColumn || this.options.addSerialNoColumn) { + return 1; + } + + return 0; + } + + getColumnCount(skipStandardColumns) { + let val = this.columns.length; + + if (skipStandardColumns) { + val = val - this.getStandardColumnCount(); + } + + return val; + } + + getColumn(colIndex) { + colIndex = +colIndex; + return this.columns.find(col => col.colIndex === colIndex); + } + + getRow(rowIndex) { + rowIndex = +rowIndex; + return this.rows.find(row => row[0].rowIndex === rowIndex); + } + + getCell(colIndex, rowIndex) { + rowIndex = +rowIndex; + colIndex = +colIndex; + return this.rows.find(row => row[0].rowIndex === rowIndex)[colIndex]; + } + + get() { + return { + columns: this.columns, + rows: this.rows + }; + } + + hasColumn(name) { + return Boolean(this.columns.find(col => col.content === name)); + } + + hasColumnById(id) { + return Boolean(this.columns.find(col => col.id === id)); + } + + getColumnIndex(name) { + return this.columns.findIndex(col => col.content === name); + } + + getColumnIndexById(id) { + return this.columns.findIndex(col => col.id === id); + } + + getCheckboxHTML() { + return ''; + } +} + +// Custom Errors +class DataError extends TypeError {} + +class ColumnManager { + constructor(instance) { + this.instance = instance; + + linkProperties(this, this.instance, [ + 'options', + 'fireEvent', + 'header', + 'datamanager', + 'style', + 'wrapper', + 'rowmanager', + 'bodyScrollable' + ]); + + this.bindEvents(); + getDropdownHTML = getDropdownHTML.bind(this, this.options.dropdownButton); + } + + renderHeader() { + this.header.innerHTML = ''; + this.refreshHeader(); + } + + refreshHeader() { + const columns = this.datamanager.getColumns(); + + if (!$('.data-table-col', this.header)) { + // insert html + + let html = this.rowmanager.getRowHTML(columns, { isHeader: 1 }); + if (this.options.enableInlineFilters) { + html += this.rowmanager.getRowHTML(columns, { isFilter: 1 }); + } + + $('thead', this.header).innerHTML = html; + + this.$filterRow = $('.data-table-row[data-is-filter]', this.header); + + if (this.$filterRow) { + // hide filter row immediately, so it doesn't disturb layout + $.style(this.$filterRow, { + display: 'none' + }); + } + } else { + // refresh dom state + const $cols = $.each('.data-table-col', this.header); + if (columns.length < $cols.length) { + // deleted column + $('thead', this.header).innerHTML = this.rowmanager.getRowHTML(columns, { isHeader: 1 }); + return; + } + + $cols.map(($col, i) => { + const column = columns[i]; + // column sorted or order changed + // update colIndex of each header cell + $.data($col, { + colIndex: column.colIndex + }); + + // refresh sort indicator + const sortIndicator = $('.sort-indicator', $col); + if (sortIndicator) { + sortIndicator.innerHTML = this.options.sortIndicator[column.sortOrder]; + } + }); + } + // reset columnMap + this.$columnMap = []; + } + + bindEvents() { + this.bindDropdown(); + this.bindResizeColumn(); + this.bindMoveColumn(); + this.bindFilter(); + } + + bindDropdown() { + let $activeDropdown; + $.on(this.header, 'click', '.data-table-dropdown-toggle', (e, $button) => { + const $dropdown = $.closest('.data-table-dropdown', $button); + + if (!$dropdown.classList.contains('is-active')) { + deactivateDropdown(); + $dropdown.classList.add('is-active'); + $activeDropdown = $dropdown; + } else { + deactivateDropdown(); + } + }); + + $.on(document.body, 'click', (e) => { + if (e.target.matches('.data-table-dropdown-toggle')) return; + deactivateDropdown(); + }); + + const dropdownItems = this.options.headerDropdown; + + $.on(this.header, 'click', '.data-table-dropdown-list > div', (e, $item) => { + const $col = $.closest('.data-table-col', $item); + const { index } = $.data($item); + const { colIndex } = $.data($col); + let callback = dropdownItems[index].action; + + callback && callback.call(this.instance, this.getColumn(colIndex)); + }); + + function deactivateDropdown(e) { + $activeDropdown && $activeDropdown.classList.remove('is-active'); + $activeDropdown = null; + } + } + + bindResizeColumn() { + let isDragging = false; + let $resizingCell, startWidth, startX; + + $.on(this.header, 'mousedown', '.data-table-col .column-resizer', (e, $handle) => { + document.body.classList.add('data-table-resize'); + const $cell = $handle.parentNode.parentNode; + $resizingCell = $cell; + const { colIndex } = $.data($resizingCell); + const col = this.getColumn(colIndex); + + if (col && col.resizable === false) { + return; + } + + isDragging = true; + startWidth = $.style($('.content', $resizingCell), 'width'); + startX = e.pageX; + }); + + $.on(document.body, 'mouseup', (e) => { + document.body.classList.remove('data-table-resize'); + if (!$resizingCell) return; + isDragging = false; + + const { colIndex } = $.data($resizingCell); + this.setColumnWidth(colIndex); + this.style.setBodyStyle(); + $resizingCell = null; + }); + + $.on(document.body, 'mousemove', (e) => { + if (!isDragging) return; + const finalWidth = startWidth + (e.pageX - startX); + const { colIndex } = $.data($resizingCell); + + if (this.getColumnMinWidth(colIndex) > finalWidth) { + // don't resize past minWidth + return; + } + this.datamanager.updateColumn(colIndex, { width: finalWidth }); + this.setColumnHeaderWidth(colIndex); + }); + } + + bindMoveColumn() { + let initialized; + + const initialize = () => { + if (initialized) { + $.off(document.body, 'mousemove', initialize); + return; + } + const ready = $('.data-table-col', this.header); + if (!ready) return; + + const $parent = $('.data-table-row', this.header); + + this.sortable = Sortable$$1.create($parent, { + onEnd: (e) => { + const { oldIndex, newIndex } = e; + const $draggedCell = e.item; + const { colIndex } = $.data($draggedCell); + if (+colIndex === newIndex) return; + + this.switchColumn(oldIndex, newIndex); + }, + preventOnFilter: false, + filter: '.column-resizer, .data-table-dropdown', + animation: 150 + }); + }; + + $.on(document.body, 'mousemove', initialize); + } + + bindSortColumn() { + + $.on(this.header, 'click', '.data-table-col .column-title', (e, span) => { + const $cell = span.closest('.data-table-col'); + let { colIndex, sortOrder } = $.data($cell); + sortOrder = getDefault(sortOrder, 'none'); + const col = this.getColumn(colIndex); + + if (col && col.sortable === false) { + return; + } + + // reset sort indicator + $('.sort-indicator', this.header).textContent = ''; + $.each('.data-table-col', this.header).map($cell => { + $.data($cell, { + sortOrder: 'none' + }); + }); + + let nextSortOrder, textContent; + if (sortOrder === 'none') { + nextSortOrder = 'asc'; + textContent = '▲'; + } else if (sortOrder === 'asc') { + nextSortOrder = 'desc'; + textContent = '▼'; + } else if (sortOrder === 'desc') { + nextSortOrder = 'none'; + textContent = ''; + } + + $.data($cell, { + sortOrder: nextSortOrder + }); + $('.sort-indicator', $cell).textContent = textContent; + + this.sortColumn(colIndex, nextSortOrder); + }); + } + + sortColumn(colIndex, nextSortOrder) { + this.instance.freeze(); + this.sortRows(colIndex, nextSortOrder) + .then(() => { + this.refreshHeader(); + return this.rowmanager.refreshRows(); + }) + .then(() => this.instance.unfreeze()) + .then(() => { + this.fireEvent('onSortColumn', this.getColumn(colIndex)); + }); + } + + removeColumn(colIndex) { + const removedCol = this.getColumn(colIndex); + this.instance.freeze(); + this.datamanager.removeColumn(colIndex) + .then(() => { + this.refreshHeader(); + return this.rowmanager.refreshRows(); + }) + .then(() => this.instance.unfreeze()) + .then(() => { + this.fireEvent('onRemoveColumn', removedCol); + }); + } + + switchColumn(oldIndex, newIndex) { + this.instance.freeze(); + this.datamanager.switchColumn(oldIndex, newIndex) + .then(() => { + this.refreshHeader(); + return this.rowmanager.refreshRows(); + }) + .then(() => { + this.setColumnWidth(oldIndex); + this.setColumnWidth(newIndex); + this.instance.unfreeze(); + }) + .then(() => { + this.fireEvent('onSwitchColumn', + this.getColumn(oldIndex), this.getColumn(newIndex) + ); + }); + } + + toggleFilter() { + this.isFilterShown = this.isFilterShown || false; + + if (this.isFilterShown) { + $.style(this.$filterRow, { + display: 'none' + }); + } else { + $.style(this.$filterRow, { + display: '' + }); + } + + this.isFilterShown = !this.isFilterShown; + this.style.setBodyStyle(); + } + + focusFilter(colIndex) { + if (!this.isFilterShown) return; + + const $filterInput = $(`[data-col-index="${colIndex}"] .data-table-filter`, this.$filterRow); + $filterInput.focus(); + } + + bindFilter() { + if (!this.options.enableInlineFilters) return; + const handler = e => { + const $filterCell = $.closest('.data-table-col', e.target); + const { colIndex } = $.data($filterCell); + const keyword = e.target.value; + + this.datamanager.filterRows(keyword, colIndex) + .then(({ rowsToHide, rowsToShow }) => { + rowsToHide.map(rowIndex => { + const $tr = $(`.data-table-row[data-row-index="${rowIndex}"]`, this.bodyScrollable); + $tr.classList.add('hide'); + }); + rowsToShow.map(rowIndex => { + const $tr = $(`.data-table-row[data-row-index="${rowIndex}"]`, this.bodyScrollable); + $tr.classList.remove('hide'); + }); + }); + }; + $.on(this.header, 'keydown', '.data-table-filter', debounce$1(handler, 300)); + } + + sortRows(colIndex, sortOrder) { + return this.datamanager.sortRows(colIndex, sortOrder); + } + + getColumn(colIndex) { + return this.datamanager.getColumn(colIndex); + } + + getColumns() { + return this.datamanager.getColumns(); + } + + setColumnWidth(colIndex) { + colIndex = +colIndex; + this._columnWidthMap = this._columnWidthMap || []; + + const { width } = this.getColumn(colIndex); + + let index = this._columnWidthMap[colIndex]; + const selector = `[data-col-index="${colIndex}"] .content, [data-col-index="${colIndex}"] .edit-cell`; + const styles = { + width: width + 'px' + }; + + index = this.style.setStyle(selector, styles, index); + this._columnWidthMap[colIndex] = index; + } + + setColumnHeaderWidth(colIndex) { + colIndex = +colIndex; + this.$columnMap = this.$columnMap || []; + const selector = `.data-table-header [data-col-index="${colIndex}"] .content`; + const { width } = this.getColumn(colIndex); + + let $column = this.$columnMap[colIndex]; + if (!$column) { + $column = this.header.querySelector(selector); + this.$columnMap[colIndex] = $column; + } + + $column.style.width = width + 'px'; + } + + getColumnMinWidth(colIndex) { + colIndex = +colIndex; + return this.getColumn(colIndex).minWidth || 24; + } + + getFirstColumnIndex() { + if (this.options.addCheckboxColumn && this.options.addSerialNoColumn) { + return 2; + } + + if (this.options.addCheckboxColumn || this.options.addSerialNoColumn) { + return 1; + } + + return 0; + } + + getHeaderCell$(colIndex) { + return $(`.data-table-col[data-col-index="${colIndex}"]`, this.header); + } + + getLastColumnIndex() { + return this.datamanager.getColumnCount() - 1; + } + + getSerialColumnIndex() { + const columns = this.datamanager.getColumns(); + + return columns.findIndex(column => column.content.includes('Sr. No')); + } +} + +// eslint-disable-next-line +var getDropdownHTML = function getDropdownHTML(dropdownButton = 'v') { + // add dropdown buttons + const dropdownItems = this.options.headerDropdown; + + return `
${dropdownButton}
+
+ ${dropdownItems.map((d, i) => `
${d.label}
`).join('')} +
+ `; +}; + +class CellManager { + constructor(instance) { this.instance = instance; this.wrapper = this.instance.wrapper; this.options = this.instance.options; @@ -46068,524 +45991,447 @@ var CellManager = function () { this.bindEvents(); } - _createClass(CellManager, [{ - key: 'bindEvents', - value: function bindEvents() { - this.bindFocusCell(); - this.bindEditCell(); - this.bindKeyboardSelection(); - this.bindCopyCellContents(); - this.bindMouseEvents(); - } - }, { - key: 'bindFocusCell', - value: function bindFocusCell() { - this.bindKeyboardNav(); - } - }, { - key: 'bindEditCell', - value: function bindEditCell() { - var _this = this; + bindEvents() { + this.bindFocusCell(); + this.bindEditCell(); + this.bindKeyboardSelection(); + this.bindCopyCellContents(); + this.bindMouseEvents(); + } - this.$editingCell = null; + bindFocusCell() { + this.bindKeyboardNav(); + } - _dom2.default.on(this.bodyScrollable, 'dblclick', '.data-table-col', function (e, cell) { - _this.activateEditing(cell); - }); + bindEditCell() { + this.$editingCell = null; - this.keyboard.on('enter', function (e) { - if (_this.$focusedCell && !_this.$editingCell) { - // enter keypress on focused cell - _this.activateEditing(_this.$focusedCell); - } else if (_this.$editingCell) { - // enter keypress on editing cell - _this.submitEditing(); - _this.deactivateEditing(); - } - }); - } - }, { - key: 'bindKeyboardNav', - value: function bindKeyboardNav() { - var _this2 = this; + $.on(this.bodyScrollable, 'dblclick', '.data-table-col', (e, cell) => { + this.activateEditing(cell); + }); - var focusCell = function focusCell(direction) { - if (!_this2.$focusedCell || _this2.$editingCell) { - return false; - } - - var $cell = _this2.$focusedCell; - - if (direction === 'left' || direction === 'shift+tab') { - $cell = _this2.getLeftCell$($cell); - } else if (direction === 'right' || direction === 'tab') { - $cell = _this2.getRightCell$($cell); - } else if (direction === 'up') { - $cell = _this2.getAboveCell$($cell); - } else if (direction === 'down') { - $cell = _this2.getBelowCell$($cell); - } - - _this2.focusCell($cell); - return true; - }; - - var focusLastCell = function focusLastCell(direction) { - if (!_this2.$focusedCell || _this2.$editingCell) { - return false; - } - - var $cell = _this2.$focusedCell; - - var _$$data = _dom2.default.data($cell), - rowIndex = _$$data.rowIndex, - colIndex = _$$data.colIndex; - - if (direction === 'left') { - $cell = _this2.getLeftMostCell$(rowIndex); - } else if (direction === 'right') { - $cell = _this2.getRightMostCell$(rowIndex); - } else if (direction === 'up') { - $cell = _this2.getTopMostCell$(colIndex); - } else if (direction === 'down') { - $cell = _this2.getBottomMostCell$(colIndex); - } - - _this2.focusCell($cell); - return true; - }; - - ['left', 'right', 'up', 'down', 'tab', 'shift+tab'].map(function (direction) { - return _this2.keyboard.on(direction, function () { - return focusCell(direction); - }); - }); - - ['left', 'right', 'up', 'down'].map(function (direction) { - return _this2.keyboard.on('ctrl+' + direction, function () { - return focusLastCell(direction); - }); - }); - - this.keyboard.on('esc', function () { - _this2.deactivateEditing(); - }); - } - }, { - key: 'bindKeyboardSelection', - value: function bindKeyboardSelection() { - var _this3 = this; - - var getNextSelectionCursor = function getNextSelectionCursor(direction) { - var $selectionCursor = _this3.getSelectionCursor(); - - if (direction === 'left') { - $selectionCursor = _this3.getLeftCell$($selectionCursor); - } else if (direction === 'right') { - $selectionCursor = _this3.getRightCell$($selectionCursor); - } else if (direction === 'up') { - $selectionCursor = _this3.getAboveCell$($selectionCursor); - } else if (direction === 'down') { - $selectionCursor = _this3.getBelowCell$($selectionCursor); - } - - return $selectionCursor; - }; - - ['left', 'right', 'up', 'down'].map(function (direction) { - return _this3.keyboard.on('shift+' + direction, function () { - return _this3.selectArea(getNextSelectionCursor(direction)); - }); - }); - } - }, { - key: 'bindCopyCellContents', - value: function bindCopyCellContents() { - var _this4 = this; - - this.keyboard.on('ctrl+c', function () { - _this4.copyCellContents(_this4.$focusedCell, _this4.$selectionCursor); - }); - } - }, { - key: 'bindMouseEvents', - value: function bindMouseEvents() { - var _this5 = this; - - var mouseDown = null; - - _dom2.default.on(this.bodyScrollable, 'mousedown', '.data-table-col', function (e) { - mouseDown = true; - _this5.focusCell((0, _dom2.default)(e.delegatedTarget)); - }); - - _dom2.default.on(this.bodyScrollable, 'mouseup', function () { - mouseDown = false; - }); - - var selectArea = function selectArea(e) { - if (!mouseDown) return; - _this5.selectArea((0, _dom2.default)(e.delegatedTarget)); - }; - - _dom2.default.on(this.bodyScrollable, 'mousemove', '.data-table-col', (0, _utils.throttle)(selectArea, 50)); - } - }, { - key: 'focusCell', - value: function focusCell($cell) { - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$skipClearSelecti = _ref.skipClearSelection, - skipClearSelection = _ref$skipClearSelecti === undefined ? 0 : _ref$skipClearSelecti; - - if (!$cell) return; - - // don't focus if already editing cell - if ($cell === this.$editingCell) return; - - var _$$data2 = _dom2.default.data($cell), - colIndex = _$$data2.colIndex, - isHeader = _$$data2.isHeader; - - if (isHeader) { - return; + this.keyboard.on('enter', (e) => { + if (this.$focusedCell && !this.$editingCell) { + // enter keypress on focused cell + this.activateEditing(this.$focusedCell); + } else if (this.$editingCell) { + // enter keypress on editing cell + this.submitEditing(); + this.deactivateEditing(); } + }); + } - var column = this.columnmanager.getColumn(colIndex); - if (column.focusable === false) { - return; - } - - this.deactivateEditing(); - if (!skipClearSelection) { - this.clearSelection(); - } - - if (this.$focusedCell) { - this.$focusedCell.classList.remove('selected'); - } - - this.$focusedCell = $cell; - $cell.classList.add('selected'); - - // so that keyboard nav works - $cell.focus(); - - this.highlightRowColumnHeader($cell); - this.scrollToCell($cell); - } - }, { - key: 'highlightRowColumnHeader', - value: function highlightRowColumnHeader($cell) { - var _$$data3 = _dom2.default.data($cell), - colIndex = _$$data3.colIndex, - rowIndex = _$$data3.rowIndex; - - var _colIndex = this.datamanager.getColumnIndexById('_rowIndex'); - var colHeaderSelector = '.data-table-header .data-table-col[data-col-index="' + colIndex + '"]'; - var rowHeaderSelector = '.data-table-col[data-row-index="' + rowIndex + '"][data-col-index="' + _colIndex + '"]'; - - if (this.lastHeaders) { - _dom2.default.removeStyle(this.lastHeaders, 'backgroundColor'); - } - - var colHeader = (0, _dom2.default)(colHeaderSelector, this.wrapper); - var rowHeader = (0, _dom2.default)(rowHeaderSelector, this.wrapper); - - _dom2.default.style([colHeader, rowHeader], { - backgroundColor: '#f5f7fa' // light-bg - }); - - this.lastHeaders = [colHeader, rowHeader]; - } - }, { - key: 'selectAreaOnClusterChanged', - value: function selectAreaOnClusterChanged() { - if (!(this.$focusedCell && this.$selectionCursor)) return; - - var _$$data4 = _dom2.default.data(this.$selectionCursor), - colIndex = _$$data4.colIndex, - rowIndex = _$$data4.rowIndex; - - var $cell = this.getCell$(colIndex, rowIndex); - - if (!$cell || $cell === this.$selectionCursor) return; - - // selectArea needs $focusedCell - var fCell = _dom2.default.data(this.$focusedCell); - this.$focusedCell = this.getCell$(fCell.colIndex, fCell.rowIndex); - - this.selectArea($cell); - } - }, { - key: 'focusCellOnClusterChanged', - value: function focusCellOnClusterChanged() { - if (!this.$focusedCell) return; - - var _$$data5 = _dom2.default.data(this.$focusedCell), - colIndex = _$$data5.colIndex, - rowIndex = _$$data5.rowIndex; - - var $cell = this.getCell$(colIndex, rowIndex); - - if (!$cell) return; - // this function is called after selectAreaOnClusterChanged, - // focusCell calls clearSelection which resets the area selection - // so a flag to skip it - this.focusCell($cell, { skipClearSelection: 1 }); - } - }, { - key: 'selectArea', - value: function selectArea($selectionCursor) { - if (!this.$focusedCell) return; - - if (this._selectArea(this.$focusedCell, $selectionCursor)) { - // valid selection - this.$selectionCursor = $selectionCursor; - } - } - }, { - key: '_selectArea', - value: function _selectArea($cell1, $cell2) { - var _this6 = this; - - if ($cell1 === $cell2) return false; - - var cells = this.getCellsInRange($cell1, $cell2); - if (!cells) return false; - - this.clearSelection(); - cells.map(function (index) { - return _this6.getCell$.apply(_this6, _toConsumableArray(index)); - }).map(function ($cell) { - return $cell.classList.add('highlight'); - }); - return true; - } - }, { - key: 'getCellsInRange', - value: function getCellsInRange($cell1, $cell2) { - var colIndex1 = void 0, - rowIndex1 = void 0, - colIndex2 = void 0, - rowIndex2 = void 0; - - if (typeof $cell1 === 'number') { - var _arguments = Array.prototype.slice.call(arguments); - - colIndex1 = _arguments[0]; - rowIndex1 = _arguments[1]; - colIndex2 = _arguments[2]; - rowIndex2 = _arguments[3]; - } else if ((typeof $cell1 === 'undefined' ? 'undefined' : _typeof($cell1)) === 'object') { - - if (!($cell1 && $cell2)) { - return false; - } - - var cell1 = _dom2.default.data($cell1); - var cell2 = _dom2.default.data($cell2); - - colIndex1 = cell1.colIndex; - rowIndex1 = cell1.rowIndex; - colIndex2 = cell2.colIndex; - rowIndex2 = cell2.rowIndex; - } - - if (rowIndex1 > rowIndex2) { - var _ref2 = [rowIndex2, rowIndex1]; - rowIndex1 = _ref2[0]; - rowIndex2 = _ref2[1]; - } - - if (colIndex1 > colIndex2) { - var _ref3 = [colIndex2, colIndex1]; - colIndex1 = _ref3[0]; - colIndex2 = _ref3[1]; - } - - if (this.isStandardCell(colIndex1) || this.isStandardCell(colIndex2)) { + bindKeyboardNav() { + const focusCell = (direction) => { + if (!this.$focusedCell || this.$editingCell) { return false; } - var cells = []; - var colIndex = colIndex1; - var rowIndex = rowIndex1; - var rowIndices = []; + let $cell = this.$focusedCell; - while (rowIndex <= rowIndex2) { - rowIndices.push(rowIndex); - rowIndex++; + if (direction === 'left' || direction === 'shift+tab') { + $cell = this.getLeftCell$($cell); + } else if (direction === 'right' || direction === 'tab') { + $cell = this.getRightCell$($cell); + } else if (direction === 'up') { + $cell = this.getAboveCell$($cell); + } else if (direction === 'down') { + $cell = this.getBelowCell$($cell); } - rowIndices.map(function (rowIndex) { - while (colIndex <= colIndex2) { - cells.push([colIndex, rowIndex]); - colIndex++; - } - colIndex = colIndex1; - }); - - return cells; - } - }, { - key: 'clearSelection', - value: function clearSelection() { - _dom2.default.each('.data-table-col.highlight', this.bodyScrollable).map(function (cell) { - return cell.classList.remove('highlight'); - }); - - this.$selectionCursor = null; - } - }, { - key: 'getSelectionCursor', - value: function getSelectionCursor() { - return this.$selectionCursor || this.$focusedCell; - } - }, { - key: 'activateEditing', - value: function activateEditing($cell) { this.focusCell($cell); + return true; + }; - var _$$data6 = _dom2.default.data($cell), - rowIndex = _$$data6.rowIndex, - colIndex = _$$data6.colIndex; + const focusLastCell = (direction) => { + if (!this.$focusedCell || this.$editingCell) { + return false; + } - var col = this.columnmanager.getColumn(colIndex); - if (col && (col.editable === false || col.focusable === false)) { + let $cell = this.$focusedCell; + const { rowIndex, colIndex } = $.data($cell); + + if (direction === 'left') { + $cell = this.getLeftMostCell$(rowIndex); + } else if (direction === 'right') { + $cell = this.getRightMostCell$(rowIndex); + } else if (direction === 'up') { + $cell = this.getTopMostCell$(colIndex); + } else if (direction === 'down') { + $cell = this.getBottomMostCell$(colIndex); + } + + this.focusCell($cell); + return true; + }; + + ['left', 'right', 'up', 'down', 'tab', 'shift+tab'].map( + direction => this.keyboard.on(direction, () => focusCell(direction)) + ); + + ['left', 'right', 'up', 'down'].map( + direction => this.keyboard.on('ctrl+' + direction, () => focusLastCell(direction)) + ); + + this.keyboard.on('esc', () => { + this.deactivateEditing(); + }); + + if (this.options.enableInlineFilters) { + this.keyboard.on('ctrl+f', (e) => { + const $cell = $.closest('.data-table-col', e.target); + let { colIndex } = $.data($cell); + + this.activateFilter(colIndex); + return true; + }); + } + } + + bindKeyboardSelection() { + const getNextSelectionCursor = (direction) => { + let $selectionCursor = this.getSelectionCursor(); + + if (direction === 'left') { + $selectionCursor = this.getLeftCell$($selectionCursor); + } else if (direction === 'right') { + $selectionCursor = this.getRightCell$($selectionCursor); + } else if (direction === 'up') { + $selectionCursor = this.getAboveCell$($selectionCursor); + } else if (direction === 'down') { + $selectionCursor = this.getBelowCell$($selectionCursor); + } + + return $selectionCursor; + }; + + ['left', 'right', 'up', 'down'].map( + direction => this.keyboard.on('shift+' + direction, + () => this.selectArea(getNextSelectionCursor(direction))) + ); + } + + bindCopyCellContents() { + this.keyboard.on('ctrl+c', () => { + this.copyCellContents(this.$focusedCell, this.$selectionCursor); + }); + } + + bindMouseEvents() { + let mouseDown = null; + + $.on(this.bodyScrollable, 'mousedown', '.data-table-col', (e) => { + mouseDown = true; + this.focusCell($(e.delegatedTarget)); + }); + + $.on(this.bodyScrollable, 'mouseup', () => { + mouseDown = false; + }); + + const selectArea = (e) => { + if (!mouseDown) return; + this.selectArea($(e.delegatedTarget)); + }; + + $.on(this.bodyScrollable, 'mousemove', '.data-table-col', throttle$1(selectArea, 50)); + } + + focusCell($cell, { skipClearSelection = 0 } = {}) { + if (!$cell) return; + + // don't focus if already editing cell + if ($cell === this.$editingCell) return; + + const { colIndex, isHeader } = $.data($cell); + if (isHeader) { + return; + } + + const column = this.columnmanager.getColumn(colIndex); + if (column.focusable === false) { + return; + } + + this.scrollToCell($cell); + + this.deactivateEditing(); + if (!skipClearSelection) { + this.clearSelection(); + } + + if (this.$focusedCell) { + this.$focusedCell.classList.remove('selected'); + } + + this.$focusedCell = $cell; + $cell.classList.add('selected'); + + // so that keyboard nav works + $cell.focus(); + + this.highlightRowColumnHeader($cell); + } + + highlightRowColumnHeader($cell) { + const { colIndex, rowIndex } = $.data($cell); + const _colIndex = this.datamanager.getColumnIndexById('_rowIndex'); + const colHeaderSelector = `.data-table-header .data-table-col[data-col-index="${colIndex}"]`; + const rowHeaderSelector = `.data-table-col[data-row-index="${rowIndex}"][data-col-index="${_colIndex}"]`; + + if (this.lastHeaders) { + $.removeStyle(this.lastHeaders, 'backgroundColor'); + } + + const colHeader = $(colHeaderSelector, this.wrapper); + const rowHeader = $(rowHeaderSelector, this.wrapper); + + $.style([colHeader, rowHeader], { + backgroundColor: '#f5f7fa' // light-bg + }); + + this.lastHeaders = [colHeader, rowHeader]; + } + + selectAreaOnClusterChanged() { + if (!(this.$focusedCell && this.$selectionCursor)) return; + const { colIndex, rowIndex } = $.data(this.$selectionCursor); + const $cell = this.getCell$(colIndex, rowIndex); + + if (!$cell || $cell === this.$selectionCursor) return; + + // selectArea needs $focusedCell + const fCell = $.data(this.$focusedCell); + this.$focusedCell = this.getCell$(fCell.colIndex, fCell.rowIndex); + + this.selectArea($cell); + } + + focusCellOnClusterChanged() { + if (!this.$focusedCell) return; + + const { colIndex, rowIndex } = $.data(this.$focusedCell); + const $cell = this.getCell$(colIndex, rowIndex); + + if (!$cell) return; + // this function is called after selectAreaOnClusterChanged, + // focusCell calls clearSelection which resets the area selection + // so a flag to skip it + this.focusCell($cell, { skipClearSelection: 1 }); + } + + selectArea($selectionCursor) { + if (!this.$focusedCell) return; + + if (this._selectArea(this.$focusedCell, $selectionCursor)) { + // valid selection + this.$selectionCursor = $selectionCursor; + } + }; + + _selectArea($cell1, $cell2) { + if ($cell1 === $cell2) return false; + + const cells = this.getCellsInRange($cell1, $cell2); + if (!cells) return false; + + this.clearSelection(); + cells.map(index => this.getCell$(...index)).map($cell => $cell.classList.add('highlight')); + return true; + } + + getCellsInRange($cell1, $cell2) { + let colIndex1, rowIndex1, colIndex2, rowIndex2; + + if (typeof $cell1 === 'number') { + [colIndex1, rowIndex1, colIndex2, rowIndex2] = arguments; + } else + if (typeof $cell1 === 'object') { + + if (!($cell1 && $cell2)) { + return false; + } + + const cell1 = $.data($cell1); + const cell2 = $.data($cell2); + + colIndex1 = cell1.colIndex; + rowIndex1 = cell1.rowIndex; + colIndex2 = cell2.colIndex; + rowIndex2 = cell2.rowIndex; + } + + if (rowIndex1 > rowIndex2) { + [rowIndex1, rowIndex2] = [rowIndex2, rowIndex1]; + } + + if (colIndex1 > colIndex2) { + [colIndex1, colIndex2] = [colIndex2, colIndex1]; + } + + if (this.isStandardCell(colIndex1) || this.isStandardCell(colIndex2)) { + return false; + } + + let cells = []; + let colIndex = colIndex1; + let rowIndex = rowIndex1; + let rowIndices = []; + + while (rowIndex <= rowIndex2) { + rowIndices.push(rowIndex); + rowIndex++; + } + + rowIndices.map(rowIndex => { + while (colIndex <= colIndex2) { + cells.push([colIndex, rowIndex]); + colIndex++; + } + colIndex = colIndex1; + }); + + return cells; + } + + clearSelection() { + $.each('.data-table-col.highlight', this.bodyScrollable) + .map(cell => cell.classList.remove('highlight')); + + this.$selectionCursor = null; + } + + getSelectionCursor() { + return this.$selectionCursor || this.$focusedCell; + } + + activateEditing($cell) { + this.focusCell($cell); + const { rowIndex, colIndex } = $.data($cell); + + const col = this.columnmanager.getColumn(colIndex); + if (col && (col.editable === false || col.focusable === false)) { + return; + } + + const cell = this.getCell(colIndex, rowIndex); + if (cell && cell.editable === false) { + return; + } + + if (this.$editingCell) { + const { _rowIndex, _colIndex } = $.data(this.$editingCell); + + if (rowIndex === _rowIndex && colIndex === _colIndex) { + // editing the same cell return; } + } - var cell = this.getCell(colIndex, rowIndex); - if (cell && cell.editable === false) { - return; - } + const $editCell = $('.edit-cell', $cell); + $editCell.innerHTML = ''; - if (this.$editingCell) { - var _$$data7 = _dom2.default.data(this.$editingCell), - _rowIndex = _$$data7._rowIndex, - _colIndex = _$$data7._colIndex; - - if (rowIndex === _rowIndex && colIndex === _colIndex) { - // editing the same cell - return; - } - } + const editor = this.getEditor(colIndex, rowIndex, cell.content, $editCell); + if (editor) { this.$editingCell = $cell; $cell.classList.add('editing'); - var $editCell = (0, _dom2.default)('.edit-cell', $cell); - $editCell.innerHTML = ''; + this.currentCellEditor = editor; + // initialize editing input with cell value + editor.initValue(cell.content, rowIndex, col); + } + } - var editor = this.getEditor(colIndex, rowIndex, cell.content, $editCell); + deactivateEditing() { + // keep focus on the cell so that keyboard navigation works + if (this.$focusedCell) this.$focusedCell.focus(); + + if (!this.$editingCell) return; + this.$editingCell.classList.remove('editing'); + this.$editingCell = null; + } + + getEditor(colIndex, rowIndex, value, parent) { + // debugger; + const obj = this.options.getEditor(colIndex, rowIndex, value, parent); + if (obj && obj.setValue) return obj; + + // let the getEditor method determine dynamically + // if the cell is editable or not + if (obj === false) return null; + + // editing fallback + const $input = $.create('input', { + class: 'input-style', + type: 'text', + inside: parent + }); + + return { + initValue(value) { + $input.focus(); + $input.value = value; + }, + getValue() { + return $input.value; + }, + setValue(value) { + $input.value = value; + } + }; + } + + submitEditing() { + if (!this.$editingCell) return; + const $cell = this.$editingCell; + const { rowIndex, colIndex } = $.data($cell); + const col = this.datamanager.getColumn(colIndex); + + if ($cell) { + const editor = this.currentCellEditor; if (editor) { - this.currentCellEditor = editor; - // initialize editing input with cell value - editor.initValue(cell.content, rowIndex, col); - } - } - }, { - key: 'deactivateEditing', - value: function deactivateEditing() { - // keep focus on the cell so that keyboard navigation works - if (this.$focusedCell) this.$focusedCell.focus(); + const value = editor.getValue(); + const done = editor.setValue(value, rowIndex, col); + const oldValue = this.getCell(colIndex, rowIndex).content; - if (!this.$editingCell) return; - this.$editingCell.classList.remove('editing'); - this.$editingCell = null; - } - }, { - key: 'getEditor', - value: function getEditor(colIndex, rowIndex, value, parent) { - // debugger; - var obj = this.options.getEditor(colIndex, rowIndex, value, parent); - if (obj && obj.setValue) return obj; + // update cell immediately + this.updateCell(colIndex, rowIndex, value); + $cell.focus(); - // editing fallback - var $input = _dom2.default.create('input', { - type: 'text', - inside: parent - }); - - return { - initValue: function initValue(value) { - $input.focus(); - $input.value = value; - }, - getValue: function getValue() { - return $input.value; - }, - setValue: function setValue(value) { - $input.value = value; - } - }; - } - }, { - key: 'submitEditing', - value: function submitEditing() { - var _this7 = this; - - if (!this.$editingCell) return; - var $cell = this.$editingCell; - - var _$$data8 = _dom2.default.data($cell), - rowIndex = _$$data8.rowIndex, - colIndex = _$$data8.colIndex; - - var col = this.datamanager.getColumn(colIndex); - - if ($cell) { - var editor = this.currentCellEditor; - - if (editor) { - var value = editor.getValue(); - var done = editor.setValue(value, rowIndex, col); - var oldValue = this.getCell(colIndex, rowIndex).content; - - // update cell immediately - this.updateCell(colIndex, rowIndex, value); - $cell.focus(); - - if (done && done.then) { - // revert to oldValue if promise fails - done.catch(function (e) { - console.log(e); - _this7.updateCell(colIndex, rowIndex, oldValue); - }); - } + if (done && done.then) { + // revert to oldValue if promise fails + done.catch((e) => { + console.log(e); + this.updateCell(colIndex, rowIndex, oldValue); + }); } } - - this.currentCellEditor = null; } - }, { - key: 'copyCellContents', - value: function copyCellContents($cell1, $cell2) { - var _this8 = this; - if (!$cell2 && $cell1) { - // copy only focusedCell - var _$$data9 = _dom2.default.data($cell1), - colIndex = _$$data9.colIndex, - rowIndex = _$$data9.rowIndex; + this.currentCellEditor = null; + } - var cell = this.getCell(colIndex, rowIndex); - (0, _utils.copyTextToClipboard)(cell.content); - return; - } - var cells = this.getCellsInRange($cell1, $cell2); + copyCellContents($cell1, $cell2) { + if (!$cell2 && $cell1) { + // copy only focusedCell + const { colIndex, rowIndex } = $.data($cell1); + const cell = this.getCell(colIndex, rowIndex); + copyTextToClipboard(cell.content); + return; + } + const cells = this.getCellsInRange($cell1, $cell2); - if (!cells) return; + if (!cells) return; - var values = cells + const values = cells // get cell objects - .map(function (index) { - return _this8.getCell.apply(_this8, _toConsumableArray(index)); - }) + .map(index => this.getCell(...index)) // convert to array of rows - .reduce(function (acc, curr) { - var rowIndex = curr.rowIndex; + .reduce((acc, curr) => { + const rowIndex = curr.rowIndex; acc[rowIndex] = acc[rowIndex] || []; acc[rowIndex].push(curr.content); @@ -46593,470 +46439,376 @@ var CellManager = function () { return acc; }, []) // join values by tab - .map(function (row) { - return row.join('\t'); - }) + .map(row => row.join('\t')) // join rows by newline .join('\n'); - (0, _utils.copyTextToClipboard)(values); + copyTextToClipboard(values); + } + + activateFilter(colIndex) { + this.columnmanager.toggleFilter(); + this.columnmanager.focusFilter(colIndex); + + if (!this.columnmanager.isFilterShown) { + // put focus back on cell + this.$focusedCell.focus(); } - }, { - key: 'updateCell', - value: function updateCell(colIndex, rowIndex, value) { - var cell = this.datamanager.updateCell(colIndex, rowIndex, { - content: value - }); - this.refreshCell(cell); + } + + updateCell(colIndex, rowIndex, value) { + const cell = this.datamanager.updateCell(colIndex, rowIndex, { + content: value + }); + this.refreshCell(cell); + } + + refreshCell(cell) { + const $cell = $(this.cellSelector(cell.colIndex, cell.rowIndex), this.bodyScrollable); + $cell.innerHTML = this.getCellContent(cell); + } + + isStandardCell(colIndex) { + // Standard cells are in Sr. No and Checkbox column + return colIndex < this.columnmanager.getFirstColumnIndex(); + } + + getCell$(colIndex, rowIndex) { + return $(this.cellSelector(colIndex, rowIndex), this.bodyScrollable); + } + + getAboveCell$($cell) { + const { colIndex } = $.data($cell); + const $aboveRow = $cell.parentElement.previousElementSibling; + + return $(`[data-col-index="${colIndex}"]`, $aboveRow); + } + + getBelowCell$($cell) { + const { colIndex } = $.data($cell); + const $belowRow = $cell.parentElement.nextElementSibling; + + return $(`[data-col-index="${colIndex}"]`, $belowRow); + } + + getLeftCell$($cell) { + return $cell.previousElementSibling; + } + + getRightCell$($cell) { + return $cell.nextElementSibling; + } + + getLeftMostCell$(rowIndex) { + return this.getCell$(this.columnmanager.getFirstColumnIndex(), rowIndex); + } + + getRightMostCell$(rowIndex) { + return this.getCell$(this.columnmanager.getLastColumnIndex(), rowIndex); + } + + getTopMostCell$(colIndex) { + return this.getCell$(colIndex, this.rowmanager.getFirstRowIndex()); + } + + getBottomMostCell$(colIndex) { + return this.getCell$(colIndex, this.rowmanager.getLastRowIndex()); + } + + getCell(colIndex, rowIndex) { + return this.instance.datamanager.getCell(colIndex, rowIndex); + } + + getCellAttr($cell) { + return this.instance.getCellAttr($cell); + } + + getRowHeight() { + return $.style($('.data-table-row', this.bodyScrollable), 'height'); + } + + scrollToCell($cell) { + if ($.inViewport($cell, this.bodyScrollable)) return false; + + const { rowIndex } = $.data($cell); + this.rowmanager.scrollToRow(rowIndex); + return false; + } + + getRowCountPerPage() { + return Math.ceil(this.instance.getViewportHeight() / this.getRowHeight()); + } + + getCellHTML(cell) { + const { rowIndex, colIndex, isHeader, isFilter } = cell; + const dataAttr = makeDataAttributeString({ + rowIndex, + colIndex, + isHeader, + isFilter + }); + + return ` + + ${this.getCellContent(cell)} + + `; + } + + getCellContent(cell) { + const { isHeader } = cell; + + const editable = !isHeader && cell.editable !== false; + const editCellHTML = editable ? this.getEditCellHTML() : ''; + + const sortable = isHeader && cell.sortable !== false; + const sortIndicator = sortable ? '' : ''; + + const resizable = isHeader && cell.resizable !== false; + const resizeColumn = resizable ? '' : ''; + + const hasDropdown = isHeader && cell.dropdown !== false; + const dropdown = hasDropdown ? `
${getDropdownHTML()}
` : ''; + + let contentHTML; + if (cell.isHeader || cell.isFilter || !cell.column.format) { + contentHTML = cell.content; + } else { + contentHTML = cell.column.format(cell.content, cell); } - }, { - key: 'refreshCell', - value: function refreshCell(cell) { - var $cell = (0, _dom2.default)(this.cellSelector(cell.colIndex, cell.rowIndex), this.bodyScrollable); - $cell.innerHTML = this.getCellContent(cell); - } - }, { - key: 'isStandardCell', - value: function isStandardCell(colIndex) { - // Standard cells are in Sr. No and Checkbox column - return colIndex < this.columnmanager.getFirstColumnIndex(); - } - }, { - key: 'getCell$', - value: function getCell$(colIndex, rowIndex) { - return (0, _dom2.default)(this.cellSelector(colIndex, rowIndex), this.bodyScrollable); - } - }, { - key: 'getAboveCell$', - value: function getAboveCell$($cell) { - var _$$data10 = _dom2.default.data($cell), - colIndex = _$$data10.colIndex; - var $aboveRow = $cell.parentElement.previousElementSibling; + return ` +
+ ${(contentHTML)} + ${sortIndicator} + ${resizeColumn} + ${dropdown} +
+ ${editCellHTML} + `; + } - return (0, _dom2.default)('[data-col-index="' + colIndex + '"]', $aboveRow); - } - }, { - key: 'getBelowCell$', - value: function getBelowCell$($cell) { - var _$$data11 = _dom2.default.data($cell), - colIndex = _$$data11.colIndex; + getEditCellHTML() { + return ` +
+ `; + } - var $belowRow = $cell.parentElement.nextElementSibling; - - return (0, _dom2.default)('[data-col-index="' + colIndex + '"]', $belowRow); - } - }, { - key: 'getLeftCell$', - value: function getLeftCell$($cell) { - return $cell.previousElementSibling; - } - }, { - key: 'getRightCell$', - value: function getRightCell$($cell) { - return $cell.nextElementSibling; - } - }, { - key: 'getLeftMostCell$', - value: function getLeftMostCell$(rowIndex) { - return this.getCell$(this.columnmanager.getFirstColumnIndex(), rowIndex); - } - }, { - key: 'getRightMostCell$', - value: function getRightMostCell$(rowIndex) { - return this.getCell$(this.columnmanager.getLastColumnIndex(), rowIndex); - } - }, { - key: 'getTopMostCell$', - value: function getTopMostCell$(colIndex) { - return this.getCell$(colIndex, this.rowmanager.getFirstRowIndex()); - } - }, { - key: 'getBottomMostCell$', - value: function getBottomMostCell$(colIndex) { - return this.getCell$(colIndex, this.rowmanager.getLastRowIndex()); - } - }, { - key: 'getCell', - value: function getCell(colIndex, rowIndex) { - return this.instance.datamanager.getCell(colIndex, rowIndex); - } - }, { - key: 'getCellAttr', - value: function getCellAttr($cell) { - return this.instance.getCellAttr($cell); - } - }, { - key: 'getRowHeight', - value: function getRowHeight() { - return _dom2.default.style((0, _dom2.default)('.data-table-row', this.bodyScrollable), 'height'); - } - }, { - key: 'scrollToCell', - value: function scrollToCell($cell) { - if (_dom2.default.inViewport($cell, this.bodyScrollable)) return false; - - var _$$data12 = _dom2.default.data($cell), - rowIndex = _$$data12.rowIndex; - - this.rowmanager.scrollToRow(rowIndex); - return false; - } - }, { - key: 'getRowCountPerPage', - value: function getRowCountPerPage() { - return Math.ceil(this.instance.getViewportHeight() / this.getRowHeight()); - } - }, { - key: 'getCellHTML', - value: function getCellHTML(cell) { - var rowIndex = cell.rowIndex, - colIndex = cell.colIndex, - isHeader = cell.isHeader; - - var dataAttr = (0, _utils.makeDataAttributeString)({ - rowIndex: rowIndex, - colIndex: colIndex, - isHeader: isHeader - }); - - return '\n \n ' + this.getCellContent(cell) + '\n \n '; - } - }, { - key: 'getCellContent', - value: function getCellContent(cell) { - var isHeader = cell.isHeader; - - - var editable = !isHeader && cell.editable !== false; - var editCellHTML = editable ? this.getEditCellHTML() : ''; - - var sortable = isHeader && cell.sortable !== false; - var sortIndicator = sortable ? '' : ''; - - var resizable = isHeader && cell.resizable !== false; - var resizeColumn = resizable ? '' : ''; - - var hasDropdown = isHeader && cell.dropdown !== false; - var dropdown = hasDropdown ? '
' + (0, _columnmanager.getDropdownHTML)() + '
' : ''; - - var contentHTML = !cell.isHeader && cell.column.format ? cell.column.format(cell.content) : cell.content; - - return '\n
\n ' + contentHTML + '\n ' + sortIndicator + '\n ' + resizeColumn + '\n ' + dropdown + '\n
\n ' + editCellHTML + '\n '; - } - }, { - key: 'getEditCellHTML', - value: function getEditCellHTML() { - return '\n
\n '; - } - }, { - key: 'cellSelector', - value: function cellSelector(colIndex, rowIndex) { - return '.data-table-col[data-col-index="' + colIndex + '"][data-row-index="' + rowIndex + '"]'; - } - }]); - - return CellManager; -}(); - -exports.default = CellManager; -module.exports = exports['default']; - -/***/ }), -/* 7 */ -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE_7__; - -/***/ }), -/* 8 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _dom = __webpack_require__(0); - -var _dom2 = _interopRequireDefault(_dom); - -var _utils = __webpack_require__(1); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var RowManager = function () { - function RowManager(instance) { - _classCallCheck(this, RowManager); + cellSelector(colIndex, rowIndex) { + return `.data-table-col[data-col-index="${colIndex}"][data-row-index="${rowIndex}"]`; + } +} +class RowManager { + constructor(instance) { this.instance = instance; this.options = this.instance.options; this.wrapper = this.instance.wrapper; this.bodyScrollable = this.instance.bodyScrollable; this.bindEvents(); - this.refreshRows = (0, _utils.promisify)(this.refreshRows, this); + this.refreshRows = promisify(this.refreshRows, this); } - _createClass(RowManager, [{ - key: 'bindEvents', - value: function bindEvents() { - this.bindCheckbox(); - } - }, { - key: 'bindCheckbox', - value: function bindCheckbox() { - var _this = this; + get datamanager() { + return this.instance.datamanager; + } - if (!this.options.addCheckboxColumn) return; + get cellmanager() { + return this.instance.cellmanager; + } - // map of checked rows - this.checkMap = []; + bindEvents() { + this.bindCheckbox(); + } - _dom2.default.on(this.wrapper, 'click', '.data-table-col[data-col-index="0"] [type="checkbox"]', function (e, $checkbox) { - var $cell = $checkbox.closest('.data-table-col'); + bindCheckbox() { + if (!this.options.addCheckboxColumn) return; - var _$$data = _dom2.default.data($cell), - rowIndex = _$$data.rowIndex, - isHeader = _$$data.isHeader; + // map of checked rows + this.checkMap = []; - var checked = $checkbox.checked; + $.on(this.wrapper, 'click', '.data-table-col[data-col-index="0"] [type="checkbox"]', (e, $checkbox) => { + const $cell = $checkbox.closest('.data-table-col'); + const { rowIndex, isHeader } = $.data($cell); + const checked = $checkbox.checked; - if (isHeader) { - _this.checkAll(checked); - } else { - _this.checkRow(rowIndex, checked); - } - }); - } - }, { - key: 'refreshRows', - value: function refreshRows() { - this.instance.renderBody(); - this.instance.setDimensions(); - } - }, { - key: 'refreshRow', - value: function refreshRow(row, rowIndex) { - var _this2 = this; - - var _row = this.datamanager.updateRow(row, rowIndex); - - _row.forEach(function (cell) { - _this2.cellmanager.refreshCell(cell); - }); - } - }, { - key: 'getCheckedRows', - value: function getCheckedRows() { - if (!this.checkMap) { - return []; + if (isHeader) { + this.checkAll(checked); + } else { + this.checkRow(rowIndex, checked); } + }); + } - return this.checkMap.map(function (c, rowIndex) { + refreshRows() { + this.instance.renderBody(); + this.instance.setDimensions(); + } + + refreshRow(row, rowIndex) { + const _row = this.datamanager.updateRow(row, rowIndex); + + _row.forEach(cell => { + this.cellmanager.refreshCell(cell); + }); + } + + getCheckedRows() { + if (!this.checkMap) { + return []; + } + + return this.checkMap + .map((c, rowIndex) => { if (c) { return rowIndex; } return null; - }).filter(function (c) { + }) + .filter(c => { return c !== null || c !== undefined; }); - } - }, { - key: 'highlightCheckedRows', - value: function highlightCheckedRows() { - var _this3 = this; + } - this.getCheckedRows().map(function (rowIndex) { - return _this3.checkRow(rowIndex, true); - }); - } - }, { - key: 'checkRow', - value: function checkRow(rowIndex, toggle) { - var value = toggle ? 1 : 0; + highlightCheckedRows() { + this.getCheckedRows() + .map(rowIndex => this.checkRow(rowIndex, true)); + } - // update internal map - this.checkMap[rowIndex] = value; - // set checkbox value explicitly - _dom2.default.each('.data-table-col[data-row-index="' + rowIndex + '"][data-col-index="0"] [type="checkbox"]', this.bodyScrollable).map(function (input) { + checkRow(rowIndex, toggle) { + const value = toggle ? 1 : 0; + + // update internal map + this.checkMap[rowIndex] = value; + // set checkbox value explicitly + $.each(`.data-table-col[data-row-index="${rowIndex}"][data-col-index="0"] [type="checkbox"]`, this.bodyScrollable) + .map(input => { input.checked = toggle; }); - // highlight row - this.highlightRow(rowIndex, toggle); - } - }, { - key: 'checkAll', - value: function checkAll(toggle) { - var value = toggle ? 1 : 0; + // highlight row + this.highlightRow(rowIndex, toggle); + } - // update internal map - if (toggle) { - this.checkMap = Array.from(Array(this.getTotalRows())).map(function (c) { - return value; - }); - } else { - this.checkMap = []; - } - // set checkbox value - _dom2.default.each('.data-table-col[data-col-index="0"] [type="checkbox"]', this.bodyScrollable).map(function (input) { + checkAll(toggle) { + const value = toggle ? 1 : 0; + + // update internal map + if (toggle) { + this.checkMap = Array.from(Array(this.getTotalRows())).map(c => value); + } else { + this.checkMap = []; + } + // set checkbox value + $.each('.data-table-col[data-col-index="0"] [type="checkbox"]', this.bodyScrollable) + .map(input => { input.checked = toggle; }); - // highlight all - this.highlightAll(toggle); + // highlight all + this.highlightAll(toggle); + } + + highlightRow(rowIndex, toggle = true) { + const $row = this.getRow$(rowIndex); + if (!$row) return; + + if (!toggle && this.bodyScrollable.classList.contains('row-highlight-all')) { + $row.classList.add('row-unhighlight'); + return; } - }, { - key: 'highlightRow', - value: function highlightRow(rowIndex) { - var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; - var $row = this.getRow$(rowIndex); - if (!$row) return; + if (toggle && $row.classList.contains('row-unhighlight')) { + $row.classList.remove('row-unhighlight'); + } - if (!toggle && this.bodyScrollable.classList.contains('row-highlight-all')) { - $row.classList.add('row-unhighlight'); - return; - } + this._highlightedRows = this._highlightedRows || {}; - if (toggle && $row.classList.contains('row-unhighlight')) { - $row.classList.remove('row-unhighlight'); - } + if (toggle) { + $row.classList.add('row-highlight'); + this._highlightedRows[rowIndex] = $row; + } else { + $row.classList.remove('row-highlight'); + delete this._highlightedRows[rowIndex]; + } + } - this._highlightedRows = this._highlightedRows || {}; - - if (toggle) { - $row.classList.add('row-highlight'); - this._highlightedRows[rowIndex] = $row; - } else { + highlightAll(toggle = true) { + if (toggle) { + this.bodyScrollable.classList.add('row-highlight-all'); + } else { + this.bodyScrollable.classList.remove('row-highlight-all'); + for (const rowIndex in this._highlightedRows) { + const $row = this._highlightedRows[rowIndex]; $row.classList.remove('row-highlight'); - delete this._highlightedRows[rowIndex]; } + this._highlightedRows = {}; } - }, { - key: 'highlightAll', - value: function highlightAll() { - var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; + } - if (toggle) { - this.bodyScrollable.classList.add('row-highlight-all'); - } else { - this.bodyScrollable.classList.remove('row-highlight-all'); - for (var rowIndex in this._highlightedRows) { - var $row = this._highlightedRows[rowIndex]; - $row.classList.remove('row-highlight'); - } - this._highlightedRows = {}; - } + getRow$(rowIndex) { + return $(`.data-table-row[data-row-index="${rowIndex}"]`, this.bodyScrollable); + } + + getTotalRows() { + return this.datamanager.getRowCount(); + } + + getFirstRowIndex() { + return 0; + } + + getLastRowIndex() { + return this.datamanager.getRowCount() - 1; + } + + scrollToRow(rowIndex) { + rowIndex = +rowIndex; + this._lastScrollTo = this._lastScrollTo || 0; + const $row = this.getRow$(rowIndex); + if ($.inViewport($row, this.bodyScrollable)) return; + + const { height } = $row.getBoundingClientRect(); + const { top, bottom } = this.bodyScrollable.getBoundingClientRect(); + const rowsInView = Math.floor((bottom - top) / height); + + let offset = 0; + if (rowIndex > this._lastScrollTo) { + offset = height * ((rowIndex + 1) - rowsInView); + } else { + offset = height * ((rowIndex + 1) - 1); } - }, { - key: 'getRow$', - value: function getRow$(rowIndex) { - return (0, _dom2.default)('.data-table-row[data-row-index="' + rowIndex + '"]', this.bodyScrollable); + + this._lastScrollTo = rowIndex; + $.scrollTop(this.bodyScrollable, offset); + } + + getRowHTML(row, props) { + const dataAttr = makeDataAttributeString(props); + + if (props.isFilter) { + row = row.map(cell => (Object.assign(cell, { + content: this.getFilterInput({ colIndex: cell.colIndex }), + isFilter: 1, + isHeader: undefined, + editable: false + }))); } - }, { - key: 'getTotalRows', - value: function getTotalRows() { - return this.datamanager.getRowCount(); - } - }, { - key: 'getFirstRowIndex', - value: function getFirstRowIndex() { - return 0; - } - }, { - key: 'getLastRowIndex', - value: function getLastRowIndex() { - return this.datamanager.getRowCount() - 1; - } - }, { - key: 'scrollToRow', - value: function scrollToRow(rowIndex) { - rowIndex = +rowIndex; - this._lastScrollTo = this._lastScrollTo || 0; - var $row = this.getRow$(rowIndex); - if (_dom2.default.inViewport($row, this.bodyScrollable)) return; - var _$row$getBoundingClie = $row.getBoundingClientRect(), - height = _$row$getBoundingClie.height; + return ` + + ${row.map(cell => this.cellmanager.getCellHTML(cell)).join('')} + + `; + } - var _bodyScrollable$getBo = this.bodyScrollable.getBoundingClientRect(), - top = _bodyScrollable$getBo.top, - bottom = _bodyScrollable$getBo.bottom; - - var rowsInView = Math.floor((bottom - top) / height); - - var offset = 0; - if (rowIndex > this._lastScrollTo) { - offset = height * (rowIndex + 1 - rowsInView); - } else { - offset = height * (rowIndex + 1 - 1); - } - - this._lastScrollTo = rowIndex; - _dom2.default.scrollTop(this.bodyScrollable, offset); - } - }, { - key: 'getRowHTML', - value: function getRowHTML(row, props) { - var _this4 = this; - - var dataAttr = (0, _utils.makeDataAttributeString)(props); - - return '\n \n ' + row.map(function (cell) { - return _this4.cellmanager.getCellHTML(cell); - }).join('') + '\n \n '; - } - }, { - key: 'datamanager', - get: function get() { - return this.instance.datamanager; - } - }, { - key: 'cellmanager', - get: function get() { - return this.instance.cellmanager; - } - }]); - - return RowManager; -}(); - -exports.default = RowManager; -module.exports = exports['default']; - -/***/ }), -/* 9 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -exports.getBodyHTML = getBodyHTML; - -var _dom = __webpack_require__(0); - -var _dom2 = _interopRequireDefault(_dom); - -var _clusterize = __webpack_require__(10); - -var _clusterize2 = _interopRequireDefault(_clusterize); - -var _utils = __webpack_require__(1); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var BodyRenderer = function () { - function BodyRenderer(instance) { - _classCallCheck(this, BodyRenderer); + getFilterInput(props) { + const dataAttr = makeDataAttributeString(props); + return ``; + } +} +class BodyRenderer { + constructor(instance) { this.instance = instance; this.options = instance.options; this.datamanager = instance.datamanager; @@ -47064,142 +46816,105 @@ var BodyRenderer = function () { this.cellmanager = instance.cellmanager; this.bodyScrollable = instance.bodyScrollable; this.log = instance.log; - this.appendRemainingData = (0, _utils.promisify)(this.appendRemainingData, this); + this.appendRemainingData = promisify(this.appendRemainingData, this); } - _createClass(BodyRenderer, [{ - key: 'render', - value: function render() { - if (this.options.enableClusterize) { - this.renderBodyWithClusterize(); - } else { - this.renderBodyHTML(); - } + render() { + if (this.options.enableClusterize) { + this.renderBodyWithClusterize(); + } else { + this.renderBodyHTML(); } - }, { - key: 'renderBodyHTML', - value: function renderBodyHTML() { - var rows = this.datamanager.getRows(); + } - this.bodyScrollable.innerHTML = '\n \n ' + getBodyHTML(rows) + '\n
\n '; - this.instance.setDimensions(); - this.restoreState(); - } - }, { - key: 'renderBodyWithClusterize', - value: function renderBodyWithClusterize() { - var _this = this; + renderBodyHTML() { + const rows = this.datamanager.getRows(); - // first page - var rows = this.datamanager.getRows(0, 20); - var initialData = this.getDataForClusterize(rows); + this.bodyScrollable.innerHTML = ` + + ${getBodyHTML(rows)} +
+ `; + this.instance.setDimensions(); + this.restoreState(); + } - if (!this.clusterize) { - // empty body - this.bodyScrollable.innerHTML = '\n \n ' + getBodyHTML([]) + '\n
\n '; + renderBodyWithClusterize() { + // first page + const rows = this.datamanager.getRows(0, 20); + const initialData = this.getDataForClusterize(rows); - // first 20 rows will appended - // rest of them in nextTick - this.clusterize = new _clusterize2.default({ - rows: initialData, - scrollElem: this.bodyScrollable, - contentElem: (0, _dom2.default)('tbody', this.bodyScrollable), - callbacks: { - clusterChanged: function clusterChanged() { - _this.restoreState(); - } - }, - /* eslint-disable */ - no_data_text: this.options.noDataMessage, - no_data_class: 'empty-state' - /* eslint-enable */ - }); + if (!this.clusterize) { + // empty body + this.bodyScrollable.innerHTML = ` + + ${getBodyHTML([])} +
+ `; - // setDimensions requires atleast 1 row to exist in dom - this.instance.setDimensions(); - } else { - this.clusterize.update(initialData); - } - - this.appendRemainingData(); - } - }, { - key: 'restoreState', - value: function restoreState() { - this.rowmanager.highlightCheckedRows(); - this.cellmanager.selectAreaOnClusterChanged(); - this.cellmanager.focusCellOnClusterChanged(); - } - }, { - key: 'appendRemainingData', - value: function appendRemainingData() { - var rows = this.datamanager.getRows(20); - var data = this.getDataForClusterize(rows); - this.clusterize.append(data); - } - }, { - key: 'getDataForClusterize', - value: function getDataForClusterize(rows) { - var _this2 = this; - - return rows.map(function (row) { - return _this2.rowmanager.getRowHTML(row, { rowIndex: row[0].rowIndex }); + // first 20 rows will appended + // rest of them in nextTick + this.clusterize = new Clusterize({ + rows: initialData, + scrollElem: this.bodyScrollable, + contentElem: $('tbody', this.bodyScrollable), + callbacks: { + clusterChanged: () => { + this.restoreState(); + } + }, + /* eslint-disable */ + no_data_text: this.options.noDataMessage, + no_data_class: 'empty-state' + /* eslint-enable */ }); + + // setDimensions requires atleast 1 row to exist in dom + this.instance.setDimensions(); + } else { + this.clusterize.update(initialData); } - }]); - return BodyRenderer; -}(); + this.appendRemainingData(); + } -exports.default = BodyRenderer; + restoreState() { + this.rowmanager.highlightCheckedRows(); + this.cellmanager.selectAreaOnClusterChanged(); + this.cellmanager.focusCellOnClusterChanged(); + } + appendRemainingData() { + const rows = this.datamanager.getRows(20); + const data = this.getDataForClusterize(rows); + this.clusterize.append(data); + } + getDataForClusterize(rows) { + return rows.map((row) => this.rowmanager.getRowHTML(row, { rowIndex: row[0].rowIndex })); + } +} function getBodyHTML(rows) { - var _this3 = this; - - return '\n \n ' + rows.map(function (row) { - return _this3.rowmanager.getRowHTML(row, { rowIndex: row[0].rowIndex }); - }).join('') + '\n \n '; + return ` + + ${rows.map(row => this.rowmanager.getRowHTML(row, { rowIndex: row[0].rowIndex })).join('')} + + `; } -/***/ }), -/* 10 */ -/***/ (function(module, exports) { - -module.exports = __WEBPACK_EXTERNAL_MODULE_10__; - -/***/ }), -/* 11 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _dom = __webpack_require__(0); - -var _dom2 = _interopRequireDefault(_dom); - -var _utils = __webpack_require__(1); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Style = function () { - function Style(instance) { - _classCallCheck(this, Style); - +class Style { + constructor(instance) { this.instance = instance; - (0, _utils.linkProperties)(this, this.instance, ['options', 'datamanager', 'columnmanager', 'header', 'bodyScrollable', 'getColumn']); + linkProperties(this, this.instance, [ + 'options', 'datamanager', 'columnmanager', + 'header', 'bodyScrollable', 'getColumn' + ]); this.scopeClass = 'datatable-instance-' + instance.constructor.instances; instance.datatableWrapper.classList.add(this.scopeClass); - var styleEl = document.createElement('style'); + const styleEl = document.createElement('style'); instance.wrapper.insertBefore(styleEl, instance.datatableWrapper); this.styleEl = styleEl; this.styleSheet = styleEl.sheet; @@ -47207,260 +46922,216 @@ var Style = function () { this.bindResizeWindow(); } - _createClass(Style, [{ - key: 'bindResizeWindow', - value: function bindResizeWindow() { - var _this = this; - - if (this.options.layout === 'fluid') { - _dom2.default.on(window, 'resize', (0, _utils.throttle)(function () { - _this.distributeRemainingWidth(); - _this.refreshColumnWidth(); - _this.setBodyStyle(); - }, 300)); - } + bindResizeWindow() { + if (this.options.layout === 'fluid') { + $.on(window, 'resize', throttle$1(() => { + this.distributeRemainingWidth(); + this.refreshColumnWidth(); + this.setBodyStyle(); + }, 300)); } - }, { - key: 'destroy', - value: function destroy() { - this.styleEl.remove(); - } - }, { - key: 'setStyle', - value: function setStyle(rule, styleMap) { - var index = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1; + } - var styles = Object.keys(styleMap).map(function (prop) { + destroy() { + this.styleEl.remove(); + } + + setStyle(rule, styleMap, index = -1) { + const styles = Object.keys(styleMap) + .map(prop => { if (!prop.includes('-')) { - prop = (0, _utils.camelCaseToDash)(prop); + prop = camelCaseToDash(prop); } - return prop + ':' + styleMap[prop] + ';'; - }).join(''); - var ruleString = '.' + this.scopeClass + ' ' + rule + ' { ' + styles + ' }'; + return `${prop}:${styleMap[prop]};`; + }) + .join(''); + let ruleString = `.${this.scopeClass} ${rule} { ${styles} }`; - var _index = this.styleSheet.cssRules.length; - if (index !== -1) { - this.styleSheet.deleteRule(index); - _index = index; + let _index = this.styleSheet.cssRules.length; + if (index !== -1) { + this.styleSheet.deleteRule(index); + _index = index; + } + + this.styleSheet.insertRule(ruleString, _index); + return _index; + } + + setDimensions() { + this.setHeaderStyle(); + + this.setupMinWidth(); + this.setupNaturalColumnWidth(); + this.setupColumnWidth(); + + this.distributeRemainingWidth(); + this.setColumnStyle(); + this.setDefaultCellHeight(); + this.setBodyStyle(); + } + + setHeaderStyle() { + if (this.options.layout === 'fluid') { + // setting width as 0 will ensure that the + // header doesn't take the available space + $.style(this.header, { + width: 0 + }); + } + + $.style(this.header, { + margin: 0 + }); + + // don't show resize cursor on nonResizable columns + const nonResizableColumnsSelector = this.datamanager.getColumns() + .filter(col => col.resizable === false) + .map(col => col.colIndex) + .map(i => `.data-table-header [data-col-index="${i}"]`) + .join(); + + this.setStyle(nonResizableColumnsSelector, { + cursor: 'pointer' + }); + } + + setupMinWidth() { + $.each('.data-table-col[data-is-header]', this.header).map(col => { + const width = $.style($('.content', col), 'width'); + const { + colIndex + } = $.data(col); + const column = this.getColumn(colIndex); + + if (!column.minWidth) { + // only set this once + column.minWidth = width; + } + }); + } + + setupNaturalColumnWidth() { + if (!$('.data-table-row')) return; + + // set initial width as naturally calculated by table's first row + $.each('.data-table-row[data-row-index="0"] .data-table-col', this.bodyScrollable).map($cell => { + const { + colIndex + } = $.data($cell); + const column = this.datamanager.getColumn(colIndex); + + let naturalWidth = $.style($('.content', $cell), 'width'); + + if (column.id === '_rowIndex') { + // width based on rowCount + const rowCount = this.datamanager.getRowCount(); + const digits = (rowCount + '').length; + if (digits > 2) { + naturalWidth = naturalWidth + ((digits - 2) * 8); + } } - this.styleSheet.insertRule(ruleString, _index); - return _index; - } - }, { - key: 'setDimensions', - value: function setDimensions() { - this.setHeaderStyle(); + column.naturalWidth = naturalWidth; + }); + } - this.setupMinWidth(); - this.setupNaturalColumnWidth(); - this.setupColumnWidth(); - - this.distributeRemainingWidth(); - this.setColumnStyle(); - this.setDefaultCellHeight(); - this.setBodyStyle(); - } - }, { - key: 'setHeaderStyle', - value: function setHeaderStyle() { - if (this.options.layout === 'fluid') { - // setting width as 0 will ensure that the - // header doesn't take the available space - _dom2.default.style(this.header, { - width: 0 - }); - } - - _dom2.default.style(this.header, { - margin: 0 - }); - - // don't show resize cursor on nonResizable columns - var nonResizableColumnsSelector = this.datamanager.getColumns().filter(function (col) { - return col.resizable === false; - }).map(function (col) { - return col.colIndex; - }).map(function (i) { - return '.data-table-header [data-col-index="' + i + '"]'; - }).join(); - - this.setStyle(nonResizableColumnsSelector, { - cursor: 'pointer' - }); - } - }, { - key: 'setupMinWidth', - value: function setupMinWidth() { - var _this2 = this; - - _dom2.default.each('.data-table-col', this.header).map(function (col) { - var width = _dom2.default.style((0, _dom2.default)('.content', col), 'width'); - - var _$$data = _dom2.default.data(col), - colIndex = _$$data.colIndex; - - var column = _this2.getColumn(colIndex); - - if (!column.minWidth) { - // only set this once - column.minWidth = width; - } - }); - } - }, { - key: 'setupNaturalColumnWidth', - value: function setupNaturalColumnWidth() { - var _this3 = this; - - if (!(0, _dom2.default)('.data-table-row')) return; - - // set initial width as naturally calculated by table's first row - _dom2.default.each('.data-table-row[data-row-index="0"] .data-table-col', this.bodyScrollable).map(function ($cell) { - var _$$data2 = _dom2.default.data($cell), - colIndex = _$$data2.colIndex; - - var column = _this3.datamanager.getColumn(colIndex); - - var naturalWidth = _dom2.default.style((0, _dom2.default)('.content', $cell), 'width'); - column.naturalWidth = naturalWidth; - }); - } - }, { - key: 'setupColumnWidth', - value: function setupColumnWidth() { - this.datamanager.getColumns().map(function (column) { - if (column.width === null) { + setupColumnWidth() { + this.datamanager.getColumns() + .map(column => { + if (!column.width) { column.width = column.naturalWidth; } if (column.width < column.minWidth) { column.width = column.minWidth; } }); - } - }, { - key: 'distributeRemainingWidth', - value: function distributeRemainingWidth() { - var _this4 = this; + } - if (this.options.layout !== 'fluid') return; + distributeRemainingWidth() { + if (this.options.layout !== 'fluid') return; - var wrapperWidth = _dom2.default.style(this.instance.datatableWrapper, 'width'); - var headerWidth = _dom2.default.style(this.header, 'width'); - var resizableColumns = this.datamanager.getColumns().filter(function (col) { - return col.resizable; + const wrapperWidth = $.style(this.instance.datatableWrapper, 'width'); + const headerWidth = $.style(this.header, 'width'); + const resizableColumns = this.datamanager.getColumns().filter(col => col.resizable); + const deltaWidth = (wrapperWidth - headerWidth) / resizableColumns.length; + + resizableColumns.map(col => { + const width = $.style(this.getColumnHeaderElement(col.colIndex), 'width'); + let finalWidth = Math.floor(width + deltaWidth) - 2; + + this.datamanager.updateColumn(col.colIndex, { + width: finalWidth }); - var deltaWidth = (wrapperWidth - headerWidth) / resizableColumns.length; + }); + } - resizableColumns.map(function (col) { - var width = _dom2.default.style(_this4.getColumnHeaderElement(col.colIndex), 'width'); - var finalWidth = Math.floor(width + deltaWidth) - 2; + setDefaultCellHeight() { + if (this.__cellHeightSet) return; + const height = this.options.cellHeight || $.style($('.data-table-col', this.instance.datatableWrapper), 'height'); + if (height) { + this.setCellHeight(height); + this.__cellHeightSet = true; + } + } - _this4.datamanager.updateColumn(col.colIndex, { - width: finalWidth - }); - }); - } - }, { - key: 'setDefaultCellHeight', - value: function setDefaultCellHeight() { - if (this.__cellHeightSet) return; - var height = _dom2.default.style((0, _dom2.default)('.data-table-col', this.instance.datatableWrapper), 'height'); - if (height) { - this.setCellHeight(height); - this.__cellHeightSet = true; - } - } - }, { - key: 'setCellHeight', - value: function setCellHeight(height) { - this.setStyle('.data-table-col .content', { - height: height + 'px' - }); - this.setStyle('.data-table-col .edit-cell', { - height: height + 'px' - }); - } - }, { - key: 'setColumnStyle', - value: function setColumnStyle() { - var _this5 = this; + setCellHeight(height) { + this.setStyle('.data-table-col .content', { + height: height + 'px' + }); + this.setStyle('.data-table-col .edit-cell', { + height: height + 'px' + }); + } - // align columns - this.datamanager.getColumns().map(function (column) { + setColumnStyle() { + // align columns + this.datamanager.getColumns() + .map(column => { // alignment if (['left', 'center', 'right'].includes(column.align)) { - _this5.setStyle('[data-col-index="' + column.colIndex + '"]', { + this.setStyle(`[data-col-index="${column.colIndex}"]`, { 'text-align': column.align }); } // width - _this5.columnmanager.setColumnHeaderWidth(column.colIndex); - _this5.columnmanager.setColumnWidth(column.colIndex); + this.columnmanager.setColumnHeaderWidth(column.colIndex); + this.columnmanager.setColumnWidth(column.colIndex); }); - this.setBodyStyle(); - } - }, { - key: 'refreshColumnWidth', - value: function refreshColumnWidth() { - var _this6 = this; + this.setBodyStyle(); + } - this.datamanager.getColumns().map(function (column) { - _this6.columnmanager.setColumnHeaderWidth(column.colIndex); - _this6.columnmanager.setColumnWidth(column.colIndex); + refreshColumnWidth() { + this.datamanager.getColumns() + .map(column => { + this.columnmanager.setColumnHeaderWidth(column.colIndex); + this.columnmanager.setColumnWidth(column.colIndex); }); - } - }, { - key: 'setBodyStyle', - value: function setBodyStyle() { - var width = _dom2.default.style(this.header, 'width'); + } - _dom2.default.style(this.bodyScrollable, { - width: width + 'px' - }); + setBodyStyle() { + const width = $.style(this.header, 'width'); - _dom2.default.style(this.bodyScrollable, { - marginTop: _dom2.default.style(this.header, 'height') + 'px' - }); + $.style(this.bodyScrollable, { + width: width + 'px' + }); - _dom2.default.style((0, _dom2.default)('table', this.bodyScrollable), { - margin: 0 - }); - } - }, { - key: 'getColumnHeaderElement', - value: function getColumnHeaderElement(colIndex) { - colIndex = +colIndex; - if (colIndex < 0) return null; - return (0, _dom2.default)('.data-table-col[data-col-index="' + colIndex + '"]', this.header); - } - }]); + $.style(this.bodyScrollable, { + marginTop: $.style(this.header, 'height') + 'px' + }); - return Style; -}(); + $.style($('table', this.bodyScrollable), { + margin: 0 + }); + } -exports.default = Style; -module.exports = exports['default']; + getColumnHeaderElement(colIndex) { + colIndex = +colIndex; + if (colIndex < 0) return null; + return $(`.data-table-col[data-col-index="${colIndex}"]`, this.header); + } +} -/***/ }), -/* 12 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _dom = __webpack_require__(0); - -var _dom2 = _interopRequireDefault(_dom); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var KEYCODES = { +const KEYCODES = { 13: 'enter', 91: 'meta', 16: 'shift', @@ -47472,120 +47143,83 @@ var KEYCODES = { 40: 'down', 9: 'tab', 27: 'esc', - 67: 'c' + 67: 'c', + 70: 'f' }; -var Keyboard = function () { - function Keyboard(element) { - _classCallCheck(this, Keyboard); - +class Keyboard { + constructor(element) { this.listeners = {}; - _dom2.default.on(element, 'keydown', this.handler.bind(this)); + $.on(element, 'keydown', this.handler.bind(this)); } - _createClass(Keyboard, [{ - key: 'handler', - value: function handler(e) { - var key = KEYCODES[e.keyCode]; + handler(e) { + let key = KEYCODES[e.keyCode]; - if (e.shiftKey && key !== 'shift') { - key = 'shift+' + key; - } + if (e.shiftKey && key !== 'shift') { + key = 'shift+' + key; + } - if (e.ctrlKey && key !== 'ctrl' || e.metaKey && key !== 'meta') { - key = 'ctrl+' + key; - } + if ((e.ctrlKey && key !== 'ctrl') || (e.metaKey && key !== 'meta')) { + key = 'ctrl+' + key; + } - var listeners = this.listeners[key]; + const listeners = this.listeners[key]; - if (listeners && listeners.length > 0) { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - for (var _iterator = listeners[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - var listener = _step.value; - - var preventBubbling = listener(); - if (preventBubbling === undefined || preventBubbling === true) { - e.preventDefault(); - } - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } + if (listeners && listeners.length > 0) { + for (let listener of listeners) { + const preventBubbling = listener(e); + if (preventBubbling === undefined || preventBubbling === true) { + e.preventDefault(); } } } - }, { - key: 'on', - value: function on(key, listener) { - var _this = this; + } - var keys = key.split(',').map(function (k) { - return k.trim(); - }); + on(key, listener) { + const keys = key.split(',').map(k => k.trim()); - keys.map(function (key) { - _this.listeners[key] = _this.listeners[key] || []; - _this.listeners[key].push(listener); - }); - } - }]); + keys.map(key => { + this.listeners[key] = this.listeners[key] || []; + this.listeners[key].push(listener); + }); + } +} - return Keyboard; -}(); - -exports.default = Keyboard; -module.exports = exports['default']; - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = { +var DEFAULT_OPTIONS = { columns: [], data: [], dropdownButton: '▼', - headerDropdown: [{ - label: 'Sort Ascending', - action: function action(column) { - this.sortColumn(column.colIndex, 'asc'); + headerDropdown: [ + { + label: 'Sort Ascending', + action: function (column) { + this.sortColumn(column.colIndex, 'asc'); + } + }, + { + label: 'Sort Descending', + action: function (column) { + this.sortColumn(column.colIndex, 'desc'); + } + }, + { + label: 'Reset sorting', + action: function (column) { + this.sortColumn(column.colIndex, 'none'); + } + }, + { + label: 'Remove column', + action: function (column) { + this.removeColumn(column.colIndex); + } } - }, { - label: 'Sort Descending', - action: function action(column) { - this.sortColumn(column.colIndex, 'desc'); - } - }, { - label: 'Reset sorting', - action: function action(column) { - this.sortColumn(column.colIndex, 'none'); - } - }, { - label: 'Remove column', - action: function action(column) { - this.removeColumn(column.colIndex); - } - }], + ], events: { - onRemoveColumn: function onRemoveColumn(column) {}, - onSwitchColumn: function onSwitchColumn(column1, column2) {}, - onSortColumn: function onSortColumn(column) {} + onRemoveColumn(column) {}, + onSwitchColumn(column1, column2) {}, + onSortColumn(column) {} }, sortIndicator: { asc: '↑', @@ -47593,599 +47227,216 @@ exports.default = { none: '' }, freezeMessage: '', - getEditor: function getEditor() {}, + getEditor: () => {}, addSerialNoColumn: true, addCheckboxColumn: false, enableClusterize: true, enableLogs: false, layout: 'fixed', // fixed, fluid - noDataMessage: 'No Data' -}; -module.exports = exports['default']; - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -// style-loader: Adds some css to the DOM by adding a