├── .bowerrc ├── .gitignore ├── AUTHORS ├── README.md ├── bower.json ├── demo └── demo.css ├── dist ├── jquery.resizableColumns.css ├── jquery.resizableColumns.js ├── jquery.resizableColumns.min.js └── jquery.resizableColumns.min.js.map ├── gulpfile.js ├── index.html ├── less ├── demo.less └── index.less ├── package.json └── src ├── adapter.js ├── class.js ├── constants.js └── index.js /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "vendor" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .sass-cache 2 | node_modules -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Adam Becker (http://ada.mbecker.cc) 2 | Craig Michael Thompson (http://craigsworks.com) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | jquery-resizable-columns 2 | ======================= 3 | 4 | Resizable table columns for jQuery. **[Live Demo](http://dobtco.github.io/jquery-resizable-columns)** 5 | 6 | **New and Improved!** *Now tested and working on Chrome & Firefox (Mac + Windows), and IE 9 + 10. Other browsers might work too, just haven't had time to check.* 7 | 8 | **Size:** < 8kb minified 9 | 10 | #### Dependencies 11 | - jQuery 12 | - [store.js](https://github.com/marcuswestin/store.js/) (or anything similar) for localStorage persistence. 13 | 14 | #### Simple Usage 15 | 16 | ``` 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ... 28 | 29 |
#First NameLast NameUsername
30 | 31 | 36 | ``` 37 | 38 | #### Persist column sizes 39 | 40 | To save column sizes on page reload (or js re-rendering), just pass an object that responds to `get` and `set`. You'll also have to give your <table> a `data-resizable-columns-id` attribute, and your <th>s `data-resizable-column-id` attributes. 41 | 42 | ``` 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | ... 58 | 59 |
#First NameLast NameUsername
60 | 61 | 68 | ``` 69 | 70 | #### License 71 | 72 | MIT 73 | 74 | #### Credits 75 | 76 | There's various versions of this plugin floating around the internet, but they're all outdated in one way or another. Thanks to [http://robau.wordpress.com/2011/06/09/unobtrusive-table-column-resize-with-jquery/]() for a great starting point. 77 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-resizable-columns", 3 | "main": "dist/jquery.resizableColumns.min.js", 4 | "version": "0.2.3", 5 | "homepage": "http://dobtco.github.io/jquery-resizable-columns/", 6 | "authors": [ 7 | "Adam Becker (http://ada.mbecker.cc)", 8 | "Craig Michael Thompson (http://craigsworks.com)" 9 | ], 10 | "main": [ 11 | "dist/jquery.resizableColumns.js", 12 | "dist/jquery.resizableColumns.css" 13 | ], 14 | "description": "Resizable table columns for jQuery", 15 | "keywords": [ 16 | "jquery", 17 | "resizable-columns-table", 18 | "resizable-columns", 19 | "html", 20 | "table resize", 21 | "resizable columns", 22 | "resizable", 23 | "adam becker" 24 | ], 25 | "license": "MIT", 26 | "ignore": [ 27 | "**/.*", 28 | "node_modules", 29 | "bower_components", 30 | "test", 31 | "tests" 32 | ], 33 | "dependencies": { 34 | "jquery": "^1.9.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /demo/demo.css: -------------------------------------------------------------------------------- 1 | img.ribbon { 2 | position: fixed; 3 | z-index: 1; 4 | top: 0; 5 | right: 0; 6 | border: 0; 7 | cursor: pointer; 8 | } 9 | .container { 10 | margin-top: 60px; 11 | } 12 | #username-column { 13 | width: 50px; 14 | } 15 | -------------------------------------------------------------------------------- /dist/jquery.resizableColumns.css: -------------------------------------------------------------------------------- 1 | .rc-handle-container { 2 | position: relative; 3 | } 4 | .rc-handle { 5 | position: absolute; 6 | width: 7px; 7 | cursor: ew-resize; 8 | margin-left: -3px; 9 | z-index: 2; 10 | } 11 | table.rc-table-resizing { 12 | cursor: ew-resize; 13 | } 14 | table.rc-table-resizing thead, 15 | table.rc-table-resizing thead > th, 16 | table.rc-table-resizing thead > th > a { 17 | cursor: ew-resize; 18 | } 19 | -------------------------------------------------------------------------------- /dist/jquery.resizableColumns.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jquery-resizable-columns - Resizable table columns for jQuery 3 | * @date Sat May 16 2015 19:03:57 GMT+0100 (BST) 4 | * @version v0.1.0 5 | * @link http://dobtco.github.io/jquery-resizable-columns/ 6 | * @license MIT 7 | */ 8 | (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 21 | args[_key - 1] = arguments[_key]; 22 | } 23 | 24 | return this.each(function () { 25 | var $table = $(this); 26 | 27 | var api = $table.data(_constants.DATA_API); 28 | if (!api) { 29 | api = new _class2['default']($table, optionsOrMethod); 30 | $table.data(_constants.DATA_API, api); 31 | } else if (typeof optionsOrMethod === 'string') { 32 | return api[optionsOrMethod].apply(api, args); 33 | } 34 | }); 35 | }; 36 | 37 | $.resizableColumns = _class2['default']; 38 | 39 | },{"./class":2,"./constants":3}],2:[function(require,module,exports){ 40 | 'use strict'; 41 | 42 | Object.defineProperty(exports, '__esModule', { 43 | value: true 44 | }); 45 | 46 | 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; }; })(); 47 | 48 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } 49 | 50 | var _constants = require('./constants'); 51 | 52 | /** 53 | Takes a element and makes it's columns resizable across both 54 | mobile and desktop clients. 55 | 56 | @class ResizableColumns 57 | @param $table {jQuery} jQuery-wrapped
element to make resizable 58 | @param options {Object} Configuration object 59 | **/ 60 | 61 | var ResizableColumns = (function () { 62 | function ResizableColumns($table, options) { 63 | _classCallCheck(this, ResizableColumns); 64 | 65 | this.ns = '.rc' + this.count++; 66 | 67 | this.options = $.extend({}, ResizableColumns.defaults, options); 68 | 69 | this.$window = $(window); 70 | this.$ownerDocument = $($table[0].ownerDocument); 71 | this.$table = $table; 72 | 73 | this.refreshHeaders(); 74 | this.restoreColumnWidths(); 75 | this.syncHandleWidths(); 76 | 77 | this.bindEvents(this.$window, 'resize', this.syncHandleWidths.bind(this)); 78 | 79 | if (this.options.start) { 80 | this.bindEvents(this.$table, _constants.EVENT_RESIZE_START, this.options.start); 81 | } 82 | if (this.options.resize) { 83 | this.bindEvents(this.$table, _constants.EVENT_RESIZE, this.options.resize); 84 | } 85 | if (this.options.stop) { 86 | this.bindEvents(this.$table, _constants.EVENT_RESIZE_STOP, this.options.stop); 87 | } 88 | } 89 | 90 | _createClass(ResizableColumns, [{ 91 | key: 'refreshHeaders', 92 | 93 | /** 94 | Refreshes the headers associated with this instances
element and 95 | generates handles for them. Also assigns percentage widths. 96 | @method refreshHeaders 97 | **/ 98 | value: function refreshHeaders() { 99 | // Allow the selector to be both a regular selctor string as well as 100 | // a dynamic callback 101 | var selector = this.options.selector; 102 | if (typeof selector === 'function') { 103 | selector = selector.call(this, this.$table); 104 | } 105 | 106 | // Select all table headers 107 | this.$tableHeaders = this.$table.find(selector); 108 | 109 | // Assign percentage widths first, then create drag handles 110 | this.assignPercentageWidths(); 111 | this.createHandles(); 112 | } 113 | }, { 114 | key: 'createHandles', 115 | 116 | /** 117 | Creates dummy handle elements for all table header columns 118 | @method createHandles 119 | **/ 120 | value: function createHandles() { 121 | var _this = this; 122 | 123 | var ref = this.$handleContainer; 124 | if (ref != null) { 125 | ref.remove(); 126 | } 127 | 128 | this.$handleContainer = $('
'); 129 | this.$table.before(this.$handleContainer); 130 | 131 | this.$tableHeaders.each(function (i, el) { 132 | var $current = _this.$tableHeaders.eq(i); 133 | var $next = _this.$tableHeaders.eq(i + 1); 134 | 135 | if ($next.length === 0 || $current.is(_constants.SELECTOR_UNRESIZABLE) || $next.is(_constants.SELECTOR_UNRESIZABLE)) { 136 | return; 137 | } 138 | 139 | var $handle = $('
').data(_constants.DATA_TH, $(el)).appendTo(_this.$handleContainer); 140 | }); 141 | 142 | this.bindEvents(this.$handleContainer, ['mousedown', 'touchstart'], '.' + _constants.CLASS_HANDLE, this.onPointerDown.bind(this)); 143 | } 144 | }, { 145 | key: 'assignPercentageWidths', 146 | 147 | /** 148 | Assigns a percentage width to all columns based on their current pixel width(s) 149 | @method assignPercentageWidths 150 | **/ 151 | value: function assignPercentageWidths() { 152 | var _this2 = this; 153 | 154 | this.$tableHeaders.each(function (_, el) { 155 | var $el = $(el); 156 | _this2.setWidth($el[0], $el.outerWidth() / _this2.$table.width() * 100); 157 | }); 158 | } 159 | }, { 160 | key: 'syncHandleWidths', 161 | 162 | /** 163 | 164 | @method syncHandleWidths 165 | **/ 166 | value: function syncHandleWidths() { 167 | var _this3 = this; 168 | 169 | var $container = this.$handleContainer; 170 | 171 | $container.width(this.$table.width()); 172 | 173 | $container.find('.' + _constants.CLASS_HANDLE).each(function (_, el) { 174 | var $el = $(el); 175 | 176 | var height = _this3.options.resizeFromBody ? _this3.$table.height() : _this3.$table.find('thead').height(); 177 | 178 | var left = $el.data(_constants.DATA_TH).outerWidth() + ($el.data(_constants.DATA_TH).offset().left - _this3.$handleContainer.offset().left); 179 | 180 | $el.css({ left: left, height: height }); 181 | }); 182 | } 183 | }, { 184 | key: 'saveColumnWidths', 185 | 186 | /** 187 | Persists the column widths in localStorage 188 | @method saveColumnWidths 189 | **/ 190 | value: function saveColumnWidths() { 191 | var _this4 = this; 192 | 193 | this.$tableHeaders.each(function (_, el) { 194 | var $el = $(el); 195 | 196 | if (_this4.options.store && !$el.is(_constants.SELECTOR_UNRESIZABLE)) { 197 | _this4.options.store.set(_this4.generateColumnId($el), _this4.parseWidth(el)); 198 | } 199 | }); 200 | } 201 | }, { 202 | key: 'restoreColumnWidths', 203 | 204 | /** 205 | Retrieves and sets the column widths from localStorage 206 | @method restoreColumnWidths 207 | **/ 208 | value: function restoreColumnWidths() { 209 | var _this5 = this; 210 | 211 | this.$tableHeaders.each(function (_, el) { 212 | var $el = $(el); 213 | 214 | if (_this5.options.store && !$el.is(_constants.SELECTOR_UNRESIZABLE)) { 215 | var width = _this5.options.store.get(_this5.generateColumnId($el)); 216 | 217 | if (width != null) { 218 | _this5.setWidth(el, width); 219 | } 220 | } 221 | }); 222 | } 223 | }, { 224 | key: 'onPointerDown', 225 | 226 | /** 227 | Pointer/mouse down handler 228 | @method onPointerDown 229 | @param event {Object} Event object associated with the interaction 230 | **/ 231 | value: function onPointerDown(event) { 232 | // Only applies to left-click dragging 233 | if (event.which !== 1) { 234 | return; 235 | } 236 | 237 | // If a previous operation is defined, we missed the last mouseup. 238 | // Probably gobbled up by user mousing out the window then releasing. 239 | // We'll simulate a pointerup here prior to it 240 | if (this.operation) { 241 | this.onPointerUp(event); 242 | } 243 | 244 | // Ignore non-resizable columns 245 | var $currentGrip = $(event.currentTarget); 246 | if ($currentGrip.is(_constants.SELECTOR_UNRESIZABLE)) { 247 | return; 248 | } 249 | 250 | var gripIndex = $currentGrip.index(); 251 | var $leftColumn = this.$tableHeaders.eq(gripIndex).not(_constants.SELECTOR_UNRESIZABLE); 252 | var $rightColumn = this.$tableHeaders.eq(gripIndex + 1).not(_constants.SELECTOR_UNRESIZABLE); 253 | 254 | var leftWidth = this.parseWidth($leftColumn[0]); 255 | var rightWidth = this.parseWidth($rightColumn[0]); 256 | 257 | this.operation = { 258 | $leftColumn: $leftColumn, $rightColumn: $rightColumn, $currentGrip: $currentGrip, 259 | 260 | startX: this.getPointerX(event), 261 | 262 | widths: { 263 | left: leftWidth, 264 | right: rightWidth 265 | }, 266 | newWidths: { 267 | left: leftWidth, 268 | right: rightWidth 269 | } 270 | }; 271 | 272 | this.bindEvents(this.$ownerDocument, ['mousemove', 'touchmove'], this.onPointerMove.bind(this)); 273 | this.bindEvents(this.$ownerDocument, ['mouseup', 'touchend'], this.onPointerUp.bind(this)); 274 | 275 | this.$handleContainer.add(this.$table).addClass(_constants.CLASS_TABLE_RESIZING); 276 | 277 | $leftColumn.add($rightColumn).add($currentGrip).addClass(_constants.CLASS_COLUMN_RESIZING); 278 | 279 | this.triggerEvent(_constants.EVENT_RESIZE_START, [$leftColumn, $rightColumn, leftWidth, rightWidth], event); 280 | 281 | event.preventDefault(); 282 | } 283 | }, { 284 | key: 'onPointerMove', 285 | 286 | /** 287 | Pointer/mouse movement handler 288 | @method onPointerMove 289 | @param event {Object} Event object associated with the interaction 290 | **/ 291 | value: function onPointerMove(event) { 292 | var op = this.operation; 293 | if (!this.operation) { 294 | return; 295 | } 296 | 297 | // Determine the delta change between start and new mouse position, as a percentage of the table width 298 | var difference = (this.getPointerX(event) - op.startX) / this.$table.width() * 100; 299 | if (difference === 0) { 300 | return; 301 | } 302 | 303 | var leftColumn = op.$leftColumn[0]; 304 | var rightColumn = op.$rightColumn[0]; 305 | var widthLeft = undefined, 306 | widthRight = undefined; 307 | 308 | if (difference > 0) { 309 | widthLeft = this.constrainWidth(op.widths.left + (op.widths.right - op.newWidths.right)); 310 | widthRight = this.constrainWidth(op.widths.right - difference); 311 | } else if (difference < 0) { 312 | widthLeft = this.constrainWidth(op.widths.left + difference); 313 | widthRight = this.constrainWidth(op.widths.right + (op.widths.left - op.newWidths.left)); 314 | } 315 | 316 | if (leftColumn) { 317 | this.setWidth(leftColumn, widthLeft); 318 | } 319 | if (rightColumn) { 320 | this.setWidth(rightColumn, widthRight); 321 | } 322 | 323 | op.newWidths.left = widthLeft; 324 | op.newWidths.right = widthRight; 325 | 326 | return this.triggerEvent(_constants.EVENT_RESIZE, [op.$leftColumn, op.$rightColumn, widthLeft, widthRight], event); 327 | } 328 | }, { 329 | key: 'onPointerUp', 330 | 331 | /** 332 | Pointer/mouse release handler 333 | @method onPointerUp 334 | @param event {Object} Event object associated with the interaction 335 | **/ 336 | value: function onPointerUp(event) { 337 | var op = this.operation; 338 | if (!this.operation) { 339 | return; 340 | } 341 | 342 | this.unbindEvents(this.$ownerDocument, ['mouseup', 'touchend', 'mousemove', 'touchmove']); 343 | 344 | this.$handleContainer.add(this.$table).removeClass(_constants.CLASS_TABLE_RESIZING); 345 | 346 | op.$leftColumn.add(op.$rightColumn).add(op.$currentGrip).removeClass(_constants.CLASS_COLUMN_RESIZING); 347 | 348 | this.syncHandleWidths(); 349 | this.saveColumnWidths(); 350 | 351 | this.operation = null; 352 | 353 | return this.triggerEvent(_constants.EVENT_RESIZE_STOP, [op.$leftColumn, op.$rightColumn, op.newWidths.left, op.newWidths.right], event); 354 | } 355 | }, { 356 | key: 'destroy', 357 | 358 | /** 359 | Removes all event listeners, data, and added DOM elements. Takes 360 | the
element back to how it was, and returns it 361 | @method destroy 362 | @return {jQuery} Original jQuery-wrapped
element 363 | **/ 364 | value: function destroy() { 365 | var $table = this.$table; 366 | var $handles = this.$handleContainer.find('.' + _constants.CLASS_HANDLE); 367 | 368 | this.unbindEvents(this.$window.add(this.$ownerDocument).add(this.$table).add($handles)); 369 | 370 | $handles.removeData(_constants.DATA_TH); 371 | $table.removeData(_constants.DATA_API); 372 | 373 | this.$handleContainer.remove(); 374 | this.$handleContainer = null; 375 | this.$tableHeaders = null; 376 | this.$table = null; 377 | 378 | return $table; 379 | } 380 | }, { 381 | key: 'bindEvents', 382 | 383 | /** 384 | Binds given events for this instance to the given target DOMElement 385 | @private 386 | @method bindEvents 387 | @param target {jQuery} jQuery-wrapped DOMElement to bind events to 388 | @param events {String|Array} Event name (or array of) to bind 389 | @param selectorOrCallback {String|Function} Selector string or callback 390 | @param [callback] {Function} Callback method 391 | **/ 392 | value: function bindEvents($target, events, selectorOrCallback, callback) { 393 | if (typeof events === 'string') { 394 | events = events + this.ns; 395 | } else { 396 | events = events.join(this.ns + ' ') + this.ns; 397 | } 398 | 399 | if (arguments.length > 3) { 400 | $target.on(events, selectorOrCallback, callback); 401 | } else { 402 | $target.on(events, selectorOrCallback); 403 | } 404 | } 405 | }, { 406 | key: 'unbindEvents', 407 | 408 | /** 409 | Unbinds events specific to this instance from the given target DOMElement 410 | @private 411 | @method unbindEvents 412 | @param target {jQuery} jQuery-wrapped DOMElement to unbind events from 413 | @param events {String|Array} Event name (or array of) to unbind 414 | **/ 415 | value: function unbindEvents($target, events) { 416 | if (typeof events === 'string') { 417 | events = events + this.ns; 418 | } else if (events != null) { 419 | events = events.join(this.ns + ' ') + this.ns; 420 | } else { 421 | events = this.ns; 422 | } 423 | 424 | $target.off(events); 425 | } 426 | }, { 427 | key: 'triggerEvent', 428 | 429 | /** 430 | Triggers an event on the
element for a given type with given 431 | arguments, also setting and allowing access to the originalEvent if 432 | given. Returns the result of the triggered event. 433 | @private 434 | @method triggerEvent 435 | @param type {String} Event name 436 | @param args {Array} Array of arguments to pass through 437 | @param [originalEvent] If given, is set on the event object 438 | @return {Mixed} Result of the event trigger action 439 | **/ 440 | value: function triggerEvent(type, args, originalEvent) { 441 | var event = $.Event(type); 442 | if (event.originalEvent) { 443 | event.originalEvent = $.extend({}, originalEvent); 444 | } 445 | 446 | return this.$table.trigger(event, [this].concat(args || [])); 447 | } 448 | }, { 449 | key: 'generateColumnId', 450 | 451 | /** 452 | Calculates a unique column ID for a given column DOMElement 453 | @private 454 | @method generateColumnId 455 | @param $el {jQuery} jQuery-wrapped column element 456 | @return {String} Column ID 457 | **/ 458 | value: function generateColumnId($el) { 459 | return this.$table.data(_constants.DATA_COLUMNS_ID) + '-' + $el.data(_constants.DATA_COLUMN_ID); 460 | } 461 | }, { 462 | key: 'parseWidth', 463 | 464 | /** 465 | Parses a given DOMElement's width into a float 466 | @private 467 | @method parseWidth 468 | @param element {DOMElement} Element to get width of 469 | @return {Number} Element's width as a float 470 | **/ 471 | value: function parseWidth(element) { 472 | return element ? parseFloat(element.style.width.replace('%', '')) : 0; 473 | } 474 | }, { 475 | key: 'setWidth', 476 | 477 | /** 478 | Sets the percentage width of a given DOMElement 479 | @private 480 | @method setWidth 481 | @param element {DOMElement} Element to set width on 482 | @param width {Number} Width, as a percentage, to set 483 | **/ 484 | value: function setWidth(element, width) { 485 | width = width.toFixed(2); 486 | width = width > 0 ? width : 0; 487 | element.style.width = width + '%'; 488 | } 489 | }, { 490 | key: 'constrainWidth', 491 | 492 | /** 493 | Constrains a given width to the minimum and maximum ranges defined in 494 | the `minWidth` and `maxWidth` configuration options, respectively. 495 | @private 496 | @method constrainWidth 497 | @param width {Number} Width to constrain 498 | @return {Number} Constrained width 499 | **/ 500 | value: function constrainWidth(width) { 501 | if (this.options.minWidth != undefined) { 502 | width = Math.max(this.options.minWidth, width); 503 | } 504 | 505 | if (this.options.maxWidth != undefined) { 506 | width = Math.min(this.options.maxWidth, width); 507 | } 508 | 509 | return width; 510 | } 511 | }, { 512 | key: 'getPointerX', 513 | 514 | /** 515 | Given a particular Event object, retrieves the current pointer offset along 516 | the horizontal direction. Accounts for both regular mouse clicks as well as 517 | pointer-like systems (mobiles, tablets etc.) 518 | @private 519 | @method getPointerX 520 | @param event {Object} Event object associated with the interaction 521 | @return {Number} Horizontal pointer offset 522 | **/ 523 | value: function getPointerX(event) { 524 | if (event.type.indexOf('touch') === 0) { 525 | return (event.originalEvent.touches[0] || event.originalEvent.changedTouches[0]).pageX; 526 | } 527 | return event.pageX; 528 | } 529 | }]); 530 | 531 | return ResizableColumns; 532 | })(); 533 | 534 | exports['default'] = ResizableColumns; 535 | 536 | ResizableColumns.defaults = { 537 | selector: function selector($table) { 538 | if ($table.find('thead').length) { 539 | return _constants.SELECTOR_TH; 540 | } 541 | 542 | return _constants.SELECTOR_TD; 543 | }, 544 | store: window.store, 545 | syncHandlers: true, 546 | resizeFromBody: true, 547 | maxWidth: null, 548 | minWidth: 0.01 549 | }; 550 | 551 | ResizableColumns.count = 0; 552 | module.exports = exports['default']; 553 | 554 | },{"./constants":3}],3:[function(require,module,exports){ 555 | 'use strict'; 556 | 557 | Object.defineProperty(exports, '__esModule', { 558 | value: true 559 | }); 560 | var DATA_API = 'resizableColumns'; 561 | exports.DATA_API = DATA_API; 562 | var DATA_COLUMNS_ID = 'resizable-columns-id'; 563 | exports.DATA_COLUMNS_ID = DATA_COLUMNS_ID; 564 | var DATA_COLUMN_ID = 'resizable-column-id'; 565 | exports.DATA_COLUMN_ID = DATA_COLUMN_ID; 566 | var DATA_TH = 'th'; 567 | 568 | exports.DATA_TH = DATA_TH; 569 | var CLASS_TABLE_RESIZING = 'rc-table-resizing'; 570 | exports.CLASS_TABLE_RESIZING = CLASS_TABLE_RESIZING; 571 | var CLASS_COLUMN_RESIZING = 'rc-column-resizing'; 572 | exports.CLASS_COLUMN_RESIZING = CLASS_COLUMN_RESIZING; 573 | var CLASS_HANDLE = 'rc-handle'; 574 | exports.CLASS_HANDLE = CLASS_HANDLE; 575 | var CLASS_HANDLE_CONTAINER = 'rc-handle-container'; 576 | 577 | exports.CLASS_HANDLE_CONTAINER = CLASS_HANDLE_CONTAINER; 578 | var EVENT_RESIZE_START = 'column:resize:start'; 579 | exports.EVENT_RESIZE_START = EVENT_RESIZE_START; 580 | var EVENT_RESIZE = 'column:resize'; 581 | exports.EVENT_RESIZE = EVENT_RESIZE; 582 | var EVENT_RESIZE_STOP = 'column:resize:stop'; 583 | 584 | exports.EVENT_RESIZE_STOP = EVENT_RESIZE_STOP; 585 | var SELECTOR_TH = 'tr:first > th:visible'; 586 | exports.SELECTOR_TH = SELECTOR_TH; 587 | var SELECTOR_TD = 'tr:first > td:visible'; 588 | exports.SELECTOR_TD = SELECTOR_TD; 589 | var SELECTOR_UNRESIZABLE = '[data-noresize]'; 590 | exports.SELECTOR_UNRESIZABLE = SELECTOR_UNRESIZABLE; 591 | 592 | },{}],4:[function(require,module,exports){ 593 | 'use strict'; 594 | 595 | Object.defineProperty(exports, '__esModule', { 596 | value: true 597 | }); 598 | 599 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } 600 | 601 | var _class = require('./class'); 602 | 603 | var _class2 = _interopRequireDefault(_class); 604 | 605 | var _adapter = require('./adapter'); 606 | 607 | var _adapter2 = _interopRequireDefault(_adapter); 608 | 609 | exports['default'] = _class2['default']; 610 | module.exports = exports['default']; 611 | 612 | },{"./adapter":1,"./class":2}]},{},[4]) 613 | 614 | 615 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvYWRhcHRlci5qcyIsInNyYy9jbGFzcy5qcyIsInNyYy9jb25zdGFudHMuanMiLCJzcmMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O3FCQ0E2QixTQUFTOzs7O3lCQUNmLGFBQWE7O0FBRXBDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEdBQUcsVUFBUyxlQUFlLEVBQVc7bUNBQU4sSUFBSTtBQUFKLE1BQUk7OztBQUN4RCxRQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBVztBQUMzQixNQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRXJCLE1BQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLFlBTmYsUUFBUSxDQU1pQixDQUFDO0FBQ2hDLE1BQUksQ0FBQyxHQUFHLEVBQUU7QUFDVCxNQUFHLEdBQUcsdUJBQXFCLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNwRCxTQUFNLENBQUMsSUFBSSxZQVROLFFBQVEsRUFTUyxHQUFHLENBQUMsQ0FBQztHQUMzQixNQUVJLElBQUksT0FBTyxlQUFlLEtBQUssUUFBUSxFQUFFO0FBQzdDLFVBQU8sR0FBRyxDQUFDLGVBQWUsT0FBQyxDQUFwQixHQUFHLEVBQXFCLElBQUksQ0FBQyxDQUFDO0dBQ3JDO0VBQ0QsQ0FBQyxDQUFDO0NBQ0gsQ0FBQzs7QUFFRixDQUFDLENBQUMsZ0JBQWdCLHFCQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7O3lCQ0hqQyxhQUFhOzs7Ozs7Ozs7OztJQVVHLGdCQUFnQjtBQUN6QixVQURTLGdCQUFnQixDQUN4QixNQUFNLEVBQUUsT0FBTyxFQUFFO3dCQURULGdCQUFnQjs7QUFFbkMsTUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztBQUUvQixNQUFJ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QUM7UUFBdkMsY0FBYyxHQUFkLGNBQWM7QUFDcEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDOztRQUFmLE9BQU8sR0FBUCxPQUFPO0FBRWIsSUFBTSxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztRQUEzQyxvQkFBb0IsR0FBcEIsb0JBQW9CO0FBQzFCLElBQU0scUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7UUFBN0MscUJBQXFCLEdBQXJCLHFCQUFxQjtBQUMzQixJQUFNLFlBQVksR0FBRyxXQUFXLENBQUM7UUFBM0IsWUFBWSxHQUFaLFlBQVk7QUFDbEIsSUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQzs7UUFBL0Msc0JBQXNCLEdBQXRCLHNCQUFzQjtBQUU1QixJQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDO1FBQTNDLGtCQUFrQixHQUFsQixrQkFBa0I7QUFDeEIsSUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDO1FBQS9CLFlBQVksR0FBWixZQUFZO0FBQ2xCLElBQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7O1FBQXpDLGlCQUFpQixHQUFqQixpQkFBaUI7QUFFdkIsSUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7UUFBdEMsV0FBVyxHQUFYLFdBQVc7QUFDakIsSUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7UUFBdEMsV0FBVyxHQUFYLFdBQVc7QUFDakIsSUFBTSxvQkFBb0Isb0JBQW9CLENBQUM7UUFBekMsb0JBQW9CLEdBQXBCLG9CQUFvQjs7Ozs7Ozs7Ozs7cUJDaEJKLFNBQVM7Ozs7dUJBQ2xCLFdBQVciLCJmaWxlIjoianF1ZXJ5LnJlc2l6YWJsZUNvbHVtbnMuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8iLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsImltcG9ydCBSZXNpemFibGVDb2x1bW5zIGZyb20gJy4vY2xhc3MnO1xuaW1wb3J0IHtEQVRBX0FQSX0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4kLmZuLnJlc2l6YWJsZUNvbHVtbnMgPSBmdW5jdGlvbihvcHRpb25zT3JNZXRob2QsIC4uLmFyZ3MpIHtcblx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRsZXQgJHRhYmxlID0gJCh0aGlzKTtcblxuXHRcdGxldCBhcGkgPSAkdGFibGUuZGF0YShEQVRBX0FQSSk7XG5cdFx0aWYgKCFhcGkpIHtcblx0XHRcdGFwaSA9IG5ldyBSZXNpemFibGVDb2x1bW5zKCR0YWJsZSwgb3B0aW9uc09yTWV0aG9kKTtcblx0XHRcdCR0YWJsZS5kYXRhKERBVEFfQVBJLCBhcGkpO1xuXHRcdH1cblxuXHRcdGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zT3JNZXRob2QgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gYXBpW29wdGlvbnNPck1ldGhvZF0oLi4uYXJncyk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbiQucmVzaXphYmxlQ29sdW1ucyA9IFJlc2l6YWJsZUNvbHVtbnM7XG4iLCJpbXBvcnQge1xuXHREQVRBX0FQSSxcblx0REFUQV9DT0xVTU5TX0lELFxuXHREQVRBX0NPTFVNTl9JRCxcblx0REFUQV9USCxcblx0Q0xBU1NfVEFCTEVfUkVTSVpJTkcsXG5cdENMQVNTX0NPTFVNTl9SRVNJWklORyxcblx0Q0xBU1NfSEFORExFLFxuXHRDTEFTU19IQU5ETEVfQ09OVEFJTkVSLFxuXHRFVkVOVF9SRVNJWkVfU1RBUlQsXG5cdEVWRU5UX1JFU0laRSxcblx0RVZFTlRfUkVTSVpFX1NUT1AsXG5cdFNFTEVDVE9SX1RILFxuXHRTRUxFQ1RPUl9URCxcblx0U0VMRUNUT1JfVU5SRVNJWkFCTEVcbn1cbmZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG5UYWtlcyBhIDx0YWJsZSAvPiBlbGVtZW50IGFuZCBtYWtlcyBpdCdzIGNvbHVtbnMgcmVzaXphYmxlIGFjcm9zcyBib3RoXG5tb2JpbGUgYW5kIGRlc2t0b3AgY2xpZW50cy5cblxuQGNsYXNzIFJlc2l6YWJsZUNvbHVtbnNcbkBwYXJhbSAkdGFibGUge2pRdWVyeX0galF1ZXJ5LXdyYXBwZWQgPHRhYmxlPiBlbGVtZW50IHRvIG1ha2UgcmVzaXphYmxlXG5AcGFyYW0gb3B0aW9ucyB7T2JqZWN0fSBDb25maWd1cmF0aW9uIG9iamVjdFxuKiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNpemFibGVDb2x1bW5zIHtcblx0Y29uc3RydWN0b3IoJHRhYmxlLCBvcHRpb25zKSB7XG5cdFx0dGhpcy5ucyA9ICcucmMnICsgdGhpcy5jb3VudCsrO1xuXG5cdFx0dGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFJlc2l6YWJsZUNvbHVtbnMuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG5cdFx0dGhpcy4kd2luZG93ID0gJCh3aW5kb3cpO1xuXHRcdHRoaXMuJG93bmVyRG9jdW1lbnQgPSAkKCR0YWJsZVswXS5vd25lckRvY3VtZW50KTtcblx0XHR0aGlzLiR0YWJsZSA9ICR0YWJsZTtcblxuXHRcdHRoaXMucmVmcmVzaEhlYWRlcnMoKTtcblx0XHR0aGlzLnJlc3RvcmVDb2x1bW5XaWR0aHMoKTtcblx0XHR0aGlzLnN5bmNIYW5kbGVXaWR0aHMoKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLiR3aW5kb3csICdyZXNpemUnLCB0aGlzLnN5bmNIYW5kbGVXaWR0aHMuYmluZCh0aGlzKSk7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XG5cdFx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kdGFibGUsIEVWRU5UX1JFU0laRV9TVEFSVCwgdGhpcy5vcHRpb25zLnN0YXJ0KTtcblx0XHR9XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5yZXNpemUpIHtcblx0XHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLiR0YWJsZSwgRVZFTlRfUkVTSVpFLCB0aGlzLm9wdGlvbnMucmVzaXplKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5zdG9wKSB7XG5cdFx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kdGFibGUsIEVWRU5UX1JFU0laRV9TVE9QLCB0aGlzLm9wdGlvbnMuc3RvcCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdFJlZnJlc2hlcyB0aGUgaGVhZGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZXMgPHRhYmxlLz4gZWxlbWVudCBhbmRcblx0Z2VuZXJhdGVzIGhhbmRsZXMgZm9yIHRoZW0uIEFsc28gYXNzaWducyBwZXJjZW50YWdlIHdpZHRocy5cblxuXHRAbWV0aG9kIHJlZnJlc2hIZWFkZXJzXG5cdCoqL1xuXHRyZWZyZXNoSGVhZGVycygpIHtcblx0XHQvLyBBbGxvdyB0aGUgc2VsZWN0b3IgdG8gYmUgYm90aCBhIHJlZ3VsYXIgc2VsY3RvciBzdHJpbmcgYXMgd2VsbCBhc1xuXHRcdC8vIGEgZHluYW1pYyBjYWxsYmFja1xuXHRcdGxldCBzZWxlY3RvciA9IHRoaXMub3B0aW9ucy5zZWxlY3Rvcjtcblx0XHRpZih0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3IuY2FsbCh0aGlzLCB0aGlzLiR0YWJsZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VsZWN0IGFsbCB0YWJsZSBoZWFkZXJzXG5cdFx0dGhpcy4kdGFibGVIZWFkZXJzID0gdGhpcy4kdGFibGUuZmluZChzZWxlY3Rvcik7XG5cblx0XHQvLyBBc3NpZ24gcGVyY2VudGFnZSB3aWR0aHMgZmlyc3QsIHRoZW4gY3JlYXRlIGRyYWcgaGFuZGxlc1xuXHRcdHRoaXMuYXNzaWduUGVyY2VudGFnZVdpZHRocygpO1xuXHRcdHRoaXMuY3JlYXRlSGFuZGxlcygpO1xuXHR9XG5cblx0LyoqXG5cdENyZWF0ZXMgZHVtbXkgaGFuZGxlIGVsZW1lbnRzIGZvciBhbGwgdGFibGUgaGVhZGVyIGNvbHVtbnNcblxuXHRAbWV0aG9kIGNyZWF0ZUhhbmRsZXNcblx0KiovXG5cdGNyZWF0ZUhhbmRsZXMoKSB7XG5cdFx0bGV0IHJlZiA9IHRoaXMuJGhhbmRsZUNvbnRhaW5lcjtcblx0XHRpZiAocmVmICE9IG51bGwpIHtcblx0XHRcdHJlZi5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHR0aGlzLiRoYW5kbGVDb250YWluZXIgPSAkKGA8ZGl2IGNsYXNzPScke0NMQVNTX0hBTkRMRV9DT05UQUlORVJ9JyAvPmApXG5cdFx0dGhpcy4kdGFibGUuYmVmb3JlKHRoaXMuJGhhbmRsZUNvbnRhaW5lcik7XG5cblx0XHR0aGlzLiR0YWJsZUhlYWRlcnMuZWFjaCgoaSwgZWwpID0+IHtcblx0XHRcdGxldCAkY3VycmVudCA9IHRoaXMuJHRhYmxlSGVhZGVycy5lcShpKTtcblx0XHRcdGxldCAkbmV4dCA9IHRoaXMuJHRhYmxlSGVhZGVycy5lcShpICsgMSk7XG5cblx0XHRcdGlmICgkbmV4dC5sZW5ndGggPT09IDAgfHwgJGN1cnJlbnQuaXMoU0VMRUNUT1JfVU5SRVNJWkFCTEUpIHx8ICRuZXh0LmlzKFNFTEVDVE9SX1VOUkVTSVpBQkxFKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCAkaGFuZGxlID0gJChgPGRpdiBjbGFzcz0nJHtDTEFTU19IQU5ETEV9JyAvPmApXG5cdFx0XHRcdC5kYXRhKERBVEFfVEgsICQoZWwpKVxuXHRcdFx0XHQuYXBwZW5kVG8odGhpcy4kaGFuZGxlQ29udGFpbmVyKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLiRoYW5kbGVDb250YWluZXIsIFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwgJy4nK0NMQVNTX0hBTkRMRSwgdGhpcy5vblBvaW50ZXJEb3duLmJpbmQodGhpcykpO1xuXHR9XG5cblx0LyoqXG5cdEFzc2lnbnMgYSBwZXJjZW50YWdlIHdpZHRoIHRvIGFsbCBjb2x1bW5zIGJhc2VkIG9uIHRoZWlyIGN1cnJlbnQgcGl4ZWwgd2lkdGgocylcblxuXHRAbWV0aG9kIGFzc2lnblBlcmNlbnRhZ2VXaWR0aHNcblx0KiovXG5cdGFzc2lnblBlcmNlbnRhZ2VXaWR0aHMoKSB7XG5cdFx0dGhpcy4kdGFibGVIZWFkZXJzLmVhY2goKF8sIGVsKSA9PiB7XG5cdFx0XHRsZXQgJGVsID0gJChlbCk7XG5cdFx0XHR0aGlzLnNldFdpZHRoKCRlbFswXSwgJGVsLm91dGVyV2lkdGgoKSAvIHRoaXMuJHRhYmxlLndpZHRoKCkgKiAxMDApO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cblxuXHRAbWV0aG9kIHN5bmNIYW5kbGVXaWR0aHNcblx0KiovXG5cdHN5bmNIYW5kbGVXaWR0aHMoKSB7XG5cdFx0bGV0ICRjb250YWluZXIgPSB0aGlzLiRoYW5kbGVDb250YWluZXJcblxuXHRcdCRjb250YWluZXIud2lkdGgodGhpcy4kdGFibGUud2lkdGgoKSk7XG5cblx0XHQkY29udGFpbmVyLmZpbmQoJy4nK0NMQVNTX0hBTkRMRSkuZWFjaCgoXywgZWwpID0+IHtcblx0XHRcdGxldCAkZWwgPSAkKGVsKTtcblxuXHRcdFx0bGV0IGhlaWdodCA9IHRoaXMub3B0aW9ucy5yZXNpemVGcm9tQm9keSA/XG5cdFx0XHRcdHRoaXMuJHRhYmxlLmhlaWdodCgpIDpcblx0XHRcdFx0dGhpcy4kdGFibGUuZmluZCgndGhlYWQnKS5oZWlnaHQoKTtcblxuXHRcdFx0bGV0IGxlZnQgPSAkZWwuZGF0YShEQVRBX1RIKS5vdXRlcldpZHRoKCkgKyAoXG5cdFx0XHRcdCRlbC5kYXRhKERBVEFfVEgpLm9mZnNldCgpLmxlZnQgLSB0aGlzLiRoYW5kbGVDb250YWluZXIub2Zmc2V0KCkubGVmdFxuXHRcdFx0KTtcblxuXHRcdFx0JGVsLmNzcyh7IGxlZnQsIGhlaWdodCB9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHRQZXJzaXN0cyB0aGUgY29sdW1uIHdpZHRocyBpbiBsb2NhbFN0b3JhZ2VcblxuXHRAbWV0aG9kIHNhdmVDb2x1bW5XaWR0aHNcblx0KiovXG5cdHNhdmVDb2x1bW5XaWR0aHMoKSB7XG5cdFx0dGhpcy4kdGFibGVIZWFkZXJzLmVhY2goKF8sIGVsKSA9PiB7XG5cdFx0XHRsZXQgJGVsID0gJChlbCk7XG5cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuc3RvcmUgJiYgISRlbC5pcyhTRUxFQ1RPUl9VTlJFU0laQUJMRSkpIHtcblx0XHRcdFx0dGhpcy5vcHRpb25zLnN0b3JlLnNldChcblx0XHRcdFx0XHR0aGlzLmdlbmVyYXRlQ29sdW1uSWQoJGVsKSxcblx0XHRcdFx0XHR0aGlzLnBhcnNlV2lkdGgoZWwpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0UmV0cmlldmVzIGFuZCBzZXRzIHRoZSBjb2x1bW4gd2lkdGhzIGZyb20gbG9jYWxTdG9yYWdlXG5cblx0QG1ldGhvZCByZXN0b3JlQ29sdW1uV2lkdGhzXG5cdCoqL1xuXHRyZXN0b3JlQ29sdW1uV2lkdGhzKCkge1xuXHRcdHRoaXMuJHRhYmxlSGVhZGVycy5lYWNoKChfLCBlbCkgPT4ge1xuXHRcdFx0bGV0ICRlbCA9ICQoZWwpO1xuXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMuc3RvcmUgJiYgISRlbC5pcyhTRUxFQ1RPUl9VTlJFU0laQUJMRSkpIHtcblx0XHRcdFx0bGV0IHdpZHRoID0gdGhpcy5vcHRpb25zLnN0b3JlLmdldChcblx0XHRcdFx0XHR0aGlzLmdlbmVyYXRlQ29sdW1uSWQoJGVsKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmKHdpZHRoICE9IG51bGwpIHtcblx0XHRcdFx0XHR0aGlzLnNldFdpZHRoKGVsLCB3aWR0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHRQb2ludGVyL21vdXNlIGRvd24gaGFuZGxlclxuXG5cdEBtZXRob2Qgb25Qb2ludGVyRG93blxuXHRAcGFyYW0gZXZlbnQge09iamVjdH0gRXZlbnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJhY3Rpb25cblx0KiovXG5cdG9uUG9pbnRlckRvd24oZXZlbnQpIHtcblx0XHQvLyBPbmx5IGFwcGxpZXMgdG8gbGVmdC1jbGljayBkcmFnZ2luZ1xuXHRcdGlmKGV2ZW50LndoaWNoICE9PSAxKSB7IHJldHVybjsgfVxuXG5cdFx0Ly8gSWYgYSBwcmV2aW91cyBvcGVyYXRpb24gaXMgZGVmaW5lZCwgd2UgbWlzc2VkIHRoZSBsYXN0IG1vdXNldXAuXG5cdFx0Ly8gUHJvYmFibHkgZ29iYmxlZCB1cCBieSB1c2VyIG1vdXNpbmcgb3V0IHRoZSB3aW5kb3cgdGhlbiByZWxlYXNpbmcuXG5cdFx0Ly8gV2UnbGwgc2ltdWxhdGUgYSBwb2ludGVydXAgaGVyZSBwcmlvciB0byBpdFxuXHRcdGlmKHRoaXMub3BlcmF0aW9uKSB7XG5cdFx0XHR0aGlzLm9uUG9pbnRlclVwKGV2ZW50KTtcblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgbm9uLXJlc2l6YWJsZSBjb2x1bW5zXG5cdFx0bGV0ICRjdXJyZW50R3JpcCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cdFx0aWYoJGN1cnJlbnRHcmlwLmlzKFNFTEVDVE9SX1VOUkVTSVpBQkxFKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCBncmlwSW5kZXggPSAkY3VycmVudEdyaXAuaW5kZXgoKTtcblx0XHRsZXQgJGxlZnRDb2x1bW4gPSB0aGlzLiR0YWJsZUhlYWRlcnMuZXEoZ3JpcEluZGV4KS5ub3QoU0VMRUNUT1JfVU5SRVNJWkFCTEUpO1xuXHRcdGxldCAkcmlnaHRDb2x1bW4gPSB0aGlzLiR0YWJsZUhlYWRlcnMuZXEoZ3JpcEluZGV4ICsgMSkubm90KFNFTEVDVE9SX1VOUkVTSVpBQkxFKTtcblxuXHRcdGxldCBsZWZ0V2lkdGggPSB0aGlzLnBhcnNlV2lkdGgoJGxlZnRDb2x1bW5bMF0pO1xuXHRcdGxldCByaWdodFdpZHRoID0gdGhpcy5wYXJzZVdpZHRoKCRyaWdodENvbHVtblswXSk7XG5cblx0XHR0aGlzLm9wZXJhdGlvbiA9IHtcblx0XHRcdCRsZWZ0Q29sdW1uLCAkcmlnaHRDb2x1bW4sICRjdXJyZW50R3JpcCxcblxuXHRcdFx0c3RhcnRYOiB0aGlzLmdldFBvaW50ZXJYKGV2ZW50KSxcblxuXHRcdFx0d2lkdGhzOiB7XG5cdFx0XHRcdGxlZnQ6IGxlZnRXaWR0aCxcblx0XHRcdFx0cmlnaHQ6IHJpZ2h0V2lkdGhcblx0XHRcdH0sXG5cdFx0XHRuZXdXaWR0aHM6IHtcblx0XHRcdFx0bGVmdDogbGVmdFdpZHRoLFxuXHRcdFx0XHRyaWdodDogcmlnaHRXaWR0aFxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kb3duZXJEb2N1bWVudCwgWydtb3VzZW1vdmUnLCAndG91Y2htb3ZlJ10sIHRoaXMub25Qb2ludGVyTW92ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kb3duZXJEb2N1bWVudCwgWydtb3VzZXVwJywgJ3RvdWNoZW5kJ10sIHRoaXMub25Qb2ludGVyVXAuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLiRoYW5kbGVDb250YWluZXJcblx0XHRcdC5hZGQodGhpcy4kdGFibGUpXG5cdFx0XHQuYWRkQ2xhc3MoQ0xBU1NfVEFCTEVfUkVTSVpJTkcpO1xuXG5cdFx0JGxlZnRDb2x1bW5cblx0XHRcdC5hZGQoJHJpZ2h0Q29sdW1uKVxuXHRcdFx0LmFkZCgkY3VycmVudEdyaXApXG5cdFx0XHQuYWRkQ2xhc3MoQ0xBU1NfQ09MVU1OX1JFU0laSU5HKTtcblxuXHRcdHRoaXMudHJpZ2dlckV2ZW50KEVWRU5UX1JFU0laRV9TVEFSVCwgW1xuXHRcdFx0JGxlZnRDb2x1bW4sICRyaWdodENvbHVtbixcblx0XHRcdGxlZnRXaWR0aCwgcmlnaHRXaWR0aFxuXHRcdF0sXG5cdFx0ZXZlbnQpO1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0fVxuXG5cdC8qKlxuXHRQb2ludGVyL21vdXNlIG1vdmVtZW50IGhhbmRsZXJcblxuXHRAbWV0aG9kIG9uUG9pbnRlck1vdmVcblx0QHBhcmFtIGV2ZW50IHtPYmplY3R9IEV2ZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyYWN0aW9uXG5cdCoqL1xuXHRvblBvaW50ZXJNb3ZlKGV2ZW50KSB7XG5cdFx0bGV0IG9wID0gdGhpcy5vcGVyYXRpb247XG5cdFx0aWYoIXRoaXMub3BlcmF0aW9uKSB7IHJldHVybjsgfVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSBkZWx0YSBjaGFuZ2UgYmV0d2VlbiBzdGFydCBhbmQgbmV3IG1vdXNlIHBvc2l0aW9uLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhYmxlIHdpZHRoXG5cdFx0bGV0IGRpZmZlcmVuY2UgPSAodGhpcy5nZXRQb2ludGVyWChldmVudCkgLSBvcC5zdGFydFgpIC8gdGhpcy4kdGFibGUud2lkdGgoKSAqIDEwMDtcblx0XHRpZihkaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGxlZnRDb2x1bW4gPSBvcC4kbGVmdENvbHVtblswXTtcblx0XHRsZXQgcmlnaHRDb2x1bW4gPSBvcC4kcmlnaHRDb2x1bW5bMF07XG5cdFx0bGV0IHdpZHRoTGVmdCwgd2lkdGhSaWdodDtcblxuXHRcdGlmKGRpZmZlcmVuY2UgPiAwKSB7XG5cdFx0XHR3aWR0aExlZnQgPSB0aGlzLmNvbnN0cmFpbldpZHRoKG9wLndpZHRocy5sZWZ0ICsgKG9wLndpZHRocy5yaWdodCAtIG9wLm5ld1dpZHRocy5yaWdodCkpO1xuXHRcdFx0d2lkdGhSaWdodCA9IHRoaXMuY29uc3RyYWluV2lkdGgob3Aud2lkdGhzLnJpZ2h0IC0gZGlmZmVyZW5jZSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYoZGlmZmVyZW5jZSA8IDApIHtcblx0XHRcdHdpZHRoTGVmdCA9IHRoaXMuY29uc3RyYWluV2lkdGgob3Aud2lkdGhzLmxlZnQgKyBkaWZmZXJlbmNlKTtcblx0XHRcdHdpZHRoUmlnaHQgPSB0aGlzLmNvbnN0cmFpbldpZHRoKG9wLndpZHRocy5yaWdodCArIChvcC53aWR0aHMubGVmdCAtIG9wLm5ld1dpZHRocy5sZWZ0KSk7XG5cdFx0fVxuXG5cdFx0aWYobGVmdENvbHVtbikge1xuXHRcdFx0dGhpcy5zZXRXaWR0aChsZWZ0Q29sdW1uLCB3aWR0aExlZnQpO1xuXHRcdH1cblx0XHRpZihyaWdodENvbHVtbikge1xuXHRcdFx0dGhpcy5zZXRXaWR0aChyaWdodENvbHVtbiwgd2lkdGhSaWdodCk7XG5cdFx0fVxuXG5cdFx0b3AubmV3V2lkdGhzLmxlZnQgPSB3aWR0aExlZnQ7XG5cdFx0b3AubmV3V2lkdGhzLnJpZ2h0ID0gd2lkdGhSaWdodDtcblxuXHRcdHJldHVybiB0aGlzLnRyaWdnZXJFdmVudChFVkVOVF9SRVNJWkUsIFtcblx0XHRcdG9wLiRsZWZ0Q29sdW1uLCBvcC4kcmlnaHRDb2x1bW4sXG5cdFx0XHR3aWR0aExlZnQsIHdpZHRoUmlnaHRcblx0XHRdLFxuXHRcdGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHRQb2ludGVyL21vdXNlIHJlbGVhc2UgaGFuZGxlclxuXG5cdEBtZXRob2Qgb25Qb2ludGVyVXBcblx0QHBhcmFtIGV2ZW50IHtPYmplY3R9IEV2ZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyYWN0aW9uXG5cdCoqL1xuXHRvblBvaW50ZXJVcChldmVudCkge1xuXHRcdGxldCBvcCA9IHRoaXMub3BlcmF0aW9uO1xuXHRcdGlmKCF0aGlzLm9wZXJhdGlvbikgeyByZXR1cm47IH1cblxuXHRcdHRoaXMudW5iaW5kRXZlbnRzKHRoaXMuJG93bmVyRG9jdW1lbnQsIFsnbW91c2V1cCcsICd0b3VjaGVuZCcsICdtb3VzZW1vdmUnLCAndG91Y2htb3ZlJ10pO1xuXG5cdFx0dGhpcy4kaGFuZGxlQ29udGFpbmVyXG5cdFx0XHQuYWRkKHRoaXMuJHRhYmxlKVxuXHRcdFx0LnJlbW92ZUNsYXNzKENMQVNTX1RBQkxFX1JFU0laSU5HKTtcblxuXHRcdG9wLiRsZWZ0Q29sdW1uXG5cdFx0XHQuYWRkKG9wLiRyaWdodENvbHVtbilcblx0XHRcdC5hZGQob3AuJGN1cnJlbnRHcmlwKVxuXHRcdFx0LnJlbW92ZUNsYXNzKENMQVNTX0NPTFVNTl9SRVNJWklORyk7XG5cblx0XHR0aGlzLnN5bmNIYW5kbGVXaWR0aHMoKTtcblx0XHR0aGlzLnNhdmVDb2x1bW5XaWR0aHMoKTtcblxuXHRcdHRoaXMub3BlcmF0aW9uID0gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLnRyaWdnZXJFdmVudChFVkVOVF9SRVNJWkVfU1RPUCwgW1xuXHRcdFx0b3AuJGxlZnRDb2x1bW4sIG9wLiRyaWdodENvbHVtbixcblx0XHRcdG9wLm5ld1dpZHRocy5sZWZ0LCBvcC5uZXdXaWR0aHMucmlnaHRcblx0XHRdLFxuXHRcdGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHRSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMsIGRhdGEsIGFuZCBhZGRlZCBET00gZWxlbWVudHMuIFRha2VzXG5cdHRoZSA8dGFibGUvPiBlbGVtZW50IGJhY2sgdG8gaG93IGl0IHdhcywgYW5kIHJldHVybnMgaXRcblxuXHRAbWV0aG9kIGRlc3Ryb3lcblx0QHJldHVybiB7alF1ZXJ5fSBPcmlnaW5hbCBqUXVlcnktd3JhcHBlZCA8dGFibGU+IGVsZW1lbnRcblx0KiovXG5cdGRlc3Ryb3koKSB7XG5cdFx0bGV0ICR0YWJsZSA9IHRoaXMuJHRhYmxlO1xuXHRcdGxldCAkaGFuZGxlcyA9IHRoaXMuJGhhbmRsZUNvbnRhaW5lci5maW5kKCcuJytDTEFTU19IQU5ETEUpO1xuXG5cdFx0dGhpcy51bmJpbmRFdmVudHMoXG5cdFx0XHR0aGlzLiR3aW5kb3dcblx0XHRcdFx0LmFkZCh0aGlzLiRvd25lckRvY3VtZW50KVxuXHRcdFx0XHQuYWRkKHRoaXMuJHRhYmxlKVxuXHRcdFx0XHQuYWRkKCRoYW5kbGVzKVxuXHRcdCk7XG5cblx0XHQkaGFuZGxlcy5yZW1vdmVEYXRhKERBVEFfVEgpO1xuXHRcdCR0YWJsZS5yZW1vdmVEYXRhKERBVEFfQVBJKTtcblxuXHRcdHRoaXMuJGhhbmRsZUNvbnRhaW5lci5yZW1vdmUoKTtcblx0XHR0aGlzLiRoYW5kbGVDb250YWluZXIgPSBudWxsO1xuXHRcdHRoaXMuJHRhYmxlSGVhZGVycyA9IG51bGw7XG5cdFx0dGhpcy4kdGFibGUgPSBudWxsO1xuXG5cdFx0cmV0dXJuICR0YWJsZTtcblx0fVxuXG5cdC8qKlxuXHRCaW5kcyBnaXZlbiBldmVudHMgZm9yIHRoaXMgaW5zdGFuY2UgdG8gdGhlIGdpdmVuIHRhcmdldCBET01FbGVtZW50XG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCBiaW5kRXZlbnRzXG5cdEBwYXJhbSB0YXJnZXQge2pRdWVyeX0galF1ZXJ5LXdyYXBwZWQgRE9NRWxlbWVudCB0byBiaW5kIGV2ZW50cyB0b1xuXHRAcGFyYW0gZXZlbnRzIHtTdHJpbmd8QXJyYXl9IEV2ZW50IG5hbWUgKG9yIGFycmF5IG9mKSB0byBiaW5kXG5cdEBwYXJhbSBzZWxlY3Rvck9yQ2FsbGJhY2sge1N0cmluZ3xGdW5jdGlvbn0gU2VsZWN0b3Igc3RyaW5nIG9yIGNhbGxiYWNrXG5cdEBwYXJhbSBbY2FsbGJhY2tdIHtGdW5jdGlvbn0gQ2FsbGJhY2sgbWV0aG9kXG5cdCoqL1xuXHRiaW5kRXZlbnRzKCR0YXJnZXQsIGV2ZW50cywgc2VsZWN0b3JPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuXHRcdGlmKHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRldmVudHMgPSBldmVudHMgKyB0aGlzLm5zO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGV2ZW50cyA9IGV2ZW50cy5qb2luKHRoaXMubnMgKyAnICcpICsgdGhpcy5ucztcblx0XHR9XG5cblx0XHRpZihhcmd1bWVudHMubGVuZ3RoID4gMykge1xuXHRcdFx0JHRhcmdldC5vbihldmVudHMsIHNlbGVjdG9yT3JDYWxsYmFjaywgY2FsbGJhY2spO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdCR0YXJnZXQub24oZXZlbnRzLCBzZWxlY3Rvck9yQ2FsbGJhY2spO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHRVbmJpbmRzIGV2ZW50cyBzcGVjaWZpYyB0byB0aGlzIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHRhcmdldCBET01FbGVtZW50XG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCB1bmJpbmRFdmVudHNcblx0QHBhcmFtIHRhcmdldCB7alF1ZXJ5fSBqUXVlcnktd3JhcHBlZCBET01FbGVtZW50IHRvIHVuYmluZCBldmVudHMgZnJvbVxuXHRAcGFyYW0gZXZlbnRzIHtTdHJpbmd8QXJyYXl9IEV2ZW50IG5hbWUgKG9yIGFycmF5IG9mKSB0byB1bmJpbmRcblx0KiovXG5cdHVuYmluZEV2ZW50cygkdGFyZ2V0LCBldmVudHMpIHtcblx0XHRpZih0eXBlb2YgZXZlbnRzID09PSAnc3RyaW5nJykge1xuXHRcdFx0ZXZlbnRzID0gZXZlbnRzICsgdGhpcy5ucztcblx0XHR9XG5cdFx0ZWxzZSBpZihldmVudHMgIT0gbnVsbCkge1xuXHRcdFx0ZXZlbnRzID0gZXZlbnRzLmpvaW4odGhpcy5ucyArICcgJykgKyB0aGlzLm5zO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGV2ZW50cyA9IHRoaXMubnM7XG5cdFx0fVxuXG5cdFx0JHRhcmdldC5vZmYoZXZlbnRzKTtcblx0fVxuXG5cdC8qKlxuXHRUcmlnZ2VycyBhbiBldmVudCBvbiB0aGUgPHRhYmxlLz4gZWxlbWVudCBmb3IgYSBnaXZlbiB0eXBlIHdpdGggZ2l2ZW5cblx0YXJndW1lbnRzLCBhbHNvIHNldHRpbmcgYW5kIGFsbG93aW5nIGFjY2VzcyB0byB0aGUgb3JpZ2luYWxFdmVudCBpZlxuXHRnaXZlbi4gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSB0cmlnZ2VyZWQgZXZlbnQuXG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCB0cmlnZ2VyRXZlbnRcblx0QHBhcmFtIHR5cGUge1N0cmluZ30gRXZlbnQgbmFtZVxuXHRAcGFyYW0gYXJncyB7QXJyYXl9IEFycmF5IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRocm91Z2hcblx0QHBhcmFtIFtvcmlnaW5hbEV2ZW50XSBJZiBnaXZlbiwgaXMgc2V0IG9uIHRoZSBldmVudCBvYmplY3Rcblx0QHJldHVybiB7TWl4ZWR9IFJlc3VsdCBvZiB0aGUgZXZlbnQgdHJpZ2dlciBhY3Rpb25cblx0KiovXG5cdHRyaWdnZXJFdmVudCh0eXBlLCBhcmdzLCBvcmlnaW5hbEV2ZW50KSB7XG5cdFx0bGV0IGV2ZW50ID0gJC5FdmVudCh0eXBlKTtcblx0XHRpZihldmVudC5vcmlnaW5hbEV2ZW50KSB7XG5cdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50ID0gJC5leHRlbmQoe30sIG9yaWdpbmFsRXZlbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLiR0YWJsZS50cmlnZ2VyKGV2ZW50LCBbdGhpc10uY29uY2F0KGFyZ3MgfHwgW10pKTtcblx0fVxuXG5cdC8qKlxuXHRDYWxjdWxhdGVzIGEgdW5pcXVlIGNvbHVtbiBJRCBmb3IgYSBnaXZlbiBjb2x1bW4gRE9NRWxlbWVudFxuXG5cdEBwcml2YXRlXG5cdEBtZXRob2QgZ2VuZXJhdGVDb2x1bW5JZFxuXHRAcGFyYW0gJGVsIHtqUXVlcnl9IGpRdWVyeS13cmFwcGVkIGNvbHVtbiBlbGVtZW50XG5cdEByZXR1cm4ge1N0cmluZ30gQ29sdW1uIElEXG5cdCoqL1xuXHRnZW5lcmF0ZUNvbHVtbklkKCRlbCkge1xuXHRcdHJldHVybiB0aGlzLiR0YWJsZS5kYXRhKERBVEFfQ09MVU1OU19JRCkgKyAnLScgKyAkZWwuZGF0YShEQVRBX0NPTFVNTl9JRCk7XG5cdH1cblxuXHQvKipcblx0UGFyc2VzIGEgZ2l2ZW4gRE9NRWxlbWVudCdzIHdpZHRoIGludG8gYSBmbG9hdFxuXG5cdEBwcml2YXRlXG5cdEBtZXRob2QgcGFyc2VXaWR0aFxuXHRAcGFyYW0gZWxlbWVudCB7RE9NRWxlbWVudH0gRWxlbWVudCB0byBnZXQgd2lkdGggb2Zcblx0QHJldHVybiB7TnVtYmVyfSBFbGVtZW50J3Mgd2lkdGggYXMgYSBmbG9hdFxuXHQqKi9cblx0cGFyc2VXaWR0aChlbGVtZW50KSB7XG5cdFx0cmV0dXJuIGVsZW1lbnQgPyBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUud2lkdGgucmVwbGFjZSgnJScsICcnKSkgOiAwO1xuXHR9XG5cblx0LyoqXG5cdFNldHMgdGhlIHBlcmNlbnRhZ2Ugd2lkdGggb2YgYSBnaXZlbiBET01FbGVtZW50XG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCBzZXRXaWR0aFxuXHRAcGFyYW0gZWxlbWVudCB7RE9NRWxlbWVudH0gRWxlbWVudCB0byBzZXQgd2lkdGggb25cblx0QHBhcmFtIHdpZHRoIHtOdW1iZXJ9IFdpZHRoLCBhcyBhIHBlcmNlbnRhZ2UsIHRvIHNldFxuXHQqKi9cblx0c2V0V2lkdGgoZWxlbWVudCwgd2lkdGgpIHtcblx0XHR3aWR0aCA9IHdpZHRoLnRvRml4ZWQoMik7XG5cdFx0d2lkdGggPSB3aWR0aCA+IDAgPyB3aWR0aCA6IDA7XG5cdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJyUnO1xuXHR9XG5cblx0LyoqXG5cdENvbnN0cmFpbnMgYSBnaXZlbiB3aWR0aCB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bSByYW5nZXMgZGVmaW5lZCBpblxuXHR0aGUgYG1pbldpZHRoYCBhbmQgYG1heFdpZHRoYCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHJlc3BlY3RpdmVseS5cblxuXHRAcHJpdmF0ZVxuXHRAbWV0aG9kIGNvbnN0cmFpbldpZHRoXG5cdEBwYXJhbSB3aWR0aCB7TnVtYmVyfSBXaWR0aCB0byBjb25zdHJhaW5cblx0QHJldHVybiB7TnVtYmVyfSBDb25zdHJhaW5lZCB3aWR0aFxuXHQqKi9cblx0Y29uc3RyYWluV2lkdGgod2lkdGgpIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLm1pbldpZHRoICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0d2lkdGggPSBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluV2lkdGgsIHdpZHRoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm1heFdpZHRoICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0d2lkdGggPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4V2lkdGgsIHdpZHRoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gd2lkdGg7XG5cdH1cblxuXHQvKipcblx0R2l2ZW4gYSBwYXJ0aWN1bGFyIEV2ZW50IG9iamVjdCwgcmV0cmlldmVzIHRoZSBjdXJyZW50IHBvaW50ZXIgb2Zmc2V0IGFsb25nXG5cdHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbi4gQWNjb3VudHMgZm9yIGJvdGggcmVndWxhciBtb3VzZSBjbGlja3MgYXMgd2VsbCBhc1xuXHRwb2ludGVyLWxpa2Ugc3lzdGVtcyAobW9iaWxlcywgdGFibGV0cyBldGMuKVxuXG5cdEBwcml2YXRlXG5cdEBtZXRob2QgZ2V0UG9pbnRlclhcblx0QHBhcmFtIGV2ZW50IHtPYmplY3R9IEV2ZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyYWN0aW9uXG5cdEByZXR1cm4ge051bWJlcn0gSG9yaXpvbnRhbCBwb2ludGVyIG9mZnNldFxuXHQqKi9cblx0Z2V0UG9pbnRlclgoZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQudHlwZS5pbmRleE9mKCd0b3VjaCcpID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gKGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKS5wYWdlWDtcblx0XHR9XG5cdFx0cmV0dXJuIGV2ZW50LnBhZ2VYO1xuXHR9XG59XG5cblJlc2l6YWJsZUNvbHVtbnMuZGVmYXVsdHMgPSB7XG5cdHNlbGVjdG9yOiBmdW5jdGlvbigkdGFibGUpIHtcblx0XHRpZigkdGFibGUuZmluZCgndGhlYWQnKS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBTRUxFQ1RPUl9USDtcblx0XHR9XG5cblx0XHRyZXR1cm4gU0VMRUNUT1JfVEQ7XG5cdH0sXG5cdHN0b3JlOiB3aW5kb3cuc3RvcmUsXG5cdHN5bmNIYW5kbGVyczogdHJ1ZSxcblx0cmVzaXplRnJvbUJvZHk6IHRydWUsXG5cdG1heFdpZHRoOiBudWxsLFxuXHRtaW5XaWR0aDogMC4wMVxufTtcblxuUmVzaXphYmxlQ29sdW1ucy5jb3VudCA9IDA7XG4iLCJleHBvcnQgY29uc3QgREFUQV9BUEkgPSAncmVzaXphYmxlQ29sdW1ucyc7XG5leHBvcnQgY29uc3QgREFUQV9DT0xVTU5TX0lEID0gJ3Jlc2l6YWJsZS1jb2x1bW5zLWlkJztcbmV4cG9ydCBjb25zdCBEQVRBX0NPTFVNTl9JRCA9ICdyZXNpemFibGUtY29sdW1uLWlkJztcbmV4cG9ydCBjb25zdCBEQVRBX1RIID0gJ3RoJztcblxuZXhwb3J0IGNvbnN0IENMQVNTX1RBQkxFX1JFU0laSU5HID0gJ3JjLXRhYmxlLXJlc2l6aW5nJztcbmV4cG9ydCBjb25zdCBDTEFTU19DT0xVTU5fUkVTSVpJTkcgPSAncmMtY29sdW1uLXJlc2l6aW5nJztcbmV4cG9ydCBjb25zdCBDTEFTU19IQU5ETEUgPSAncmMtaGFuZGxlJztcbmV4cG9ydCBjb25zdCBDTEFTU19IQU5ETEVfQ09OVEFJTkVSID0gJ3JjLWhhbmRsZS1jb250YWluZXInO1xuXG5leHBvcnQgY29uc3QgRVZFTlRfUkVTSVpFX1NUQVJUID0gJ2NvbHVtbjpyZXNpemU6c3RhcnQnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1JFU0laRSA9ICdjb2x1bW46cmVzaXplJztcbmV4cG9ydCBjb25zdCBFVkVOVF9SRVNJWkVfU1RPUCA9ICdjb2x1bW46cmVzaXplOnN0b3AnO1xuXG5leHBvcnQgY29uc3QgU0VMRUNUT1JfVEggPSAndHI6Zmlyc3QgPiB0aDp2aXNpYmxlJztcbmV4cG9ydCBjb25zdCBTRUxFQ1RPUl9URCA9ICd0cjpmaXJzdCA+IHRkOnZpc2libGUnO1xuZXhwb3J0IGNvbnN0IFNFTEVDVE9SX1VOUkVTSVpBQkxFID0gYFtkYXRhLW5vcmVzaXplXWA7XG4iLCJpbXBvcnQgUmVzaXphYmxlQ29sdW1ucyBmcm9tICcuL2NsYXNzJztcbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IFJlc2l6YWJsZUNvbHVtbnM7Il19 -------------------------------------------------------------------------------- /dist/jquery.resizableColumns.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * jquery-resizable-columns - Resizable table columns for jQuery 3 | * @date Sat May 16 2015 19:03:57 GMT+0100 (BST) 4 | * @version v0.1.0 5 | * @link http://dobtco.github.io/jquery-resizable-columns/ 6 | * @license MIT 7 | */ 8 | !function t(e,i,n){function s(a,o){if(!i[a]){if(!e[a]){var h="function"==typeof require&&require;if(!o&&h)return h(a,!0);if(r)return r(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var d=i[a]={exports:{}};e[a][0].call(d.exports,function(t){var i=e[a][1][t];return s(i?i:t)},d,d.exports,t,e,i,n)}return i[a].exports}for(var r="function"==typeof require&&require,a=0;a1?e-1:0),n=1;e>n;n++)i[n-1]=arguments[n];return this.each(function(){var e=$(this),n=e.data(a.DATA_API);if(n){if("string"==typeof t)return n[t].apply(n,i)}else n=new r["default"](e,t),e.data(a.DATA_API,n)})},$.resizableColumns=r["default"]},{"./class":2,"./constants":3}],2:[function(t,e,i){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var s=function(){function t(t,e){for(var i=0;i"),this.$table.before(this.$handleContainer),this.$tableHeaders.each(function(e,i){var n=t.$tableHeaders.eq(e),s=t.$tableHeaders.eq(e+1);if(0!==s.length&&!n.is(r.SELECTOR_UNRESIZABLE)&&!s.is(r.SELECTOR_UNRESIZABLE)){$("
").data(r.DATA_TH,$(i)).appendTo(t.$handleContainer)}}),this.bindEvents(this.$handleContainer,["mousedown","touchstart"],"."+r.CLASS_HANDLE,this.onPointerDown.bind(this))}},{key:"assignPercentageWidths",value:function(){var t=this;this.$tableHeaders.each(function(e,i){var n=$(i);t.setWidth(n[0],n.outerWidth()/t.$table.width()*100)})}},{key:"syncHandleWidths",value:function(){var t=this,e=this.$handleContainer;e.width(this.$table.width()),e.find("."+r.CLASS_HANDLE).each(function(e,i){var n=$(i),s=t.options.resizeFromBody?t.$table.height():t.$table.find("thead").height(),a=n.data(r.DATA_TH).outerWidth()+(n.data(r.DATA_TH).offset().left-t.$handleContainer.offset().left);n.css({left:a,height:s})})}},{key:"saveColumnWidths",value:function(){var t=this;this.$tableHeaders.each(function(e,i){var n=$(i);t.options.store&&!n.is(r.SELECTOR_UNRESIZABLE)&&t.options.store.set(t.generateColumnId(n),t.parseWidth(i))})}},{key:"restoreColumnWidths",value:function(){var t=this;this.$tableHeaders.each(function(e,i){var n=$(i);if(t.options.store&&!n.is(r.SELECTOR_UNRESIZABLE)){var s=t.options.store.get(t.generateColumnId(n));null!=s&&t.setWidth(i,s)}})}},{key:"onPointerDown",value:function(t){if(1===t.which){this.operation&&this.onPointerUp(t);var e=$(t.currentTarget);if(!e.is(r.SELECTOR_UNRESIZABLE)){var i=e.index(),n=this.$tableHeaders.eq(i).not(r.SELECTOR_UNRESIZABLE),s=this.$tableHeaders.eq(i+1).not(r.SELECTOR_UNRESIZABLE),a=this.parseWidth(n[0]),o=this.parseWidth(s[0]);this.operation={$leftColumn:n,$rightColumn:s,$currentGrip:e,startX:this.getPointerX(t),widths:{left:a,right:o},newWidths:{left:a,right:o}},this.bindEvents(this.$ownerDocument,["mousemove","touchmove"],this.onPointerMove.bind(this)),this.bindEvents(this.$ownerDocument,["mouseup","touchend"],this.onPointerUp.bind(this)),this.$handleContainer.add(this.$table).addClass(r.CLASS_TABLE_RESIZING),n.add(s).add(e).addClass(r.CLASS_COLUMN_RESIZING),this.triggerEvent(r.EVENT_RESIZE_START,[n,s,a,o],t),t.preventDefault()}}}},{key:"onPointerMove",value:function(t){var e=this.operation;if(this.operation){var i=(this.getPointerX(t)-e.startX)/this.$table.width()*100;if(0!==i){var n=e.$leftColumn[0],s=e.$rightColumn[0],a=void 0,o=void 0;return i>0?(a=this.constrainWidth(e.widths.left+(e.widths.right-e.newWidths.right)),o=this.constrainWidth(e.widths.right-i)):0>i&&(a=this.constrainWidth(e.widths.left+i),o=this.constrainWidth(e.widths.right+(e.widths.left-e.newWidths.left))),n&&this.setWidth(n,a),s&&this.setWidth(s,o),e.newWidths.left=a,e.newWidths.right=o,this.triggerEvent(r.EVENT_RESIZE,[e.$leftColumn,e.$rightColumn,a,o],t)}}}},{key:"onPointerUp",value:function(t){var e=this.operation;if(this.operation)return this.unbindEvents(this.$ownerDocument,["mouseup","touchend","mousemove","touchmove"]),this.$handleContainer.add(this.$table).removeClass(r.CLASS_TABLE_RESIZING),e.$leftColumn.add(e.$rightColumn).add(e.$currentGrip).removeClass(r.CLASS_COLUMN_RESIZING),this.syncHandleWidths(),this.saveColumnWidths(),this.operation=null,this.triggerEvent(r.EVENT_RESIZE_STOP,[e.$leftColumn,e.$rightColumn,e.newWidths.left,e.newWidths.right],t)}},{key:"destroy",value:function(){var t=this.$table,e=this.$handleContainer.find("."+r.CLASS_HANDLE);return this.unbindEvents(this.$window.add(this.$ownerDocument).add(this.$table).add(e)),e.removeData(r.DATA_TH),t.removeData(r.DATA_API),this.$handleContainer.remove(),this.$handleContainer=null,this.$tableHeaders=null,this.$table=null,t}},{key:"bindEvents",value:function(t,e,i,n){"string"==typeof e?e+=this.ns:e=e.join(this.ns+" ")+this.ns,arguments.length>3?t.on(e,i,n):t.on(e,i)}},{key:"unbindEvents",value:function(t,e){"string"==typeof e?e+=this.ns:e=null!=e?e.join(this.ns+" ")+this.ns:this.ns,t.off(e)}},{key:"triggerEvent",value:function(t,e,i){var n=$.Event(t);return n.originalEvent&&(n.originalEvent=$.extend({},i)),this.$table.trigger(n,[this].concat(e||[]))}},{key:"generateColumnId",value:function(t){return this.$table.data(r.DATA_COLUMNS_ID)+"-"+t.data(r.DATA_COLUMN_ID)}},{key:"parseWidth",value:function(t){return t?parseFloat(t.style.width.replace("%","")):0}},{key:"setWidth",value:function(t,e){e=e.toFixed(2),e=e>0?e:0,t.style.width=e+"%"}},{key:"constrainWidth",value:function(t){return void 0!=this.options.minWidth&&(t=Math.max(this.options.minWidth,t)),void 0!=this.options.maxWidth&&(t=Math.min(this.options.maxWidth,t)),t}},{key:"getPointerX",value:function(t){return 0===t.type.indexOf("touch")?(t.originalEvent.touches[0]||t.originalEvent.changedTouches[0]).pageX:t.pageX}}]),t}();i["default"]=a,a.defaults={selector:function(t){return t.find("thead").length?r.SELECTOR_TH:r.SELECTOR_TD},store:window.store,syncHandlers:!0,resizeFromBody:!0,maxWidth:null,minWidth:.01},a.count=0,e.exports=i["default"]},{"./constants":3}],3:[function(t,e,i){"use strict";Object.defineProperty(i,"__esModule",{value:!0});var n="resizableColumns";i.DATA_API=n;var s="resizable-columns-id";i.DATA_COLUMNS_ID=s;var r="resizable-column-id";i.DATA_COLUMN_ID=r;var a="th";i.DATA_TH=a;var o="rc-table-resizing";i.CLASS_TABLE_RESIZING=o;var h="rc-column-resizing";i.CLASS_COLUMN_RESIZING=h;var l="rc-handle";i.CLASS_HANDLE=l;var d="rc-handle-container";i.CLASS_HANDLE_CONTAINER=d;var u="column:resize:start";i.EVENT_RESIZE_START=u;var c="column:resize";i.EVENT_RESIZE=c;var f="column:resize:stop";i.EVENT_RESIZE_STOP=f;var E="tr:first > th:visible";i.SELECTOR_TH=E;var v="tr:first > td:visible";i.SELECTOR_TD=v;var $="[data-noresize]";i.SELECTOR_UNRESIZABLE=$},{}],4:[function(t,e,i){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}Object.defineProperty(i,"__esModule",{value:!0});{var s=t("./class"),r=n(s),a=t("./adapter");n(a)}i["default"]=r["default"],e.exports=i["default"]},{"./adapter":1,"./class":2}]},{},[4]); 9 | //# sourceMappingURL=jquery.resizableColumns.min.js.map -------------------------------------------------------------------------------- /dist/jquery.resizableColumns.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["jquery.resizableColumns.js","/source/src/adapter.js","/source/src/class.js","/source/src/constants.js"],"names":["e","t","n","r","s","o","u","a","require","i","f","Error","code","l","exports","call","length",1,"module","_interopRequireDefault","obj","__esModule","default","_class","_class2","_constants","$","fn","resizableColumns","optionsOrMethod","_len","arguments","args","Array","_key","this","each","$table","api","data","DATA_API","apply","./class","./constants",2,"_classCallCheck","instance","Constructor","TypeError","Object","defineProperty","value","_createClass","defineProperties","target","props","descriptor","enumerable","configurable","writable","key","protoProps","staticProps","prototype","ResizableColumns","options","ns","count","extend","defaults","$window","window","$ownerDocument","ownerDocument","refreshHeaders","restoreColumnWidths","syncHandleWidths","bindEvents","bind","start","EVENT_RESIZE_START","resize","EVENT_RESIZE","stop","EVENT_RESIZE_STOP","selector","$tableHeaders","find","assignPercentageWidths","createHandles","_this","ref","$handleContainer","remove","CLASS_HANDLE_CONTAINER","before","el","$current","eq","$next","is","SELECTOR_UNRESIZABLE","CLASS_HANDLE","DATA_TH","appendTo","onPointerDown","_this2","_","$el","setWidth","outerWidth","width","_this3","$container","height","resizeFromBody","left","offset","css","_this4","store","set","generateColumnId","parseWidth","_this5","get","event","which","operation","onPointerUp","$currentGrip","currentTarget","gripIndex","index","$leftColumn","not","$rightColumn","leftWidth","rightWidth","startX","getPointerX","widths","right","newWidths","onPointerMove","add","addClass","CLASS_TABLE_RESIZING","CLASS_COLUMN_RESIZING","triggerEvent","preventDefault","op","difference","leftColumn","rightColumn","widthLeft","undefined","widthRight","constrainWidth","unbindEvents","removeClass","saveColumnWidths","$handles","removeData","$target","events","selectorOrCallback","callback","join","on","off","type","originalEvent","Event","trigger","concat","DATA_COLUMNS_ID","DATA_COLUMN_ID","element","parseFloat","style","replace","toFixed","minWidth","Math","max","maxWidth","min","indexOf","touches","changedTouches","pageX","SELECTOR_TH","SELECTOR_TD","syncHandlers",3,4,"_adapter","./adapter"],"mappings":"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","file":"jquery.resizableColumns.min.js","sourcesContent":["/**\n * jquery-resizable-columns - Resizable table columns for jQuery\n * @date Sat May 16 2015 19:03:57 GMT+0100 (BST)\n * @version v0.1.0\n * @link http://dobtco.github.io/jquery-resizable-columns/\n * @license MIT\n */\n(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t\targs[_key - 1] = arguments[_key];\n\t}\n\n\treturn this.each(function () {\n\t\tvar $table = $(this);\n\n\t\tvar api = $table.data(_constants.DATA_API);\n\t\tif (!api) {\n\t\t\tapi = new _class2['default']($table, optionsOrMethod);\n\t\t\t$table.data(_constants.DATA_API, api);\n\t\t} else if (typeof optionsOrMethod === 'string') {\n\t\t\treturn api[optionsOrMethod].apply(api, args);\n\t\t}\n\t});\n};\n\n$.resizableColumns = _class2['default'];\n\n},{\"./class\":2,\"./constants\":3}],2:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n\tvalue: true\n});\n\nvar _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; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar _constants = require('./constants');\n\n/**\nTakes a
element and makes it's columns resizable across both\nmobile and desktop clients.\n\n@class ResizableColumns\n@param $table {jQuery} jQuery-wrapped
element to make resizable\n@param options {Object} Configuration object\n**/\n\nvar ResizableColumns = (function () {\n\tfunction ResizableColumns($table, options) {\n\t\t_classCallCheck(this, ResizableColumns);\n\n\t\tthis.ns = '.rc' + this.count++;\n\n\t\tthis.options = $.extend({}, ResizableColumns.defaults, options);\n\n\t\tthis.$window = $(window);\n\t\tthis.$ownerDocument = $($table[0].ownerDocument);\n\t\tthis.$table = $table;\n\n\t\tthis.refreshHeaders();\n\t\tthis.restoreColumnWidths();\n\t\tthis.syncHandleWidths();\n\n\t\tthis.bindEvents(this.$window, 'resize', this.syncHandleWidths.bind(this));\n\n\t\tif (this.options.start) {\n\t\t\tthis.bindEvents(this.$table, _constants.EVENT_RESIZE_START, this.options.start);\n\t\t}\n\t\tif (this.options.resize) {\n\t\t\tthis.bindEvents(this.$table, _constants.EVENT_RESIZE, this.options.resize);\n\t\t}\n\t\tif (this.options.stop) {\n\t\t\tthis.bindEvents(this.$table, _constants.EVENT_RESIZE_STOP, this.options.stop);\n\t\t}\n\t}\n\n\t_createClass(ResizableColumns, [{\n\t\tkey: 'refreshHeaders',\n\n\t\t/**\n Refreshes the headers associated with this instances
element and\n generates handles for them. Also assigns percentage widths.\n \t@method refreshHeaders\n **/\n\t\tvalue: function refreshHeaders() {\n\t\t\t// Allow the selector to be both a regular selctor string as well as\n\t\t\t// a dynamic callback\n\t\t\tvar selector = this.options.selector;\n\t\t\tif (typeof selector === 'function') {\n\t\t\t\tselector = selector.call(this, this.$table);\n\t\t\t}\n\n\t\t\t// Select all table headers\n\t\t\tthis.$tableHeaders = this.$table.find(selector);\n\n\t\t\t// Assign percentage widths first, then create drag handles\n\t\t\tthis.assignPercentageWidths();\n\t\t\tthis.createHandles();\n\t\t}\n\t}, {\n\t\tkey: 'createHandles',\n\n\t\t/**\n Creates dummy handle elements for all table header columns\n \t@method createHandles\n **/\n\t\tvalue: function createHandles() {\n\t\t\tvar _this = this;\n\n\t\t\tvar ref = this.$handleContainer;\n\t\t\tif (ref != null) {\n\t\t\t\tref.remove();\n\t\t\t}\n\n\t\t\tthis.$handleContainer = $('
');\n\t\t\tthis.$table.before(this.$handleContainer);\n\n\t\t\tthis.$tableHeaders.each(function (i, el) {\n\t\t\t\tvar $current = _this.$tableHeaders.eq(i);\n\t\t\t\tvar $next = _this.$tableHeaders.eq(i + 1);\n\n\t\t\t\tif ($next.length === 0 || $current.is(_constants.SELECTOR_UNRESIZABLE) || $next.is(_constants.SELECTOR_UNRESIZABLE)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar $handle = $('
').data(_constants.DATA_TH, $(el)).appendTo(_this.$handleContainer);\n\t\t\t});\n\n\t\t\tthis.bindEvents(this.$handleContainer, ['mousedown', 'touchstart'], '.' + _constants.CLASS_HANDLE, this.onPointerDown.bind(this));\n\t\t}\n\t}, {\n\t\tkey: 'assignPercentageWidths',\n\n\t\t/**\n Assigns a percentage width to all columns based on their current pixel width(s)\n \t@method assignPercentageWidths\n **/\n\t\tvalue: function assignPercentageWidths() {\n\t\t\tvar _this2 = this;\n\n\t\t\tthis.$tableHeaders.each(function (_, el) {\n\t\t\t\tvar $el = $(el);\n\t\t\t\t_this2.setWidth($el[0], $el.outerWidth() / _this2.$table.width() * 100);\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'syncHandleWidths',\n\n\t\t/**\n \n @method syncHandleWidths\n **/\n\t\tvalue: function syncHandleWidths() {\n\t\t\tvar _this3 = this;\n\n\t\t\tvar $container = this.$handleContainer;\n\n\t\t\t$container.width(this.$table.width());\n\n\t\t\t$container.find('.' + _constants.CLASS_HANDLE).each(function (_, el) {\n\t\t\t\tvar $el = $(el);\n\n\t\t\t\tvar height = _this3.options.resizeFromBody ? _this3.$table.height() : _this3.$table.find('thead').height();\n\n\t\t\t\tvar left = $el.data(_constants.DATA_TH).outerWidth() + ($el.data(_constants.DATA_TH).offset().left - _this3.$handleContainer.offset().left);\n\n\t\t\t\t$el.css({ left: left, height: height });\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'saveColumnWidths',\n\n\t\t/**\n Persists the column widths in localStorage\n \t@method saveColumnWidths\n **/\n\t\tvalue: function saveColumnWidths() {\n\t\t\tvar _this4 = this;\n\n\t\t\tthis.$tableHeaders.each(function (_, el) {\n\t\t\t\tvar $el = $(el);\n\n\t\t\t\tif (_this4.options.store && !$el.is(_constants.SELECTOR_UNRESIZABLE)) {\n\t\t\t\t\t_this4.options.store.set(_this4.generateColumnId($el), _this4.parseWidth(el));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'restoreColumnWidths',\n\n\t\t/**\n Retrieves and sets the column widths from localStorage\n \t@method restoreColumnWidths\n **/\n\t\tvalue: function restoreColumnWidths() {\n\t\t\tvar _this5 = this;\n\n\t\t\tthis.$tableHeaders.each(function (_, el) {\n\t\t\t\tvar $el = $(el);\n\n\t\t\t\tif (_this5.options.store && !$el.is(_constants.SELECTOR_UNRESIZABLE)) {\n\t\t\t\t\tvar width = _this5.options.store.get(_this5.generateColumnId($el));\n\n\t\t\t\t\tif (width != null) {\n\t\t\t\t\t\t_this5.setWidth(el, width);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: 'onPointerDown',\n\n\t\t/**\n Pointer/mouse down handler\n \t@method onPointerDown\n @param event {Object} Event object associated with the interaction\n **/\n\t\tvalue: function onPointerDown(event) {\n\t\t\t// Only applies to left-click dragging\n\t\t\tif (event.which !== 1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a previous operation is defined, we missed the last mouseup.\n\t\t\t// Probably gobbled up by user mousing out the window then releasing.\n\t\t\t// We'll simulate a pointerup here prior to it\n\t\t\tif (this.operation) {\n\t\t\t\tthis.onPointerUp(event);\n\t\t\t}\n\n\t\t\t// Ignore non-resizable columns\n\t\t\tvar $currentGrip = $(event.currentTarget);\n\t\t\tif ($currentGrip.is(_constants.SELECTOR_UNRESIZABLE)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar gripIndex = $currentGrip.index();\n\t\t\tvar $leftColumn = this.$tableHeaders.eq(gripIndex).not(_constants.SELECTOR_UNRESIZABLE);\n\t\t\tvar $rightColumn = this.$tableHeaders.eq(gripIndex + 1).not(_constants.SELECTOR_UNRESIZABLE);\n\n\t\t\tvar leftWidth = this.parseWidth($leftColumn[0]);\n\t\t\tvar rightWidth = this.parseWidth($rightColumn[0]);\n\n\t\t\tthis.operation = {\n\t\t\t\t$leftColumn: $leftColumn, $rightColumn: $rightColumn, $currentGrip: $currentGrip,\n\n\t\t\t\tstartX: this.getPointerX(event),\n\n\t\t\t\twidths: {\n\t\t\t\t\tleft: leftWidth,\n\t\t\t\t\tright: rightWidth\n\t\t\t\t},\n\t\t\t\tnewWidths: {\n\t\t\t\t\tleft: leftWidth,\n\t\t\t\t\tright: rightWidth\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.bindEvents(this.$ownerDocument, ['mousemove', 'touchmove'], this.onPointerMove.bind(this));\n\t\t\tthis.bindEvents(this.$ownerDocument, ['mouseup', 'touchend'], this.onPointerUp.bind(this));\n\n\t\t\tthis.$handleContainer.add(this.$table).addClass(_constants.CLASS_TABLE_RESIZING);\n\n\t\t\t$leftColumn.add($rightColumn).add($currentGrip).addClass(_constants.CLASS_COLUMN_RESIZING);\n\n\t\t\tthis.triggerEvent(_constants.EVENT_RESIZE_START, [$leftColumn, $rightColumn, leftWidth, rightWidth], event);\n\n\t\t\tevent.preventDefault();\n\t\t}\n\t}, {\n\t\tkey: 'onPointerMove',\n\n\t\t/**\n Pointer/mouse movement handler\n \t@method onPointerMove\n @param event {Object} Event object associated with the interaction\n **/\n\t\tvalue: function onPointerMove(event) {\n\t\t\tvar op = this.operation;\n\t\t\tif (!this.operation) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Determine the delta change between start and new mouse position, as a percentage of the table width\n\t\t\tvar difference = (this.getPointerX(event) - op.startX) / this.$table.width() * 100;\n\t\t\tif (difference === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar leftColumn = op.$leftColumn[0];\n\t\t\tvar rightColumn = op.$rightColumn[0];\n\t\t\tvar widthLeft = undefined,\n\t\t\t widthRight = undefined;\n\n\t\t\tif (difference > 0) {\n\t\t\t\twidthLeft = this.constrainWidth(op.widths.left + (op.widths.right - op.newWidths.right));\n\t\t\t\twidthRight = this.constrainWidth(op.widths.right - difference);\n\t\t\t} else if (difference < 0) {\n\t\t\t\twidthLeft = this.constrainWidth(op.widths.left + difference);\n\t\t\t\twidthRight = this.constrainWidth(op.widths.right + (op.widths.left - op.newWidths.left));\n\t\t\t}\n\n\t\t\tif (leftColumn) {\n\t\t\t\tthis.setWidth(leftColumn, widthLeft);\n\t\t\t}\n\t\t\tif (rightColumn) {\n\t\t\t\tthis.setWidth(rightColumn, widthRight);\n\t\t\t}\n\n\t\t\top.newWidths.left = widthLeft;\n\t\t\top.newWidths.right = widthRight;\n\n\t\t\treturn this.triggerEvent(_constants.EVENT_RESIZE, [op.$leftColumn, op.$rightColumn, widthLeft, widthRight], event);\n\t\t}\n\t}, {\n\t\tkey: 'onPointerUp',\n\n\t\t/**\n Pointer/mouse release handler\n \t@method onPointerUp\n @param event {Object} Event object associated with the interaction\n **/\n\t\tvalue: function onPointerUp(event) {\n\t\t\tvar op = this.operation;\n\t\t\tif (!this.operation) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.unbindEvents(this.$ownerDocument, ['mouseup', 'touchend', 'mousemove', 'touchmove']);\n\n\t\t\tthis.$handleContainer.add(this.$table).removeClass(_constants.CLASS_TABLE_RESIZING);\n\n\t\t\top.$leftColumn.add(op.$rightColumn).add(op.$currentGrip).removeClass(_constants.CLASS_COLUMN_RESIZING);\n\n\t\t\tthis.syncHandleWidths();\n\t\t\tthis.saveColumnWidths();\n\n\t\t\tthis.operation = null;\n\n\t\t\treturn this.triggerEvent(_constants.EVENT_RESIZE_STOP, [op.$leftColumn, op.$rightColumn, op.newWidths.left, op.newWidths.right], event);\n\t\t}\n\t}, {\n\t\tkey: 'destroy',\n\n\t\t/**\n Removes all event listeners, data, and added DOM elements. Takes\n the
element back to how it was, and returns it\n \t@method destroy\n @return {jQuery} Original jQuery-wrapped
element\n **/\n\t\tvalue: function destroy() {\n\t\t\tvar $table = this.$table;\n\t\t\tvar $handles = this.$handleContainer.find('.' + _constants.CLASS_HANDLE);\n\n\t\t\tthis.unbindEvents(this.$window.add(this.$ownerDocument).add(this.$table).add($handles));\n\n\t\t\t$handles.removeData(_constants.DATA_TH);\n\t\t\t$table.removeData(_constants.DATA_API);\n\n\t\t\tthis.$handleContainer.remove();\n\t\t\tthis.$handleContainer = null;\n\t\t\tthis.$tableHeaders = null;\n\t\t\tthis.$table = null;\n\n\t\t\treturn $table;\n\t\t}\n\t}, {\n\t\tkey: 'bindEvents',\n\n\t\t/**\n Binds given events for this instance to the given target DOMElement\n \t@private\n @method bindEvents\n @param target {jQuery} jQuery-wrapped DOMElement to bind events to\n @param events {String|Array} Event name (or array of) to bind\n @param selectorOrCallback {String|Function} Selector string or callback\n @param [callback] {Function} Callback method\n **/\n\t\tvalue: function bindEvents($target, events, selectorOrCallback, callback) {\n\t\t\tif (typeof events === 'string') {\n\t\t\t\tevents = events + this.ns;\n\t\t\t} else {\n\t\t\t\tevents = events.join(this.ns + ' ') + this.ns;\n\t\t\t}\n\n\t\t\tif (arguments.length > 3) {\n\t\t\t\t$target.on(events, selectorOrCallback, callback);\n\t\t\t} else {\n\t\t\t\t$target.on(events, selectorOrCallback);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: 'unbindEvents',\n\n\t\t/**\n Unbinds events specific to this instance from the given target DOMElement\n \t@private\n @method unbindEvents\n @param target {jQuery} jQuery-wrapped DOMElement to unbind events from\n @param events {String|Array} Event name (or array of) to unbind\n **/\n\t\tvalue: function unbindEvents($target, events) {\n\t\t\tif (typeof events === 'string') {\n\t\t\t\tevents = events + this.ns;\n\t\t\t} else if (events != null) {\n\t\t\t\tevents = events.join(this.ns + ' ') + this.ns;\n\t\t\t} else {\n\t\t\t\tevents = this.ns;\n\t\t\t}\n\n\t\t\t$target.off(events);\n\t\t}\n\t}, {\n\t\tkey: 'triggerEvent',\n\n\t\t/**\n Triggers an event on the
element for a given type with given\n arguments, also setting and allowing access to the originalEvent if\n given. Returns the result of the triggered event.\n \t@private\n @method triggerEvent\n @param type {String} Event name\n @param args {Array} Array of arguments to pass through\n @param [originalEvent] If given, is set on the event object\n @return {Mixed} Result of the event trigger action\n **/\n\t\tvalue: function triggerEvent(type, args, originalEvent) {\n\t\t\tvar event = $.Event(type);\n\t\t\tif (event.originalEvent) {\n\t\t\t\tevent.originalEvent = $.extend({}, originalEvent);\n\t\t\t}\n\n\t\t\treturn this.$table.trigger(event, [this].concat(args || []));\n\t\t}\n\t}, {\n\t\tkey: 'generateColumnId',\n\n\t\t/**\n Calculates a unique column ID for a given column DOMElement\n \t@private\n @method generateColumnId\n @param $el {jQuery} jQuery-wrapped column element\n @return {String} Column ID\n **/\n\t\tvalue: function generateColumnId($el) {\n\t\t\treturn this.$table.data(_constants.DATA_COLUMNS_ID) + '-' + $el.data(_constants.DATA_COLUMN_ID);\n\t\t}\n\t}, {\n\t\tkey: 'parseWidth',\n\n\t\t/**\n Parses a given DOMElement's width into a float\n \t@private\n @method parseWidth\n @param element {DOMElement} Element to get width of\n @return {Number} Element's width as a float\n **/\n\t\tvalue: function parseWidth(element) {\n\t\t\treturn element ? parseFloat(element.style.width.replace('%', '')) : 0;\n\t\t}\n\t}, {\n\t\tkey: 'setWidth',\n\n\t\t/**\n Sets the percentage width of a given DOMElement\n \t@private\n @method setWidth\n @param element {DOMElement} Element to set width on\n @param width {Number} Width, as a percentage, to set\n **/\n\t\tvalue: function setWidth(element, width) {\n\t\t\twidth = width.toFixed(2);\n\t\t\twidth = width > 0 ? width : 0;\n\t\t\telement.style.width = width + '%';\n\t\t}\n\t}, {\n\t\tkey: 'constrainWidth',\n\n\t\t/**\n Constrains a given width to the minimum and maximum ranges defined in\n the `minWidth` and `maxWidth` configuration options, respectively.\n \t@private\n @method constrainWidth\n @param width {Number} Width to constrain\n @return {Number} Constrained width\n **/\n\t\tvalue: function constrainWidth(width) {\n\t\t\tif (this.options.minWidth != undefined) {\n\t\t\t\twidth = Math.max(this.options.minWidth, width);\n\t\t\t}\n\n\t\t\tif (this.options.maxWidth != undefined) {\n\t\t\t\twidth = Math.min(this.options.maxWidth, width);\n\t\t\t}\n\n\t\t\treturn width;\n\t\t}\n\t}, {\n\t\tkey: 'getPointerX',\n\n\t\t/**\n Given a particular Event object, retrieves the current pointer offset along\n the horizontal direction. Accounts for both regular mouse clicks as well as\n pointer-like systems (mobiles, tablets etc.)\n \t@private\n @method getPointerX\n @param event {Object} Event object associated with the interaction\n @return {Number} Horizontal pointer offset\n **/\n\t\tvalue: function getPointerX(event) {\n\t\t\tif (event.type.indexOf('touch') === 0) {\n\t\t\t\treturn (event.originalEvent.touches[0] || event.originalEvent.changedTouches[0]).pageX;\n\t\t\t}\n\t\t\treturn event.pageX;\n\t\t}\n\t}]);\n\n\treturn ResizableColumns;\n})();\n\nexports['default'] = ResizableColumns;\n\nResizableColumns.defaults = {\n\tselector: function selector($table) {\n\t\tif ($table.find('thead').length) {\n\t\t\treturn _constants.SELECTOR_TH;\n\t\t}\n\n\t\treturn _constants.SELECTOR_TD;\n\t},\n\tstore: window.store,\n\tsyncHandlers: true,\n\tresizeFromBody: true,\n\tmaxWidth: null,\n\tminWidth: 0.01\n};\n\nResizableColumns.count = 0;\nmodule.exports = exports['default'];\n\n},{\"./constants\":3}],3:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\nvar DATA_API = 'resizableColumns';\nexports.DATA_API = DATA_API;\nvar DATA_COLUMNS_ID = 'resizable-columns-id';\nexports.DATA_COLUMNS_ID = DATA_COLUMNS_ID;\nvar DATA_COLUMN_ID = 'resizable-column-id';\nexports.DATA_COLUMN_ID = DATA_COLUMN_ID;\nvar DATA_TH = 'th';\n\nexports.DATA_TH = DATA_TH;\nvar CLASS_TABLE_RESIZING = 'rc-table-resizing';\nexports.CLASS_TABLE_RESIZING = CLASS_TABLE_RESIZING;\nvar CLASS_COLUMN_RESIZING = 'rc-column-resizing';\nexports.CLASS_COLUMN_RESIZING = CLASS_COLUMN_RESIZING;\nvar CLASS_HANDLE = 'rc-handle';\nexports.CLASS_HANDLE = CLASS_HANDLE;\nvar CLASS_HANDLE_CONTAINER = 'rc-handle-container';\n\nexports.CLASS_HANDLE_CONTAINER = CLASS_HANDLE_CONTAINER;\nvar EVENT_RESIZE_START = 'column:resize:start';\nexports.EVENT_RESIZE_START = EVENT_RESIZE_START;\nvar EVENT_RESIZE = 'column:resize';\nexports.EVENT_RESIZE = EVENT_RESIZE;\nvar EVENT_RESIZE_STOP = 'column:resize:stop';\n\nexports.EVENT_RESIZE_STOP = EVENT_RESIZE_STOP;\nvar SELECTOR_TH = 'tr:first > th:visible';\nexports.SELECTOR_TH = SELECTOR_TH;\nvar SELECTOR_TD = 'tr:first > td:visible';\nexports.SELECTOR_TD = SELECTOR_TD;\nvar SELECTOR_UNRESIZABLE = '[data-noresize]';\nexports.SELECTOR_UNRESIZABLE = SELECTOR_UNRESIZABLE;\n\n},{}],4:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, '__esModule', {\n value: true\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\nvar _class = require('./class');\n\nvar _class2 = _interopRequireDefault(_class);\n\nvar _adapter = require('./adapter');\n\nvar _adapter2 = _interopRequireDefault(_adapter);\n\nexports['default'] = _class2['default'];\nmodule.exports = exports['default'];\n\n},{\"./adapter\":1,\"./class\":2}]},{},[4])\n\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvYWRhcHRlci5qcyIsInNyYy9jbGFzcy5qcyIsInNyYy9jb25zdGFudHMuanMiLCJzcmMvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O3FCQ0E2QixTQUFTOzs7O3lCQUNmLGFBQWE7O0FBRXBDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEdBQUcsVUFBUyxlQUFlLEVBQVc7bUNBQU4sSUFBSTtBQUFKLE1BQUk7OztBQUN4RCxRQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBVztBQUMzQixNQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRXJCLE1BQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLFlBTmYsUUFBUSxDQU1pQixDQUFDO0FBQ2hDLE1BQUksQ0FBQyxHQUFHLEVBQUU7QUFDVCxNQUFHLEdBQUcsdUJBQXFCLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNwRCxTQUFNLENBQUMsSUFBSSxZQVROLFFBQVEsRUFTUyxHQUFHLENBQUMsQ0FBQztHQUMzQixNQUVJLElBQUksT0FBTyxlQUFlLEtBQUssUUFBUSxFQUFFO0FBQzdDLFVBQU8sR0FBRyxDQUFDLGVBQWUsT0FBQyxDQUFwQixHQUFHLEVBQXFCLElBQUksQ0FBQyxDQUFDO0dBQ3JDO0VBQ0QsQ0FBQyxDQUFDO0NBQ0gsQ0FBQzs7QUFFRixDQUFDLENBQUMsZ0JBQWdCLHFCQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7O3lCQ0hqQyxhQUFhOzs7Ozs7Ozs7OztJQVVHLGdCQUFnQjtBQUN6QixVQURTLGdCQUFnQixDQUN4QixNQUFNLEVBQUUsT0FBTyxFQUFFO3dCQURULGdCQUFnQjs7QUFFbkMsTUFBSSxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDOztBQUUvQixNQUFJ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QUM7UUFBdkMsY0FBYyxHQUFkLGNBQWM7QUFDcEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDOztRQUFmLE9BQU8sR0FBUCxPQUFPO0FBRWIsSUFBTSxvQkFBb0IsR0FBRyxtQkFBbUIsQ0FBQztRQUEzQyxvQkFBb0IsR0FBcEIsb0JBQW9CO0FBQzFCLElBQU0scUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7UUFBN0MscUJBQXFCLEdBQXJCLHFCQUFxQjtBQUMzQixJQUFNLFlBQVksR0FBRyxXQUFXLENBQUM7UUFBM0IsWUFBWSxHQUFaLFlBQVk7QUFDbEIsSUFBTSxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQzs7UUFBL0Msc0JBQXNCLEdBQXRCLHNCQUFzQjtBQUU1QixJQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDO1FBQTNDLGtCQUFrQixHQUFsQixrQkFBa0I7QUFDeEIsSUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDO1FBQS9CLFlBQVksR0FBWixZQUFZO0FBQ2xCLElBQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUM7O1FBQXpDLGlCQUFpQixHQUFqQixpQkFBaUI7QUFFdkIsSUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7UUFBdEMsV0FBVyxHQUFYLFdBQVc7QUFDakIsSUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7UUFBdEMsV0FBVyxHQUFYLFdBQVc7QUFDakIsSUFBTSxvQkFBb0Isb0JBQW9CLENBQUM7UUFBekMsb0JBQW9CLEdBQXBCLG9CQUFvQjs7Ozs7Ozs7Ozs7cUJDaEJKLFNBQVM7Ozs7dUJBQ2xCLFdBQVciLCJmaWxlIjoianF1ZXJ5LnJlc2l6YWJsZUNvbHVtbnMuanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8iLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsImltcG9ydCBSZXNpemFibGVDb2x1bW5zIGZyb20gJy4vY2xhc3MnO1xuaW1wb3J0IHtEQVRBX0FQSX0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4kLmZuLnJlc2l6YWJsZUNvbHVtbnMgPSBmdW5jdGlvbihvcHRpb25zT3JNZXRob2QsIC4uLmFyZ3MpIHtcblx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRsZXQgJHRhYmxlID0gJCh0aGlzKTtcblxuXHRcdGxldCBhcGkgPSAkdGFibGUuZGF0YShEQVRBX0FQSSk7XG5cdFx0aWYgKCFhcGkpIHtcblx0XHRcdGFwaSA9IG5ldyBSZXNpemFibGVDb2x1bW5zKCR0YWJsZSwgb3B0aW9uc09yTWV0aG9kKTtcblx0XHRcdCR0YWJsZS5kYXRhKERBVEFfQVBJLCBhcGkpO1xuXHRcdH1cblxuXHRcdGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zT3JNZXRob2QgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gYXBpW29wdGlvbnNPck1ldGhvZF0oLi4uYXJncyk7XG5cdFx0fVxuXHR9KTtcbn07XG5cbiQucmVzaXphYmxlQ29sdW1ucyA9IFJlc2l6YWJsZUNvbHVtbnM7XG4iLCJpbXBvcnQge1xuXHREQVRBX0FQSSxcblx0REFUQV9DT0xVTU5TX0lELFxuXHREQVRBX0NPTFVNTl9JRCxcblx0REFUQV9USCxcblx0Q0xBU1NfVEFCTEVfUkVTSVpJTkcsXG5cdENMQVNTX0NPTFVNTl9SRVNJWklORyxcblx0Q0xBU1NfSEFORExFLFxuXHRDTEFTU19IQU5ETEVfQ09OVEFJTkVSLFxuXHRFVkVOVF9SRVNJWkVfU1RBUlQsXG5cdEVWRU5UX1JFU0laRSxcblx0RVZFTlRfUkVTSVpFX1NUT1AsXG5cdFNFTEVDVE9SX1RILFxuXHRTRUxFQ1RPUl9URCxcblx0U0VMRUNUT1JfVU5SRVNJWkFCTEVcbn1cbmZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG5UYWtlcyBhIDx0YWJsZSAvPiBlbGVtZW50IGFuZCBtYWtlcyBpdCdzIGNvbHVtbnMgcmVzaXphYmxlIGFjcm9zcyBib3RoXG5tb2JpbGUgYW5kIGRlc2t0b3AgY2xpZW50cy5cblxuQGNsYXNzIFJlc2l6YWJsZUNvbHVtbnNcbkBwYXJhbSAkdGFibGUge2pRdWVyeX0galF1ZXJ5LXdyYXBwZWQgPHRhYmxlPiBlbGVtZW50IHRvIG1ha2UgcmVzaXphYmxlXG5AcGFyYW0gb3B0aW9ucyB7T2JqZWN0fSBDb25maWd1cmF0aW9uIG9iamVjdFxuKiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNpemFibGVDb2x1bW5zIHtcblx0Y29uc3RydWN0b3IoJHRhYmxlLCBvcHRpb25zKSB7XG5cdFx0dGhpcy5ucyA9ICcucmMnICsgdGhpcy5jb3VudCsrO1xuXG5cdFx0dGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sIFJlc2l6YWJsZUNvbHVtbnMuZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG5cdFx0dGhpcy4kd2luZG93ID0gJCh3aW5kb3cpO1xuXHRcdHRoaXMuJG93bmVyRG9jdW1lbnQgPSAkKCR0YWJsZVswXS5vd25lckRvY3VtZW50KTtcblx0XHR0aGlzLiR0YWJsZSA9ICR0YWJsZTtcblxuXHRcdHRoaXMucmVmcmVzaEhlYWRlcnMoKTtcblx0XHR0aGlzLnJlc3RvcmVDb2x1bW5XaWR0aHMoKTtcblx0XHR0aGlzLnN5bmNIYW5kbGVXaWR0aHMoKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLiR3aW5kb3csICdyZXNpemUnLCB0aGlzLnN5bmNIYW5kbGVXaWR0aHMuYmluZCh0aGlzKSk7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLnN0YXJ0KSB7XG5cdFx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kdGFibGUsIEVWRU5UX1JFU0laRV9TVEFSVCwgdGhpcy5vcHRpb25zLnN0YXJ0KTtcblx0XHR9XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5yZXNpemUpIHtcblx0XHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLiR0YWJsZSwgRVZFTlRfUkVTSVpFLCB0aGlzLm9wdGlvbnMucmVzaXplKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5zdG9wKSB7XG5cdFx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kdGFibGUsIEVWRU5UX1JFU0laRV9TVE9QLCB0aGlzLm9wdGlvbnMuc3RvcCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdFJlZnJlc2hlcyB0aGUgaGVhZGVycyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbnN0YW5jZXMgPHRhYmxlLz4gZWxlbWVudCBhbmRcblx0Z2VuZXJhdGVzIGhhbmRsZXMgZm9yIHRoZW0uIEFsc28gYXNzaWducyBwZXJjZW50YWdlIHdpZHRocy5cblxuXHRAbWV0aG9kIHJlZnJlc2hIZWFkZXJzXG5cdCoqL1xuXHRyZWZyZXNoSGVhZGVycygpIHtcblx0XHQvLyBBbGxvdyB0aGUgc2VsZWN0b3IgdG8gYmUgYm90aCBhIHJlZ3VsYXIgc2VsY3RvciBzdHJpbmcgYXMgd2VsbCBhc1xuXHRcdC8vIGEgZHluYW1pYyBjYWxsYmFja1xuXHRcdGxldCBzZWxlY3RvciA9IHRoaXMub3B0aW9ucy5zZWxlY3Rvcjtcblx0XHRpZih0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3IuY2FsbCh0aGlzLCB0aGlzLiR0YWJsZSk7XG5cdFx0fVxuXG5cdFx0Ly8gU2VsZWN0IGFsbCB0YWJsZSBoZWFkZXJzXG5cdFx0dGhpcy4kdGFibGVIZWFkZXJzID0gdGhpcy4kdGFibGUuZmluZChzZWxlY3Rvcik7XG5cblx0XHQvLyBBc3NpZ24gcGVyY2VudGFnZSB3aWR0aHMgZmlyc3QsIHRoZW4gY3JlYXRlIGRyYWcgaGFuZGxlc1xuXHRcdHRoaXMuYXNzaWduUGVyY2VudGFnZVdpZHRocygpO1xuXHRcdHRoaXMuY3JlYXRlSGFuZGxlcygpO1xuXHR9XG5cblx0LyoqXG5cdENyZWF0ZXMgZHVtbXkgaGFuZGxlIGVsZW1lbnRzIGZvciBhbGwgdGFibGUgaGVhZGVyIGNvbHVtbnNcblxuXHRAbWV0aG9kIGNyZWF0ZUhhbmRsZXNcblx0KiovXG5cdGNyZWF0ZUhhbmRsZXMoKSB7XG5cdFx0bGV0IHJlZiA9IHRoaXMuJGhhbmRsZUNvbnRhaW5lcjtcblx0XHRpZiAocmVmICE9IG51bGwpIHtcblx0XHRcdHJlZi5yZW1vdmUoKTtcblx0XHR9XG5cblx0XHR0aGlzLiRoYW5kbGVDb250YWluZXIgPSAkKGA8ZGl2IGNsYXNzPScke0NMQVNTX0hBTkRMRV9DT05UQUlORVJ9JyAvPmApXG5cdFx0dGhpcy4kdGFibGUuYmVmb3JlKHRoaXMuJGhhbmRsZUNvbnRhaW5lcik7XG5cblx0XHR0aGlzLiR0YWJsZUhlYWRlcnMuZWFjaCgoaSwgZWwpID0+IHtcblx0XHRcdGxldCAkY3VycmVudCA9IHRoaXMuJHRhYmxlSGVhZGVycy5lcShpKTtcblx0XHRcdGxldCAkbmV4dCA9IHRoaXMuJHRhYmxlSGVhZGVycy5lcShpICsgMSk7XG5cblx0XHRcdGlmICgkbmV4dC5sZW5ndGggPT09IDAgfHwgJGN1cnJlbnQuaXMoU0VMRUNUT1JfVU5SRVNJWkFCTEUpIHx8ICRuZXh0LmlzKFNFTEVDVE9SX1VOUkVTSVpBQkxFKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGxldCAkaGFuZGxlID0gJChgPGRpdiBjbGFzcz0nJHtDTEFTU19IQU5ETEV9JyAvPmApXG5cdFx0XHRcdC5kYXRhKERBVEFfVEgsICQoZWwpKVxuXHRcdFx0XHQuYXBwZW5kVG8odGhpcy4kaGFuZGxlQ29udGFpbmVyKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLiRoYW5kbGVDb250YWluZXIsIFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwgJy4nK0NMQVNTX0hBTkRMRSwgdGhpcy5vblBvaW50ZXJEb3duLmJpbmQodGhpcykpO1xuXHR9XG5cblx0LyoqXG5cdEFzc2lnbnMgYSBwZXJjZW50YWdlIHdpZHRoIHRvIGFsbCBjb2x1bW5zIGJhc2VkIG9uIHRoZWlyIGN1cnJlbnQgcGl4ZWwgd2lkdGgocylcblxuXHRAbWV0aG9kIGFzc2lnblBlcmNlbnRhZ2VXaWR0aHNcblx0KiovXG5cdGFzc2lnblBlcmNlbnRhZ2VXaWR0aHMoKSB7XG5cdFx0dGhpcy4kdGFibGVIZWFkZXJzLmVhY2goKF8sIGVsKSA9PiB7XG5cdFx0XHRsZXQgJGVsID0gJChlbCk7XG5cdFx0XHR0aGlzLnNldFdpZHRoKCRlbFswXSwgJGVsLm91dGVyV2lkdGgoKSAvIHRoaXMuJHRhYmxlLndpZHRoKCkgKiAxMDApO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cblxuXHRAbWV0aG9kIHN5bmNIYW5kbGVXaWR0aHNcblx0KiovXG5cdHN5bmNIYW5kbGVXaWR0aHMoKSB7XG5cdFx0bGV0ICRjb250YWluZXIgPSB0aGlzLiRoYW5kbGVDb250YWluZXJcblxuXHRcdCRjb250YWluZXIud2lkdGgodGhpcy4kdGFibGUud2lkdGgoKSk7XG5cblx0XHQkY29udGFpbmVyLmZpbmQoJy4nK0NMQVNTX0hBTkRMRSkuZWFjaCgoXywgZWwpID0+IHtcblx0XHRcdGxldCAkZWwgPSAkKGVsKTtcblxuXHRcdFx0bGV0IGhlaWdodCA9IHRoaXMub3B0aW9ucy5yZXNpemVGcm9tQm9keSA/XG5cdFx0XHRcdHRoaXMuJHRhYmxlLmhlaWdodCgpIDpcblx0XHRcdFx0dGhpcy4kdGFibGUuZmluZCgndGhlYWQnKS5oZWlnaHQoKTtcblxuXHRcdFx0bGV0IGxlZnQgPSAkZWwuZGF0YShEQVRBX1RIKS5vdXRlcldpZHRoKCkgKyAoXG5cdFx0XHRcdCRlbC5kYXRhKERBVEFfVEgpLm9mZnNldCgpLmxlZnQgLSB0aGlzLiRoYW5kbGVDb250YWluZXIub2Zmc2V0KCkubGVmdFxuXHRcdFx0KTtcblxuXHRcdFx0JGVsLmNzcyh7IGxlZnQsIGhlaWdodCB9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHRQZXJzaXN0cyB0aGUgY29sdW1uIHdpZHRocyBpbiBsb2NhbFN0b3JhZ2VcblxuXHRAbWV0aG9kIHNhdmVDb2x1bW5XaWR0aHNcblx0KiovXG5cdHNhdmVDb2x1bW5XaWR0aHMoKSB7XG5cdFx0dGhpcy4kdGFibGVIZWFkZXJzLmVhY2goKF8sIGVsKSA9PiB7XG5cdFx0XHRsZXQgJGVsID0gJChlbCk7XG5cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuc3RvcmUgJiYgISRlbC5pcyhTRUxFQ1RPUl9VTlJFU0laQUJMRSkpIHtcblx0XHRcdFx0dGhpcy5vcHRpb25zLnN0b3JlLnNldChcblx0XHRcdFx0XHR0aGlzLmdlbmVyYXRlQ29sdW1uSWQoJGVsKSxcblx0XHRcdFx0XHR0aGlzLnBhcnNlV2lkdGgoZWwpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0UmV0cmlldmVzIGFuZCBzZXRzIHRoZSBjb2x1bW4gd2lkdGhzIGZyb20gbG9jYWxTdG9yYWdlXG5cblx0QG1ldGhvZCByZXN0b3JlQ29sdW1uV2lkdGhzXG5cdCoqL1xuXHRyZXN0b3JlQ29sdW1uV2lkdGhzKCkge1xuXHRcdHRoaXMuJHRhYmxlSGVhZGVycy5lYWNoKChfLCBlbCkgPT4ge1xuXHRcdFx0bGV0ICRlbCA9ICQoZWwpO1xuXG5cdFx0XHRpZih0aGlzLm9wdGlvbnMuc3RvcmUgJiYgISRlbC5pcyhTRUxFQ1RPUl9VTlJFU0laQUJMRSkpIHtcblx0XHRcdFx0bGV0IHdpZHRoID0gdGhpcy5vcHRpb25zLnN0b3JlLmdldChcblx0XHRcdFx0XHR0aGlzLmdlbmVyYXRlQ29sdW1uSWQoJGVsKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmKHdpZHRoICE9IG51bGwpIHtcblx0XHRcdFx0XHR0aGlzLnNldFdpZHRoKGVsLCB3aWR0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHRQb2ludGVyL21vdXNlIGRvd24gaGFuZGxlclxuXG5cdEBtZXRob2Qgb25Qb2ludGVyRG93blxuXHRAcGFyYW0gZXZlbnQge09iamVjdH0gRXZlbnQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW50ZXJhY3Rpb25cblx0KiovXG5cdG9uUG9pbnRlckRvd24oZXZlbnQpIHtcblx0XHQvLyBPbmx5IGFwcGxpZXMgdG8gbGVmdC1jbGljayBkcmFnZ2luZ1xuXHRcdGlmKGV2ZW50LndoaWNoICE9PSAxKSB7IHJldHVybjsgfVxuXG5cdFx0Ly8gSWYgYSBwcmV2aW91cyBvcGVyYXRpb24gaXMgZGVmaW5lZCwgd2UgbWlzc2VkIHRoZSBsYXN0IG1vdXNldXAuXG5cdFx0Ly8gUHJvYmFibHkgZ29iYmxlZCB1cCBieSB1c2VyIG1vdXNpbmcgb3V0IHRoZSB3aW5kb3cgdGhlbiByZWxlYXNpbmcuXG5cdFx0Ly8gV2UnbGwgc2ltdWxhdGUgYSBwb2ludGVydXAgaGVyZSBwcmlvciB0byBpdFxuXHRcdGlmKHRoaXMub3BlcmF0aW9uKSB7XG5cdFx0XHR0aGlzLm9uUG9pbnRlclVwKGV2ZW50KTtcblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgbm9uLXJlc2l6YWJsZSBjb2x1bW5zXG5cdFx0bGV0ICRjdXJyZW50R3JpcCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cdFx0aWYoJGN1cnJlbnRHcmlwLmlzKFNFTEVDVE9SX1VOUkVTSVpBQkxFKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGxldCBncmlwSW5kZXggPSAkY3VycmVudEdyaXAuaW5kZXgoKTtcblx0XHRsZXQgJGxlZnRDb2x1bW4gPSB0aGlzLiR0YWJsZUhlYWRlcnMuZXEoZ3JpcEluZGV4KS5ub3QoU0VMRUNUT1JfVU5SRVNJWkFCTEUpO1xuXHRcdGxldCAkcmlnaHRDb2x1bW4gPSB0aGlzLiR0YWJsZUhlYWRlcnMuZXEoZ3JpcEluZGV4ICsgMSkubm90KFNFTEVDVE9SX1VOUkVTSVpBQkxFKTtcblxuXHRcdGxldCBsZWZ0V2lkdGggPSB0aGlzLnBhcnNlV2lkdGgoJGxlZnRDb2x1bW5bMF0pO1xuXHRcdGxldCByaWdodFdpZHRoID0gdGhpcy5wYXJzZVdpZHRoKCRyaWdodENvbHVtblswXSk7XG5cblx0XHR0aGlzLm9wZXJhdGlvbiA9IHtcblx0XHRcdCRsZWZ0Q29sdW1uLCAkcmlnaHRDb2x1bW4sICRjdXJyZW50R3JpcCxcblxuXHRcdFx0c3RhcnRYOiB0aGlzLmdldFBvaW50ZXJYKGV2ZW50KSxcblxuXHRcdFx0d2lkdGhzOiB7XG5cdFx0XHRcdGxlZnQ6IGxlZnRXaWR0aCxcblx0XHRcdFx0cmlnaHQ6IHJpZ2h0V2lkdGhcblx0XHRcdH0sXG5cdFx0XHRuZXdXaWR0aHM6IHtcblx0XHRcdFx0bGVmdDogbGVmdFdpZHRoLFxuXHRcdFx0XHRyaWdodDogcmlnaHRXaWR0aFxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kb3duZXJEb2N1bWVudCwgWydtb3VzZW1vdmUnLCAndG91Y2htb3ZlJ10sIHRoaXMub25Qb2ludGVyTW92ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy4kb3duZXJEb2N1bWVudCwgWydtb3VzZXVwJywgJ3RvdWNoZW5kJ10sIHRoaXMub25Qb2ludGVyVXAuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLiRoYW5kbGVDb250YWluZXJcblx0XHRcdC5hZGQodGhpcy4kdGFibGUpXG5cdFx0XHQuYWRkQ2xhc3MoQ0xBU1NfVEFCTEVfUkVTSVpJTkcpO1xuXG5cdFx0JGxlZnRDb2x1bW5cblx0XHRcdC5hZGQoJHJpZ2h0Q29sdW1uKVxuXHRcdFx0LmFkZCgkY3VycmVudEdyaXApXG5cdFx0XHQuYWRkQ2xhc3MoQ0xBU1NfQ09MVU1OX1JFU0laSU5HKTtcblxuXHRcdHRoaXMudHJpZ2dlckV2ZW50KEVWRU5UX1JFU0laRV9TVEFSVCwgW1xuXHRcdFx0JGxlZnRDb2x1bW4sICRyaWdodENvbHVtbixcblx0XHRcdGxlZnRXaWR0aCwgcmlnaHRXaWR0aFxuXHRcdF0sXG5cdFx0ZXZlbnQpO1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0fVxuXG5cdC8qKlxuXHRQb2ludGVyL21vdXNlIG1vdmVtZW50IGhhbmRsZXJcblxuXHRAbWV0aG9kIG9uUG9pbnRlck1vdmVcblx0QHBhcmFtIGV2ZW50IHtPYmplY3R9IEV2ZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyYWN0aW9uXG5cdCoqL1xuXHRvblBvaW50ZXJNb3ZlKGV2ZW50KSB7XG5cdFx0bGV0IG9wID0gdGhpcy5vcGVyYXRpb247XG5cdFx0aWYoIXRoaXMub3BlcmF0aW9uKSB7IHJldHVybjsgfVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSBkZWx0YSBjaGFuZ2UgYmV0d2VlbiBzdGFydCBhbmQgbmV3IG1vdXNlIHBvc2l0aW9uLCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhYmxlIHdpZHRoXG5cdFx0bGV0IGRpZmZlcmVuY2UgPSAodGhpcy5nZXRQb2ludGVyWChldmVudCkgLSBvcC5zdGFydFgpIC8gdGhpcy4kdGFibGUud2lkdGgoKSAqIDEwMDtcblx0XHRpZihkaWZmZXJlbmNlID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0bGV0IGxlZnRDb2x1bW4gPSBvcC4kbGVmdENvbHVtblswXTtcblx0XHRsZXQgcmlnaHRDb2x1bW4gPSBvcC4kcmlnaHRDb2x1bW5bMF07XG5cdFx0bGV0IHdpZHRoTGVmdCwgd2lkdGhSaWdodDtcblxuXHRcdGlmKGRpZmZlcmVuY2UgPiAwKSB7XG5cdFx0XHR3aWR0aExlZnQgPSB0aGlzLmNvbnN0cmFpbldpZHRoKG9wLndpZHRocy5sZWZ0ICsgKG9wLndpZHRocy5yaWdodCAtIG9wLm5ld1dpZHRocy5yaWdodCkpO1xuXHRcdFx0d2lkdGhSaWdodCA9IHRoaXMuY29uc3RyYWluV2lkdGgob3Aud2lkdGhzLnJpZ2h0IC0gZGlmZmVyZW5jZSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYoZGlmZmVyZW5jZSA8IDApIHtcblx0XHRcdHdpZHRoTGVmdCA9IHRoaXMuY29uc3RyYWluV2lkdGgob3Aud2lkdGhzLmxlZnQgKyBkaWZmZXJlbmNlKTtcblx0XHRcdHdpZHRoUmlnaHQgPSB0aGlzLmNvbnN0cmFpbldpZHRoKG9wLndpZHRocy5yaWdodCArIChvcC53aWR0aHMubGVmdCAtIG9wLm5ld1dpZHRocy5sZWZ0KSk7XG5cdFx0fVxuXG5cdFx0aWYobGVmdENvbHVtbikge1xuXHRcdFx0dGhpcy5zZXRXaWR0aChsZWZ0Q29sdW1uLCB3aWR0aExlZnQpO1xuXHRcdH1cblx0XHRpZihyaWdodENvbHVtbikge1xuXHRcdFx0dGhpcy5zZXRXaWR0aChyaWdodENvbHVtbiwgd2lkdGhSaWdodCk7XG5cdFx0fVxuXG5cdFx0b3AubmV3V2lkdGhzLmxlZnQgPSB3aWR0aExlZnQ7XG5cdFx0b3AubmV3V2lkdGhzLnJpZ2h0ID0gd2lkdGhSaWdodDtcblxuXHRcdHJldHVybiB0aGlzLnRyaWdnZXJFdmVudChFVkVOVF9SRVNJWkUsIFtcblx0XHRcdG9wLiRsZWZ0Q29sdW1uLCBvcC4kcmlnaHRDb2x1bW4sXG5cdFx0XHR3aWR0aExlZnQsIHdpZHRoUmlnaHRcblx0XHRdLFxuXHRcdGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHRQb2ludGVyL21vdXNlIHJlbGVhc2UgaGFuZGxlclxuXG5cdEBtZXRob2Qgb25Qb2ludGVyVXBcblx0QHBhcmFtIGV2ZW50IHtPYmplY3R9IEV2ZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyYWN0aW9uXG5cdCoqL1xuXHRvblBvaW50ZXJVcChldmVudCkge1xuXHRcdGxldCBvcCA9IHRoaXMub3BlcmF0aW9uO1xuXHRcdGlmKCF0aGlzLm9wZXJhdGlvbikgeyByZXR1cm47IH1cblxuXHRcdHRoaXMudW5iaW5kRXZlbnRzKHRoaXMuJG93bmVyRG9jdW1lbnQsIFsnbW91c2V1cCcsICd0b3VjaGVuZCcsICdtb3VzZW1vdmUnLCAndG91Y2htb3ZlJ10pO1xuXG5cdFx0dGhpcy4kaGFuZGxlQ29udGFpbmVyXG5cdFx0XHQuYWRkKHRoaXMuJHRhYmxlKVxuXHRcdFx0LnJlbW92ZUNsYXNzKENMQVNTX1RBQkxFX1JFU0laSU5HKTtcblxuXHRcdG9wLiRsZWZ0Q29sdW1uXG5cdFx0XHQuYWRkKG9wLiRyaWdodENvbHVtbilcblx0XHRcdC5hZGQob3AuJGN1cnJlbnRHcmlwKVxuXHRcdFx0LnJlbW92ZUNsYXNzKENMQVNTX0NPTFVNTl9SRVNJWklORyk7XG5cblx0XHR0aGlzLnN5bmNIYW5kbGVXaWR0aHMoKTtcblx0XHR0aGlzLnNhdmVDb2x1bW5XaWR0aHMoKTtcblxuXHRcdHRoaXMub3BlcmF0aW9uID0gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLnRyaWdnZXJFdmVudChFVkVOVF9SRVNJWkVfU1RPUCwgW1xuXHRcdFx0b3AuJGxlZnRDb2x1bW4sIG9wLiRyaWdodENvbHVtbixcblx0XHRcdG9wLm5ld1dpZHRocy5sZWZ0LCBvcC5uZXdXaWR0aHMucmlnaHRcblx0XHRdLFxuXHRcdGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHRSZW1vdmVzIGFsbCBldmVudCBsaXN0ZW5lcnMsIGRhdGEsIGFuZCBhZGRlZCBET00gZWxlbWVudHMuIFRha2VzXG5cdHRoZSA8dGFibGUvPiBlbGVtZW50IGJhY2sgdG8gaG93IGl0IHdhcywgYW5kIHJldHVybnMgaXRcblxuXHRAbWV0aG9kIGRlc3Ryb3lcblx0QHJldHVybiB7alF1ZXJ5fSBPcmlnaW5hbCBqUXVlcnktd3JhcHBlZCA8dGFibGU+IGVsZW1lbnRcblx0KiovXG5cdGRlc3Ryb3koKSB7XG5cdFx0bGV0ICR0YWJsZSA9IHRoaXMuJHRhYmxlO1xuXHRcdGxldCAkaGFuZGxlcyA9IHRoaXMuJGhhbmRsZUNvbnRhaW5lci5maW5kKCcuJytDTEFTU19IQU5ETEUpO1xuXG5cdFx0dGhpcy51bmJpbmRFdmVudHMoXG5cdFx0XHR0aGlzLiR3aW5kb3dcblx0XHRcdFx0LmFkZCh0aGlzLiRvd25lckRvY3VtZW50KVxuXHRcdFx0XHQuYWRkKHRoaXMuJHRhYmxlKVxuXHRcdFx0XHQuYWRkKCRoYW5kbGVzKVxuXHRcdCk7XG5cblx0XHQkaGFuZGxlcy5yZW1vdmVEYXRhKERBVEFfVEgpO1xuXHRcdCR0YWJsZS5yZW1vdmVEYXRhKERBVEFfQVBJKTtcblxuXHRcdHRoaXMuJGhhbmRsZUNvbnRhaW5lci5yZW1vdmUoKTtcblx0XHR0aGlzLiRoYW5kbGVDb250YWluZXIgPSBudWxsO1xuXHRcdHRoaXMuJHRhYmxlSGVhZGVycyA9IG51bGw7XG5cdFx0dGhpcy4kdGFibGUgPSBudWxsO1xuXG5cdFx0cmV0dXJuICR0YWJsZTtcblx0fVxuXG5cdC8qKlxuXHRCaW5kcyBnaXZlbiBldmVudHMgZm9yIHRoaXMgaW5zdGFuY2UgdG8gdGhlIGdpdmVuIHRhcmdldCBET01FbGVtZW50XG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCBiaW5kRXZlbnRzXG5cdEBwYXJhbSB0YXJnZXQge2pRdWVyeX0galF1ZXJ5LXdyYXBwZWQgRE9NRWxlbWVudCB0byBiaW5kIGV2ZW50cyB0b1xuXHRAcGFyYW0gZXZlbnRzIHtTdHJpbmd8QXJyYXl9IEV2ZW50IG5hbWUgKG9yIGFycmF5IG9mKSB0byBiaW5kXG5cdEBwYXJhbSBzZWxlY3Rvck9yQ2FsbGJhY2sge1N0cmluZ3xGdW5jdGlvbn0gU2VsZWN0b3Igc3RyaW5nIG9yIGNhbGxiYWNrXG5cdEBwYXJhbSBbY2FsbGJhY2tdIHtGdW5jdGlvbn0gQ2FsbGJhY2sgbWV0aG9kXG5cdCoqL1xuXHRiaW5kRXZlbnRzKCR0YXJnZXQsIGV2ZW50cywgc2VsZWN0b3JPckNhbGxiYWNrLCBjYWxsYmFjaykge1xuXHRcdGlmKHR5cGVvZiBldmVudHMgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRldmVudHMgPSBldmVudHMgKyB0aGlzLm5zO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGV2ZW50cyA9IGV2ZW50cy5qb2luKHRoaXMubnMgKyAnICcpICsgdGhpcy5ucztcblx0XHR9XG5cblx0XHRpZihhcmd1bWVudHMubGVuZ3RoID4gMykge1xuXHRcdFx0JHRhcmdldC5vbihldmVudHMsIHNlbGVjdG9yT3JDYWxsYmFjaywgY2FsbGJhY2spO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdCR0YXJnZXQub24oZXZlbnRzLCBzZWxlY3Rvck9yQ2FsbGJhY2spO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHRVbmJpbmRzIGV2ZW50cyBzcGVjaWZpYyB0byB0aGlzIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIHRhcmdldCBET01FbGVtZW50XG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCB1bmJpbmRFdmVudHNcblx0QHBhcmFtIHRhcmdldCB7alF1ZXJ5fSBqUXVlcnktd3JhcHBlZCBET01FbGVtZW50IHRvIHVuYmluZCBldmVudHMgZnJvbVxuXHRAcGFyYW0gZXZlbnRzIHtTdHJpbmd8QXJyYXl9IEV2ZW50IG5hbWUgKG9yIGFycmF5IG9mKSB0byB1bmJpbmRcblx0KiovXG5cdHVuYmluZEV2ZW50cygkdGFyZ2V0LCBldmVudHMpIHtcblx0XHRpZih0eXBlb2YgZXZlbnRzID09PSAnc3RyaW5nJykge1xuXHRcdFx0ZXZlbnRzID0gZXZlbnRzICsgdGhpcy5ucztcblx0XHR9XG5cdFx0ZWxzZSBpZihldmVudHMgIT0gbnVsbCkge1xuXHRcdFx0ZXZlbnRzID0gZXZlbnRzLmpvaW4odGhpcy5ucyArICcgJykgKyB0aGlzLm5zO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGV2ZW50cyA9IHRoaXMubnM7XG5cdFx0fVxuXG5cdFx0JHRhcmdldC5vZmYoZXZlbnRzKTtcblx0fVxuXG5cdC8qKlxuXHRUcmlnZ2VycyBhbiBldmVudCBvbiB0aGUgPHRhYmxlLz4gZWxlbWVudCBmb3IgYSBnaXZlbiB0eXBlIHdpdGggZ2l2ZW5cblx0YXJndW1lbnRzLCBhbHNvIHNldHRpbmcgYW5kIGFsbG93aW5nIGFjY2VzcyB0byB0aGUgb3JpZ2luYWxFdmVudCBpZlxuXHRnaXZlbi4gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSB0cmlnZ2VyZWQgZXZlbnQuXG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCB0cmlnZ2VyRXZlbnRcblx0QHBhcmFtIHR5cGUge1N0cmluZ30gRXZlbnQgbmFtZVxuXHRAcGFyYW0gYXJncyB7QXJyYXl9IEFycmF5IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRocm91Z2hcblx0QHBhcmFtIFtvcmlnaW5hbEV2ZW50XSBJZiBnaXZlbiwgaXMgc2V0IG9uIHRoZSBldmVudCBvYmplY3Rcblx0QHJldHVybiB7TWl4ZWR9IFJlc3VsdCBvZiB0aGUgZXZlbnQgdHJpZ2dlciBhY3Rpb25cblx0KiovXG5cdHRyaWdnZXJFdmVudCh0eXBlLCBhcmdzLCBvcmlnaW5hbEV2ZW50KSB7XG5cdFx0bGV0IGV2ZW50ID0gJC5FdmVudCh0eXBlKTtcblx0XHRpZihldmVudC5vcmlnaW5hbEV2ZW50KSB7XG5cdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50ID0gJC5leHRlbmQoe30sIG9yaWdpbmFsRXZlbnQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLiR0YWJsZS50cmlnZ2VyKGV2ZW50LCBbdGhpc10uY29uY2F0KGFyZ3MgfHwgW10pKTtcblx0fVxuXG5cdC8qKlxuXHRDYWxjdWxhdGVzIGEgdW5pcXVlIGNvbHVtbiBJRCBmb3IgYSBnaXZlbiBjb2x1bW4gRE9NRWxlbWVudFxuXG5cdEBwcml2YXRlXG5cdEBtZXRob2QgZ2VuZXJhdGVDb2x1bW5JZFxuXHRAcGFyYW0gJGVsIHtqUXVlcnl9IGpRdWVyeS13cmFwcGVkIGNvbHVtbiBlbGVtZW50XG5cdEByZXR1cm4ge1N0cmluZ30gQ29sdW1uIElEXG5cdCoqL1xuXHRnZW5lcmF0ZUNvbHVtbklkKCRlbCkge1xuXHRcdHJldHVybiB0aGlzLiR0YWJsZS5kYXRhKERBVEFfQ09MVU1OU19JRCkgKyAnLScgKyAkZWwuZGF0YShEQVRBX0NPTFVNTl9JRCk7XG5cdH1cblxuXHQvKipcblx0UGFyc2VzIGEgZ2l2ZW4gRE9NRWxlbWVudCdzIHdpZHRoIGludG8gYSBmbG9hdFxuXG5cdEBwcml2YXRlXG5cdEBtZXRob2QgcGFyc2VXaWR0aFxuXHRAcGFyYW0gZWxlbWVudCB7RE9NRWxlbWVudH0gRWxlbWVudCB0byBnZXQgd2lkdGggb2Zcblx0QHJldHVybiB7TnVtYmVyfSBFbGVtZW50J3Mgd2lkdGggYXMgYSBmbG9hdFxuXHQqKi9cblx0cGFyc2VXaWR0aChlbGVtZW50KSB7XG5cdFx0cmV0dXJuIGVsZW1lbnQgPyBwYXJzZUZsb2F0KGVsZW1lbnQuc3R5bGUud2lkdGgucmVwbGFjZSgnJScsICcnKSkgOiAwO1xuXHR9XG5cblx0LyoqXG5cdFNldHMgdGhlIHBlcmNlbnRhZ2Ugd2lkdGggb2YgYSBnaXZlbiBET01FbGVtZW50XG5cblx0QHByaXZhdGVcblx0QG1ldGhvZCBzZXRXaWR0aFxuXHRAcGFyYW0gZWxlbWVudCB7RE9NRWxlbWVudH0gRWxlbWVudCB0byBzZXQgd2lkdGggb25cblx0QHBhcmFtIHdpZHRoIHtOdW1iZXJ9IFdpZHRoLCBhcyBhIHBlcmNlbnRhZ2UsIHRvIHNldFxuXHQqKi9cblx0c2V0V2lkdGgoZWxlbWVudCwgd2lkdGgpIHtcblx0XHR3aWR0aCA9IHdpZHRoLnRvRml4ZWQoMik7XG5cdFx0d2lkdGggPSB3aWR0aCA+IDAgPyB3aWR0aCA6IDA7XG5cdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJyUnO1xuXHR9XG5cblx0LyoqXG5cdENvbnN0cmFpbnMgYSBnaXZlbiB3aWR0aCB0byB0aGUgbWluaW11bSBhbmQgbWF4aW11bSByYW5nZXMgZGVmaW5lZCBpblxuXHR0aGUgYG1pbldpZHRoYCBhbmQgYG1heFdpZHRoYCBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHJlc3BlY3RpdmVseS5cblxuXHRAcHJpdmF0ZVxuXHRAbWV0aG9kIGNvbnN0cmFpbldpZHRoXG5cdEBwYXJhbSB3aWR0aCB7TnVtYmVyfSBXaWR0aCB0byBjb25zdHJhaW5cblx0QHJldHVybiB7TnVtYmVyfSBDb25zdHJhaW5lZCB3aWR0aFxuXHQqKi9cblx0Y29uc3RyYWluV2lkdGgod2lkdGgpIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLm1pbldpZHRoICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0d2lkdGggPSBNYXRoLm1heCh0aGlzLm9wdGlvbnMubWluV2lkdGgsIHdpZHRoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm1heFdpZHRoICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0d2lkdGggPSBNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4V2lkdGgsIHdpZHRoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gd2lkdGg7XG5cdH1cblxuXHQvKipcblx0R2l2ZW4gYSBwYXJ0aWN1bGFyIEV2ZW50IG9iamVjdCwgcmV0cmlldmVzIHRoZSBjdXJyZW50IHBvaW50ZXIgb2Zmc2V0IGFsb25nXG5cdHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbi4gQWNjb3VudHMgZm9yIGJvdGggcmVndWxhciBtb3VzZSBjbGlja3MgYXMgd2VsbCBhc1xuXHRwb2ludGVyLWxpa2Ugc3lzdGVtcyAobW9iaWxlcywgdGFibGV0cyBldGMuKVxuXG5cdEBwcml2YXRlXG5cdEBtZXRob2QgZ2V0UG9pbnRlclhcblx0QHBhcmFtIGV2ZW50IHtPYmplY3R9IEV2ZW50IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGludGVyYWN0aW9uXG5cdEByZXR1cm4ge051bWJlcn0gSG9yaXpvbnRhbCBwb2ludGVyIG9mZnNldFxuXHQqKi9cblx0Z2V0UG9pbnRlclgoZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQudHlwZS5pbmRleE9mKCd0b3VjaCcpID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gKGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdKS5wYWdlWDtcblx0XHR9XG5cdFx0cmV0dXJuIGV2ZW50LnBhZ2VYO1xuXHR9XG59XG5cblJlc2l6YWJsZUNvbHVtbnMuZGVmYXVsdHMgPSB7XG5cdHNlbGVjdG9yOiBmdW5jdGlvbigkdGFibGUpIHtcblx0XHRpZigkdGFibGUuZmluZCgndGhlYWQnKS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBTRUxFQ1RPUl9USDtcblx0XHR9XG5cblx0XHRyZXR1cm4gU0VMRUNUT1JfVEQ7XG5cdH0sXG5cdHN0b3JlOiB3aW5kb3cuc3RvcmUsXG5cdHN5bmNIYW5kbGVyczogdHJ1ZSxcblx0cmVzaXplRnJvbUJvZHk6IHRydWUsXG5cdG1heFdpZHRoOiBudWxsLFxuXHRtaW5XaWR0aDogMC4wMVxufTtcblxuUmVzaXphYmxlQ29sdW1ucy5jb3VudCA9IDA7XG4iLCJleHBvcnQgY29uc3QgREFUQV9BUEkgPSAncmVzaXphYmxlQ29sdW1ucyc7XG5leHBvcnQgY29uc3QgREFUQV9DT0xVTU5TX0lEID0gJ3Jlc2l6YWJsZS1jb2x1bW5zLWlkJztcbmV4cG9ydCBjb25zdCBEQVRBX0NPTFVNTl9JRCA9ICdyZXNpemFibGUtY29sdW1uLWlkJztcbmV4cG9ydCBjb25zdCBEQVRBX1RIID0gJ3RoJztcblxuZXhwb3J0IGNvbnN0IENMQVNTX1RBQkxFX1JFU0laSU5HID0gJ3JjLXRhYmxlLXJlc2l6aW5nJztcbmV4cG9ydCBjb25zdCBDTEFTU19DT0xVTU5fUkVTSVpJTkcgPSAncmMtY29sdW1uLXJlc2l6aW5nJztcbmV4cG9ydCBjb25zdCBDTEFTU19IQU5ETEUgPSAncmMtaGFuZGxlJztcbmV4cG9ydCBjb25zdCBDTEFTU19IQU5ETEVfQ09OVEFJTkVSID0gJ3JjLWhhbmRsZS1jb250YWluZXInO1xuXG5leHBvcnQgY29uc3QgRVZFTlRfUkVTSVpFX1NUQVJUID0gJ2NvbHVtbjpyZXNpemU6c3RhcnQnO1xuZXhwb3J0IGNvbnN0IEVWRU5UX1JFU0laRSA9ICdjb2x1bW46cmVzaXplJztcbmV4cG9ydCBjb25zdCBFVkVOVF9SRVNJWkVfU1RPUCA9ICdjb2x1bW46cmVzaXplOnN0b3AnO1xuXG5leHBvcnQgY29uc3QgU0VMRUNUT1JfVEggPSAndHI6Zmlyc3QgPiB0aDp2aXNpYmxlJztcbmV4cG9ydCBjb25zdCBTRUxFQ1RPUl9URCA9ICd0cjpmaXJzdCA+IHRkOnZpc2libGUnO1xuZXhwb3J0IGNvbnN0IFNFTEVDVE9SX1VOUkVTSVpBQkxFID0gYFtkYXRhLW5vcmVzaXplXWA7XG4iLCJpbXBvcnQgUmVzaXphYmxlQ29sdW1ucyBmcm9tICcuL2NsYXNzJztcbmltcG9ydCBhZGFwdGVyIGZyb20gJy4vYWRhcHRlcic7XG5cbmV4cG9ydCBkZWZhdWx0IFJlc2l6YWJsZUNvbHVtbnM7Il19","import ResizableColumns from './class';\nimport {DATA_API} from './constants';\n\n$.fn.resizableColumns = function(optionsOrMethod, ...args) {\n\treturn this.each(function() {\n\t\tlet $table = $(this);\n\n\t\tlet api = $table.data(DATA_API);\n\t\tif (!api) {\n\t\t\tapi = new ResizableColumns($table, optionsOrMethod);\n\t\t\t$table.data(DATA_API, api);\n\t\t}\n\n\t\telse if (typeof optionsOrMethod === 'string') {\n\t\t\treturn api[optionsOrMethod](...args);\n\t\t}\n\t});\n};\n\n$.resizableColumns = ResizableColumns;\n","import {\n\tDATA_API,\n\tDATA_COLUMNS_ID,\n\tDATA_COLUMN_ID,\n\tDATA_TH,\n\tCLASS_TABLE_RESIZING,\n\tCLASS_COLUMN_RESIZING,\n\tCLASS_HANDLE,\n\tCLASS_HANDLE_CONTAINER,\n\tEVENT_RESIZE_START,\n\tEVENT_RESIZE,\n\tEVENT_RESIZE_STOP,\n\tSELECTOR_TH,\n\tSELECTOR_TD,\n\tSELECTOR_UNRESIZABLE\n}\nfrom './constants';\n\n/**\nTakes a
element and makes it's columns resizable across both\nmobile and desktop clients.\n\n@class ResizableColumns\n@param $table {jQuery} jQuery-wrapped
element to make resizable\n@param options {Object} Configuration object\n**/\nexport default class ResizableColumns {\n\tconstructor($table, options) {\n\t\tthis.ns = '.rc' + this.count++;\n\n\t\tthis.options = $.extend({}, ResizableColumns.defaults, options);\n\n\t\tthis.$window = $(window);\n\t\tthis.$ownerDocument = $($table[0].ownerDocument);\n\t\tthis.$table = $table;\n\n\t\tthis.refreshHeaders();\n\t\tthis.restoreColumnWidths();\n\t\tthis.syncHandleWidths();\n\n\t\tthis.bindEvents(this.$window, 'resize', this.syncHandleWidths.bind(this));\n\n\t\tif (this.options.start) {\n\t\t\tthis.bindEvents(this.$table, EVENT_RESIZE_START, this.options.start);\n\t\t}\n\t\tif (this.options.resize) {\n\t\t\tthis.bindEvents(this.$table, EVENT_RESIZE, this.options.resize);\n\t\t}\n\t\tif (this.options.stop) {\n\t\t\tthis.bindEvents(this.$table, EVENT_RESIZE_STOP, this.options.stop);\n\t\t}\n\t}\n\n\t/**\n\tRefreshes the headers associated with this instances
element and\n\tgenerates handles for them. Also assigns percentage widths.\n\n\t@method refreshHeaders\n\t**/\n\trefreshHeaders() {\n\t\t// Allow the selector to be both a regular selctor string as well as\n\t\t// a dynamic callback\n\t\tlet selector = this.options.selector;\n\t\tif(typeof selector === 'function') {\n\t\t\tselector = selector.call(this, this.$table);\n\t\t}\n\n\t\t// Select all table headers\n\t\tthis.$tableHeaders = this.$table.find(selector);\n\n\t\t// Assign percentage widths first, then create drag handles\n\t\tthis.assignPercentageWidths();\n\t\tthis.createHandles();\n\t}\n\n\t/**\n\tCreates dummy handle elements for all table header columns\n\n\t@method createHandles\n\t**/\n\tcreateHandles() {\n\t\tlet ref = this.$handleContainer;\n\t\tif (ref != null) {\n\t\t\tref.remove();\n\t\t}\n\n\t\tthis.$handleContainer = $(`
`)\n\t\tthis.$table.before(this.$handleContainer);\n\n\t\tthis.$tableHeaders.each((i, el) => {\n\t\t\tlet $current = this.$tableHeaders.eq(i);\n\t\t\tlet $next = this.$tableHeaders.eq(i + 1);\n\n\t\t\tif ($next.length === 0 || $current.is(SELECTOR_UNRESIZABLE) || $next.is(SELECTOR_UNRESIZABLE)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet $handle = $(`
`)\n\t\t\t\t.data(DATA_TH, $(el))\n\t\t\t\t.appendTo(this.$handleContainer);\n\t\t});\n\n\t\tthis.bindEvents(this.$handleContainer, ['mousedown', 'touchstart'], '.'+CLASS_HANDLE, this.onPointerDown.bind(this));\n\t}\n\n\t/**\n\tAssigns a percentage width to all columns based on their current pixel width(s)\n\n\t@method assignPercentageWidths\n\t**/\n\tassignPercentageWidths() {\n\t\tthis.$tableHeaders.each((_, el) => {\n\t\t\tlet $el = $(el);\n\t\t\tthis.setWidth($el[0], $el.outerWidth() / this.$table.width() * 100);\n\t\t});\n\t}\n\n\t/**\n\n\n\t@method syncHandleWidths\n\t**/\n\tsyncHandleWidths() {\n\t\tlet $container = this.$handleContainer\n\n\t\t$container.width(this.$table.width());\n\n\t\t$container.find('.'+CLASS_HANDLE).each((_, el) => {\n\t\t\tlet $el = $(el);\n\n\t\t\tlet height = this.options.resizeFromBody ?\n\t\t\t\tthis.$table.height() :\n\t\t\t\tthis.$table.find('thead').height();\n\n\t\t\tlet left = $el.data(DATA_TH).outerWidth() + (\n\t\t\t\t$el.data(DATA_TH).offset().left - this.$handleContainer.offset().left\n\t\t\t);\n\n\t\t\t$el.css({ left, height });\n\t\t});\n\t}\n\n\t/**\n\tPersists the column widths in localStorage\n\n\t@method saveColumnWidths\n\t**/\n\tsaveColumnWidths() {\n\t\tthis.$tableHeaders.each((_, el) => {\n\t\t\tlet $el = $(el);\n\n\t\t\tif (this.options.store && !$el.is(SELECTOR_UNRESIZABLE)) {\n\t\t\t\tthis.options.store.set(\n\t\t\t\t\tthis.generateColumnId($el),\n\t\t\t\t\tthis.parseWidth(el)\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\tRetrieves and sets the column widths from localStorage\n\n\t@method restoreColumnWidths\n\t**/\n\trestoreColumnWidths() {\n\t\tthis.$tableHeaders.each((_, el) => {\n\t\t\tlet $el = $(el);\n\n\t\t\tif(this.options.store && !$el.is(SELECTOR_UNRESIZABLE)) {\n\t\t\t\tlet width = this.options.store.get(\n\t\t\t\t\tthis.generateColumnId($el)\n\t\t\t\t);\n\n\t\t\t\tif(width != null) {\n\t\t\t\t\tthis.setWidth(el, width);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\tPointer/mouse down handler\n\n\t@method onPointerDown\n\t@param event {Object} Event object associated with the interaction\n\t**/\n\tonPointerDown(event) {\n\t\t// Only applies to left-click dragging\n\t\tif(event.which !== 1) { return; }\n\n\t\t// If a previous operation is defined, we missed the last mouseup.\n\t\t// Probably gobbled up by user mousing out the window then releasing.\n\t\t// We'll simulate a pointerup here prior to it\n\t\tif(this.operation) {\n\t\t\tthis.onPointerUp(event);\n\t\t}\n\n\t\t// Ignore non-resizable columns\n\t\tlet $currentGrip = $(event.currentTarget);\n\t\tif($currentGrip.is(SELECTOR_UNRESIZABLE)) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet gripIndex = $currentGrip.index();\n\t\tlet $leftColumn = this.$tableHeaders.eq(gripIndex).not(SELECTOR_UNRESIZABLE);\n\t\tlet $rightColumn = this.$tableHeaders.eq(gripIndex + 1).not(SELECTOR_UNRESIZABLE);\n\n\t\tlet leftWidth = this.parseWidth($leftColumn[0]);\n\t\tlet rightWidth = this.parseWidth($rightColumn[0]);\n\n\t\tthis.operation = {\n\t\t\t$leftColumn, $rightColumn, $currentGrip,\n\n\t\t\tstartX: this.getPointerX(event),\n\n\t\t\twidths: {\n\t\t\t\tleft: leftWidth,\n\t\t\t\tright: rightWidth\n\t\t\t},\n\t\t\tnewWidths: {\n\t\t\t\tleft: leftWidth,\n\t\t\t\tright: rightWidth\n\t\t\t}\n\t\t};\n\n\t\tthis.bindEvents(this.$ownerDocument, ['mousemove', 'touchmove'], this.onPointerMove.bind(this));\n\t\tthis.bindEvents(this.$ownerDocument, ['mouseup', 'touchend'], this.onPointerUp.bind(this));\n\n\t\tthis.$handleContainer\n\t\t\t.add(this.$table)\n\t\t\t.addClass(CLASS_TABLE_RESIZING);\n\n\t\t$leftColumn\n\t\t\t.add($rightColumn)\n\t\t\t.add($currentGrip)\n\t\t\t.addClass(CLASS_COLUMN_RESIZING);\n\n\t\tthis.triggerEvent(EVENT_RESIZE_START, [\n\t\t\t$leftColumn, $rightColumn,\n\t\t\tleftWidth, rightWidth\n\t\t],\n\t\tevent);\n\n\t\tevent.preventDefault();\n\t}\n\n\t/**\n\tPointer/mouse movement handler\n\n\t@method onPointerMove\n\t@param event {Object} Event object associated with the interaction\n\t**/\n\tonPointerMove(event) {\n\t\tlet op = this.operation;\n\t\tif(!this.operation) { return; }\n\n\t\t// Determine the delta change between start and new mouse position, as a percentage of the table width\n\t\tlet difference = (this.getPointerX(event) - op.startX) / this.$table.width() * 100;\n\t\tif(difference === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet leftColumn = op.$leftColumn[0];\n\t\tlet rightColumn = op.$rightColumn[0];\n\t\tlet widthLeft, widthRight;\n\n\t\tif(difference > 0) {\n\t\t\twidthLeft = this.constrainWidth(op.widths.left + (op.widths.right - op.newWidths.right));\n\t\t\twidthRight = this.constrainWidth(op.widths.right - difference);\n\t\t}\n\t\telse if(difference < 0) {\n\t\t\twidthLeft = this.constrainWidth(op.widths.left + difference);\n\t\t\twidthRight = this.constrainWidth(op.widths.right + (op.widths.left - op.newWidths.left));\n\t\t}\n\n\t\tif(leftColumn) {\n\t\t\tthis.setWidth(leftColumn, widthLeft);\n\t\t}\n\t\tif(rightColumn) {\n\t\t\tthis.setWidth(rightColumn, widthRight);\n\t\t}\n\n\t\top.newWidths.left = widthLeft;\n\t\top.newWidths.right = widthRight;\n\n\t\treturn this.triggerEvent(EVENT_RESIZE, [\n\t\t\top.$leftColumn, op.$rightColumn,\n\t\t\twidthLeft, widthRight\n\t\t],\n\t\tevent);\n\t}\n\n\t/**\n\tPointer/mouse release handler\n\n\t@method onPointerUp\n\t@param event {Object} Event object associated with the interaction\n\t**/\n\tonPointerUp(event) {\n\t\tlet op = this.operation;\n\t\tif(!this.operation) { return; }\n\n\t\tthis.unbindEvents(this.$ownerDocument, ['mouseup', 'touchend', 'mousemove', 'touchmove']);\n\n\t\tthis.$handleContainer\n\t\t\t.add(this.$table)\n\t\t\t.removeClass(CLASS_TABLE_RESIZING);\n\n\t\top.$leftColumn\n\t\t\t.add(op.$rightColumn)\n\t\t\t.add(op.$currentGrip)\n\t\t\t.removeClass(CLASS_COLUMN_RESIZING);\n\n\t\tthis.syncHandleWidths();\n\t\tthis.saveColumnWidths();\n\n\t\tthis.operation = null;\n\n\t\treturn this.triggerEvent(EVENT_RESIZE_STOP, [\n\t\t\top.$leftColumn, op.$rightColumn,\n\t\t\top.newWidths.left, op.newWidths.right\n\t\t],\n\t\tevent);\n\t}\n\n\t/**\n\tRemoves all event listeners, data, and added DOM elements. Takes\n\tthe
element back to how it was, and returns it\n\n\t@method destroy\n\t@return {jQuery} Original jQuery-wrapped
element\n\t**/\n\tdestroy() {\n\t\tlet $table = this.$table;\n\t\tlet $handles = this.$handleContainer.find('.'+CLASS_HANDLE);\n\n\t\tthis.unbindEvents(\n\t\t\tthis.$window\n\t\t\t\t.add(this.$ownerDocument)\n\t\t\t\t.add(this.$table)\n\t\t\t\t.add($handles)\n\t\t);\n\n\t\t$handles.removeData(DATA_TH);\n\t\t$table.removeData(DATA_API);\n\n\t\tthis.$handleContainer.remove();\n\t\tthis.$handleContainer = null;\n\t\tthis.$tableHeaders = null;\n\t\tthis.$table = null;\n\n\t\treturn $table;\n\t}\n\n\t/**\n\tBinds given events for this instance to the given target DOMElement\n\n\t@private\n\t@method bindEvents\n\t@param target {jQuery} jQuery-wrapped DOMElement to bind events to\n\t@param events {String|Array} Event name (or array of) to bind\n\t@param selectorOrCallback {String|Function} Selector string or callback\n\t@param [callback] {Function} Callback method\n\t**/\n\tbindEvents($target, events, selectorOrCallback, callback) {\n\t\tif(typeof events === 'string') {\n\t\t\tevents = events + this.ns;\n\t\t}\n\t\telse {\n\t\t\tevents = events.join(this.ns + ' ') + this.ns;\n\t\t}\n\n\t\tif(arguments.length > 3) {\n\t\t\t$target.on(events, selectorOrCallback, callback);\n\t\t}\n\t\telse {\n\t\t\t$target.on(events, selectorOrCallback);\n\t\t}\n\t}\n\n\t/**\n\tUnbinds events specific to this instance from the given target DOMElement\n\n\t@private\n\t@method unbindEvents\n\t@param target {jQuery} jQuery-wrapped DOMElement to unbind events from\n\t@param events {String|Array} Event name (or array of) to unbind\n\t**/\n\tunbindEvents($target, events) {\n\t\tif(typeof events === 'string') {\n\t\t\tevents = events + this.ns;\n\t\t}\n\t\telse if(events != null) {\n\t\t\tevents = events.join(this.ns + ' ') + this.ns;\n\t\t}\n\t\telse {\n\t\t\tevents = this.ns;\n\t\t}\n\n\t\t$target.off(events);\n\t}\n\n\t/**\n\tTriggers an event on the
element for a given type with given\n\targuments, also setting and allowing access to the originalEvent if\n\tgiven. Returns the result of the triggered event.\n\n\t@private\n\t@method triggerEvent\n\t@param type {String} Event name\n\t@param args {Array} Array of arguments to pass through\n\t@param [originalEvent] If given, is set on the event object\n\t@return {Mixed} Result of the event trigger action\n\t**/\n\ttriggerEvent(type, args, originalEvent) {\n\t\tlet event = $.Event(type);\n\t\tif(event.originalEvent) {\n\t\t\tevent.originalEvent = $.extend({}, originalEvent);\n\t\t}\n\n\t\treturn this.$table.trigger(event, [this].concat(args || []));\n\t}\n\n\t/**\n\tCalculates a unique column ID for a given column DOMElement\n\n\t@private\n\t@method generateColumnId\n\t@param $el {jQuery} jQuery-wrapped column element\n\t@return {String} Column ID\n\t**/\n\tgenerateColumnId($el) {\n\t\treturn this.$table.data(DATA_COLUMNS_ID) + '-' + $el.data(DATA_COLUMN_ID);\n\t}\n\n\t/**\n\tParses a given DOMElement's width into a float\n\n\t@private\n\t@method parseWidth\n\t@param element {DOMElement} Element to get width of\n\t@return {Number} Element's width as a float\n\t**/\n\tparseWidth(element) {\n\t\treturn element ? parseFloat(element.style.width.replace('%', '')) : 0;\n\t}\n\n\t/**\n\tSets the percentage width of a given DOMElement\n\n\t@private\n\t@method setWidth\n\t@param element {DOMElement} Element to set width on\n\t@param width {Number} Width, as a percentage, to set\n\t**/\n\tsetWidth(element, width) {\n\t\twidth = width.toFixed(2);\n\t\twidth = width > 0 ? width : 0;\n\t\telement.style.width = width + '%';\n\t}\n\n\t/**\n\tConstrains a given width to the minimum and maximum ranges defined in\n\tthe `minWidth` and `maxWidth` configuration options, respectively.\n\n\t@private\n\t@method constrainWidth\n\t@param width {Number} Width to constrain\n\t@return {Number} Constrained width\n\t**/\n\tconstrainWidth(width) {\n\t\tif (this.options.minWidth != undefined) {\n\t\t\twidth = Math.max(this.options.minWidth, width);\n\t\t}\n\n\t\tif (this.options.maxWidth != undefined) {\n\t\t\twidth = Math.min(this.options.maxWidth, width);\n\t\t}\n\n\t\treturn width;\n\t}\n\n\t/**\n\tGiven a particular Event object, retrieves the current pointer offset along\n\tthe horizontal direction. Accounts for both regular mouse clicks as well as\n\tpointer-like systems (mobiles, tablets etc.)\n\n\t@private\n\t@method getPointerX\n\t@param event {Object} Event object associated with the interaction\n\t@return {Number} Horizontal pointer offset\n\t**/\n\tgetPointerX(event) {\n\t\tif (event.type.indexOf('touch') === 0) {\n\t\t\treturn (event.originalEvent.touches[0] || event.originalEvent.changedTouches[0]).pageX;\n\t\t}\n\t\treturn event.pageX;\n\t}\n}\n\nResizableColumns.defaults = {\n\tselector: function($table) {\n\t\tif($table.find('thead').length) {\n\t\t\treturn SELECTOR_TH;\n\t\t}\n\n\t\treturn SELECTOR_TD;\n\t},\n\tstore: window.store,\n\tsyncHandlers: true,\n\tresizeFromBody: true,\n\tmaxWidth: null,\n\tminWidth: 0.01\n};\n\nResizableColumns.count = 0;\n","export const DATA_API = 'resizableColumns';\nexport const DATA_COLUMNS_ID = 'resizable-columns-id';\nexport const DATA_COLUMN_ID = 'resizable-column-id';\nexport const DATA_TH = 'th';\n\nexport const CLASS_TABLE_RESIZING = 'rc-table-resizing';\nexport const CLASS_COLUMN_RESIZING = 'rc-column-resizing';\nexport const CLASS_HANDLE = 'rc-handle';\nexport const CLASS_HANDLE_CONTAINER = 'rc-handle-container';\n\nexport const EVENT_RESIZE_START = 'column:resize:start';\nexport const EVENT_RESIZE = 'column:resize';\nexport const EVENT_RESIZE_STOP = 'column:resize:stop';\n\nexport const SELECTOR_TH = 'tr:first > th:visible';\nexport const SELECTOR_TD = 'tr:first > td:visible';\nexport const SELECTOR_UNRESIZABLE = `[data-noresize]`;\n"],"sourceRoot":"/source/"} -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var package = require('./package.json'); 2 | var gulp = require("gulp"); 3 | var gutil = require("gulp-util"); 4 | var babel = require("gulp-babel"); 5 | var babelify = require("babelify"); 6 | var browserify = require("browserify"); 7 | var sourcemaps = require("gulp-sourcemaps"); 8 | var source = require('vinyl-source-stream'); 9 | var buffer = require('vinyl-buffer'); 10 | var header = require("gulp-header"); 11 | var uglify = require("gulp-uglify"); 12 | var rename = require("gulp-rename"); 13 | var less = require("gulp-less"); 14 | 15 | const BANNER = ['/**', 16 | ' * <%= pkg.name %> - <%= pkg.description %>', 17 | ' * @date <%= new Date() %>', 18 | ' * @version v<%= pkg.version %>', 19 | ' * @link <%= pkg.homepage %>', 20 | ' * @license <%= pkg.license %>', 21 | ' */', 22 | ''].join('\n'); 23 | 24 | const BROWSERIFY_OPTIONS = { 25 | debug: true 26 | }; 27 | const UGLIFY_OPTIONS = { 28 | preserveComments: 'some' 29 | }; 30 | const LESS_OPTIONS = {}; 31 | 32 | // JS Compilation 33 | gulp.task("build", function() { 34 | // Bundle using Browserify + Babel transform 35 | return browserify(BROWSERIFY_OPTIONS) 36 | .transform(babelify) 37 | .require('src/index.js', { entry: true}) 38 | .bundle() 39 | .on("error", function (err) { 40 | console.log("Error : " + err.message); 41 | }) 42 | 43 | // Compiled file + sourcemaps 44 | .pipe(source('jquery.resizableColumns.js')) 45 | .pipe(buffer()) 46 | .pipe(sourcemaps.init({ loadMaps: true })) 47 | .pipe(sourcemaps.write()) 48 | .pipe(header(BANNER, { pkg: package })) 49 | .pipe(gulp.dest('dist/')) 50 | 51 | // Minified file + sourcemaps 52 | .pipe(uglify(UGLIFY_OPTIONS)) 53 | .pipe(rename(function(path) { 54 | path.extname = '.min' + path.extname; 55 | })) 56 | .pipe(sourcemaps.write('./')) 57 | .pipe(gulp.dest('dist')) 58 | }); 59 | 60 | // LESS compilation 61 | gulp.task("less", function() { 62 | return gulp.src("less/index.less") 63 | .pipe(less(LESS_OPTIONS)) 64 | .pipe(rename(function(path) { 65 | path.basename = 'jquery.resizableColumns'; 66 | })) 67 | .pipe(gulp.dest("dist")); 68 | }); 69 | 70 | // Watch tasks 71 | gulp.task('build:watch', function() { 72 | gulp.watch('src/**/*.js', ['build']); 73 | }); 74 | gulp.task('less:watch', function() { 75 | gulp.watch('less/**/*.less', ['less']); 76 | }); 77 | 78 | 79 | // Aliases 80 | gulp.task('watch', ['build:watch', 'less:watch']); 81 | gulp.task('default', ['build', 'less']); -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | jQuery Resizable Columns 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Fork me on GitHub 12 | 13 | 14 |
15 | 21 | 22 |
Grab the column borders and drag 'em! Bonus: refresh the page.
23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 |
#First NameLast NameUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larry the Bird@twitter
53 | 54 |
 55 | <script src="/path/to/jquery.js"></script>
 56 | <script src="/path/to/store.js"></script>
 57 | <script src="/path/to/jquery.resizableColumns.js"></script>
 58 | 
 59 | <table class="table table-bordered" data-resizable-columns-id="demo-table">
 60 | <thead>
 61 |   <tr>
 62 |     <th data-resizable-column-id="#">#</th>
 63 |     <th data-resizable-column-id="first_name">First Name</th>
 64 |     <th data-resizable-column-id="last_name">Last Name</th>
 65 |     <th data-resizable-column-id="username" data-noresize>Username</th>
 66 |   </tr>
 67 | </thead>
 68 | <tbody>
 69 |   ...
 70 | </tbody>
 71 | </table>
 72 | 
 73 | <script>
 74 | $(function(){
 75 |   $("table").resizableColumns({
 76 |     store: window.store
 77 |   });
 78 | });
 79 | </script>
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 97 | 98 | 99 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /less/demo.less: -------------------------------------------------------------------------------- 1 | img.ribbon { 2 | position: fixed; 3 | z-index: 1; 4 | top: 0; 5 | right: 0; 6 | border: 0; 7 | cursor: pointer; 8 | } 9 | 10 | .container { 11 | margin-top: 60px; 12 | } 13 | 14 | #username-column { 15 | width: 50px; 16 | } -------------------------------------------------------------------------------- /less/index.less: -------------------------------------------------------------------------------- 1 | .rc-handle-container { 2 | position: relative; 3 | } 4 | 5 | .rc-handle { 6 | position: absolute; 7 | width: 7px; 8 | cursor: ew-resize; 9 | margin-left: -3px; 10 | z-index: 2; 11 | } 12 | 13 | table.rc-table-resizing { 14 | cursor: ew-resize; 15 | 16 | thead, thead > th, thead > th > a { 17 | cursor: ew-resize; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-resizable-columns", 3 | "title": "jQuery Resizable Columns", 4 | "description": "Resizable table columns for jQuery", 5 | "version": "0.2.3", 6 | "author": "Adam Becker (http://ada.mbecker.cc)", 7 | "homepage": "http://dobtco.github.io/jquery-resizable-columns/", 8 | "license": "MIT", 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/dobtco/jquery-resizable-columns.git" 12 | }, 13 | "bugs": { 14 | "url": "http://github.com/dobtco/jquery-resizable-columns/issues" 15 | }, 16 | "keywords": [ 17 | "jquery", 18 | "resizable-columns-table", 19 | "resizable-columns", 20 | "html", 21 | "table resize", 22 | "resizable columns", 23 | "resizable", 24 | "adam becker" 25 | ], 26 | "main": "dist/jquery.resizableColumns.js", 27 | "devDependencies": { 28 | "babel": "^5.3.3", 29 | "babelify": "^6.1.0", 30 | "browserify": "^10.2.0", 31 | "gulp": "^3.8.11", 32 | "gulp-babel": "^5.1.0", 33 | "gulp-header": "^1.2.2", 34 | "gulp-less": "^3.0.3", 35 | "gulp-rename": "^1.2.2", 36 | "gulp-sourcemaps": "^1.5.2", 37 | "gulp-uglify": "^1.2.0", 38 | "gulp-util": "^3.0.4", 39 | "vinyl-buffer": "^1.0.0", 40 | "vinyl-source-stream": "^1.1.0" 41 | }, 42 | "scripts": { 43 | "build": "npm install && gulp", 44 | "start": "gulp" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/adapter.js: -------------------------------------------------------------------------------- 1 | import ResizableColumns from './class'; 2 | import {DATA_API} from './constants'; 3 | 4 | $.fn.resizableColumns = function(optionsOrMethod, ...args) { 5 | return this.each(function() { 6 | let $table = $(this); 7 | 8 | let api = $table.data(DATA_API); 9 | if (!api) { 10 | api = new ResizableColumns($table, optionsOrMethod); 11 | $table.data(DATA_API, api); 12 | } 13 | 14 | else if (typeof optionsOrMethod === 'string') { 15 | return api[optionsOrMethod](...args); 16 | } 17 | }); 18 | }; 19 | 20 | $.resizableColumns = ResizableColumns; 21 | -------------------------------------------------------------------------------- /src/class.js: -------------------------------------------------------------------------------- 1 | import { 2 | DATA_API, 3 | DATA_COLUMNS_ID, 4 | DATA_COLUMN_ID, 5 | DATA_TH, 6 | CLASS_TABLE_RESIZING, 7 | CLASS_COLUMN_RESIZING, 8 | CLASS_HANDLE, 9 | CLASS_HANDLE_CONTAINER, 10 | EVENT_RESIZE_START, 11 | EVENT_RESIZE, 12 | EVENT_RESIZE_STOP, 13 | SELECTOR_TH, 14 | SELECTOR_TD, 15 | SELECTOR_UNRESIZABLE 16 | } 17 | from './constants'; 18 | 19 | /** 20 | Takes a element and makes it's columns resizable across both 21 | mobile and desktop clients. 22 | 23 | @class ResizableColumns 24 | @param $table {jQuery} jQuery-wrapped
element to make resizable 25 | @param options {Object} Configuration object 26 | **/ 27 | export default class ResizableColumns { 28 | constructor($table, options) { 29 | this.ns = '.rc' + this.count++; 30 | 31 | this.options = $.extend({}, ResizableColumns.defaults, options); 32 | 33 | this.$window = $(window); 34 | this.$ownerDocument = $($table[0].ownerDocument); 35 | this.$table = $table; 36 | 37 | this.refreshHeaders(); 38 | this.restoreColumnWidths(); 39 | this.syncHandleWidths(); 40 | 41 | this.bindEvents(this.$window, 'resize', this.syncHandleWidths.bind(this)); 42 | 43 | if (this.options.start) { 44 | this.bindEvents(this.$table, EVENT_RESIZE_START, this.options.start); 45 | } 46 | if (this.options.resize) { 47 | this.bindEvents(this.$table, EVENT_RESIZE, this.options.resize); 48 | } 49 | if (this.options.stop) { 50 | this.bindEvents(this.$table, EVENT_RESIZE_STOP, this.options.stop); 51 | } 52 | } 53 | 54 | /** 55 | Refreshes the headers associated with this instances
element and 56 | generates handles for them. Also assigns percentage widths. 57 | 58 | @method refreshHeaders 59 | **/ 60 | refreshHeaders() { 61 | // Allow the selector to be both a regular selctor string as well as 62 | // a dynamic callback 63 | let selector = this.options.selector; 64 | if(typeof selector === 'function') { 65 | selector = selector.call(this, this.$table); 66 | } 67 | 68 | // Select all table headers 69 | this.$tableHeaders = this.$table.find(selector); 70 | 71 | // Assign percentage widths first, then create drag handles 72 | this.assignPercentageWidths(); 73 | this.createHandles(); 74 | } 75 | 76 | /** 77 | Creates dummy handle elements for all table header columns 78 | 79 | @method createHandles 80 | **/ 81 | createHandles() { 82 | let ref = this.$handleContainer; 83 | if (ref != null) { 84 | ref.remove(); 85 | } 86 | 87 | this.$handleContainer = $(`
`) 88 | this.$table.before(this.$handleContainer); 89 | 90 | this.$tableHeaders.each((i, el) => { 91 | let $current = this.$tableHeaders.eq(i); 92 | let $next = this.$tableHeaders.eq(i + 1); 93 | 94 | if ($next.length === 0 || $current.is(SELECTOR_UNRESIZABLE) || $next.is(SELECTOR_UNRESIZABLE)) { 95 | return; 96 | } 97 | 98 | let $handle = $(`
`) 99 | .data(DATA_TH, $(el)) 100 | .appendTo(this.$handleContainer); 101 | }); 102 | 103 | this.bindEvents(this.$handleContainer, ['mousedown', 'touchstart'], '.'+CLASS_HANDLE, this.onPointerDown.bind(this)); 104 | } 105 | 106 | /** 107 | Assigns a percentage width to all columns based on their current pixel width(s) 108 | 109 | @method assignPercentageWidths 110 | **/ 111 | assignPercentageWidths() { 112 | this.$tableHeaders.each((_, el) => { 113 | let $el = $(el); 114 | this.setWidth($el[0], $el.outerWidth() / this.$table.width() * 100); 115 | }); 116 | } 117 | 118 | /** 119 | 120 | 121 | @method syncHandleWidths 122 | **/ 123 | syncHandleWidths() { 124 | let $container = this.$handleContainer 125 | 126 | $container.width(this.$table.width()); 127 | 128 | $container.find('.'+CLASS_HANDLE).each((_, el) => { 129 | let $el = $(el); 130 | 131 | let height = this.options.resizeFromBody ? 132 | this.$table.height() : 133 | this.$table.find('thead').height(); 134 | 135 | let left = $el.data(DATA_TH).outerWidth() + ( 136 | $el.data(DATA_TH).offset().left - this.$handleContainer.offset().left 137 | ); 138 | 139 | $el.css({ left, height }); 140 | }); 141 | } 142 | 143 | /** 144 | Persists the column widths in localStorage 145 | 146 | @method saveColumnWidths 147 | **/ 148 | saveColumnWidths() { 149 | this.$tableHeaders.each((_, el) => { 150 | let $el = $(el); 151 | 152 | if (this.options.store && !$el.is(SELECTOR_UNRESIZABLE)) { 153 | this.options.store.set( 154 | this.generateColumnId($el), 155 | this.parseWidth(el) 156 | ); 157 | } 158 | }); 159 | } 160 | 161 | /** 162 | Retrieves and sets the column widths from localStorage 163 | 164 | @method restoreColumnWidths 165 | **/ 166 | restoreColumnWidths() { 167 | this.$tableHeaders.each((_, el) => { 168 | let $el = $(el); 169 | 170 | if(this.options.store && !$el.is(SELECTOR_UNRESIZABLE)) { 171 | let width = this.options.store.get( 172 | this.generateColumnId($el) 173 | ); 174 | 175 | if(width != null) { 176 | this.setWidth(el, width); 177 | } 178 | } 179 | }); 180 | } 181 | 182 | /** 183 | Pointer/mouse down handler 184 | 185 | @method onPointerDown 186 | @param event {Object} Event object associated with the interaction 187 | **/ 188 | onPointerDown(event) { 189 | // Only applies to left-click dragging 190 | if(event.which !== 1) { return; } 191 | 192 | // If a previous operation is defined, we missed the last mouseup. 193 | // Probably gobbled up by user mousing out the window then releasing. 194 | // We'll simulate a pointerup here prior to it 195 | if(this.operation) { 196 | this.onPointerUp(event); 197 | } 198 | 199 | // Ignore non-resizable columns 200 | let $currentGrip = $(event.currentTarget); 201 | if($currentGrip.is(SELECTOR_UNRESIZABLE)) { 202 | return; 203 | } 204 | 205 | let gripIndex = $currentGrip.index(); 206 | let $leftColumn = this.$tableHeaders.eq(gripIndex).not(SELECTOR_UNRESIZABLE); 207 | let $rightColumn = this.$tableHeaders.eq(gripIndex + 1).not(SELECTOR_UNRESIZABLE); 208 | 209 | let leftWidth = this.parseWidth($leftColumn[0]); 210 | let rightWidth = this.parseWidth($rightColumn[0]); 211 | 212 | this.operation = { 213 | $leftColumn, $rightColumn, $currentGrip, 214 | 215 | startX: this.getPointerX(event), 216 | 217 | widths: { 218 | left: leftWidth, 219 | right: rightWidth 220 | }, 221 | newWidths: { 222 | left: leftWidth, 223 | right: rightWidth 224 | } 225 | }; 226 | 227 | this.bindEvents(this.$ownerDocument, ['mousemove', 'touchmove'], this.onPointerMove.bind(this)); 228 | this.bindEvents(this.$ownerDocument, ['mouseup', 'touchend'], this.onPointerUp.bind(this)); 229 | 230 | this.$handleContainer 231 | .add(this.$table) 232 | .addClass(CLASS_TABLE_RESIZING); 233 | 234 | $leftColumn 235 | .add($rightColumn) 236 | .add($currentGrip) 237 | .addClass(CLASS_COLUMN_RESIZING); 238 | 239 | this.triggerEvent(EVENT_RESIZE_START, [ 240 | $leftColumn, $rightColumn, 241 | leftWidth, rightWidth 242 | ], 243 | event); 244 | 245 | event.preventDefault(); 246 | } 247 | 248 | /** 249 | Pointer/mouse movement handler 250 | 251 | @method onPointerMove 252 | @param event {Object} Event object associated with the interaction 253 | **/ 254 | onPointerMove(event) { 255 | let op = this.operation; 256 | if(!this.operation) { return; } 257 | 258 | // Determine the delta change between start and new mouse position, as a percentage of the table width 259 | let difference = (this.getPointerX(event) - op.startX) / this.$table.width() * 100; 260 | if(difference === 0) { 261 | return; 262 | } 263 | 264 | let leftColumn = op.$leftColumn[0]; 265 | let rightColumn = op.$rightColumn[0]; 266 | let widthLeft, widthRight; 267 | 268 | if(difference > 0) { 269 | widthLeft = this.constrainWidth(op.widths.left + (op.widths.right - op.newWidths.right)); 270 | widthRight = this.constrainWidth(op.widths.right - difference); 271 | } 272 | else if(difference < 0) { 273 | widthLeft = this.constrainWidth(op.widths.left + difference); 274 | widthRight = this.constrainWidth(op.widths.right + (op.widths.left - op.newWidths.left)); 275 | } 276 | 277 | if(leftColumn) { 278 | this.setWidth(leftColumn, widthLeft); 279 | } 280 | if(rightColumn) { 281 | this.setWidth(rightColumn, widthRight); 282 | } 283 | 284 | op.newWidths.left = widthLeft; 285 | op.newWidths.right = widthRight; 286 | 287 | return this.triggerEvent(EVENT_RESIZE, [ 288 | op.$leftColumn, op.$rightColumn, 289 | widthLeft, widthRight 290 | ], 291 | event); 292 | } 293 | 294 | /** 295 | Pointer/mouse release handler 296 | 297 | @method onPointerUp 298 | @param event {Object} Event object associated with the interaction 299 | **/ 300 | onPointerUp(event) { 301 | let op = this.operation; 302 | if(!this.operation) { return; } 303 | 304 | this.unbindEvents(this.$ownerDocument, ['mouseup', 'touchend', 'mousemove', 'touchmove']); 305 | 306 | this.$handleContainer 307 | .add(this.$table) 308 | .removeClass(CLASS_TABLE_RESIZING); 309 | 310 | op.$leftColumn 311 | .add(op.$rightColumn) 312 | .add(op.$currentGrip) 313 | .removeClass(CLASS_COLUMN_RESIZING); 314 | 315 | this.syncHandleWidths(); 316 | this.saveColumnWidths(); 317 | 318 | this.operation = null; 319 | 320 | return this.triggerEvent(EVENT_RESIZE_STOP, [ 321 | op.$leftColumn, op.$rightColumn, 322 | op.newWidths.left, op.newWidths.right 323 | ], 324 | event); 325 | } 326 | 327 | /** 328 | Removes all event listeners, data, and added DOM elements. Takes 329 | the
element back to how it was, and returns it 330 | 331 | @method destroy 332 | @return {jQuery} Original jQuery-wrapped
element 333 | **/ 334 | destroy() { 335 | let $table = this.$table; 336 | let $handles = this.$handleContainer.find('.'+CLASS_HANDLE); 337 | 338 | this.unbindEvents( 339 | this.$window 340 | .add(this.$ownerDocument) 341 | .add(this.$table) 342 | .add($handles) 343 | ); 344 | 345 | $handles.removeData(DATA_TH); 346 | $table.removeData(DATA_API); 347 | 348 | this.$handleContainer.remove(); 349 | this.$handleContainer = null; 350 | this.$tableHeaders = null; 351 | this.$table = null; 352 | 353 | return $table; 354 | } 355 | 356 | /** 357 | Binds given events for this instance to the given target DOMElement 358 | 359 | @private 360 | @method bindEvents 361 | @param target {jQuery} jQuery-wrapped DOMElement to bind events to 362 | @param events {String|Array} Event name (or array of) to bind 363 | @param selectorOrCallback {String|Function} Selector string or callback 364 | @param [callback] {Function} Callback method 365 | **/ 366 | bindEvents($target, events, selectorOrCallback, callback) { 367 | if(typeof events === 'string') { 368 | events = events + this.ns; 369 | } 370 | else { 371 | events = events.join(this.ns + ' ') + this.ns; 372 | } 373 | 374 | if(arguments.length > 3) { 375 | $target.on(events, selectorOrCallback, callback); 376 | } 377 | else { 378 | $target.on(events, selectorOrCallback); 379 | } 380 | } 381 | 382 | /** 383 | Unbinds events specific to this instance from the given target DOMElement 384 | 385 | @private 386 | @method unbindEvents 387 | @param target {jQuery} jQuery-wrapped DOMElement to unbind events from 388 | @param events {String|Array} Event name (or array of) to unbind 389 | **/ 390 | unbindEvents($target, events) { 391 | if(typeof events === 'string') { 392 | events = events + this.ns; 393 | } 394 | else if(events != null) { 395 | events = events.join(this.ns + ' ') + this.ns; 396 | } 397 | else { 398 | events = this.ns; 399 | } 400 | 401 | $target.off(events); 402 | } 403 | 404 | /** 405 | Triggers an event on the
element for a given type with given 406 | arguments, also setting and allowing access to the originalEvent if 407 | given. Returns the result of the triggered event. 408 | 409 | @private 410 | @method triggerEvent 411 | @param type {String} Event name 412 | @param args {Array} Array of arguments to pass through 413 | @param [originalEvent] If given, is set on the event object 414 | @return {Mixed} Result of the event trigger action 415 | **/ 416 | triggerEvent(type, args, originalEvent) { 417 | let event = $.Event(type); 418 | if(event.originalEvent) { 419 | event.originalEvent = $.extend({}, originalEvent); 420 | } 421 | 422 | return this.$table.trigger(event, [this].concat(args || [])); 423 | } 424 | 425 | /** 426 | Calculates a unique column ID for a given column DOMElement 427 | 428 | @private 429 | @method generateColumnId 430 | @param $el {jQuery} jQuery-wrapped column element 431 | @return {String} Column ID 432 | **/ 433 | generateColumnId($el) { 434 | return this.$table.data(DATA_COLUMNS_ID) + '-' + $el.data(DATA_COLUMN_ID); 435 | } 436 | 437 | /** 438 | Parses a given DOMElement's width into a float 439 | 440 | @private 441 | @method parseWidth 442 | @param element {DOMElement} Element to get width of 443 | @return {Number} Element's width as a float 444 | **/ 445 | parseWidth(element) { 446 | return element ? parseFloat(element.style.width.replace('%', '')) : 0; 447 | } 448 | 449 | /** 450 | Sets the percentage width of a given DOMElement 451 | 452 | @private 453 | @method setWidth 454 | @param element {DOMElement} Element to set width on 455 | @param width {Number} Width, as a percentage, to set 456 | **/ 457 | setWidth(element, width) { 458 | width = width.toFixed(2); 459 | width = width > 0 ? width : 0; 460 | element.style.width = width + '%'; 461 | } 462 | 463 | /** 464 | Constrains a given width to the minimum and maximum ranges defined in 465 | the `minWidth` and `maxWidth` configuration options, respectively. 466 | 467 | @private 468 | @method constrainWidth 469 | @param width {Number} Width to constrain 470 | @return {Number} Constrained width 471 | **/ 472 | constrainWidth(width) { 473 | if (this.options.minWidth != undefined) { 474 | width = Math.max(this.options.minWidth, width); 475 | } 476 | 477 | if (this.options.maxWidth != undefined) { 478 | width = Math.min(this.options.maxWidth, width); 479 | } 480 | 481 | return width; 482 | } 483 | 484 | /** 485 | Given a particular Event object, retrieves the current pointer offset along 486 | the horizontal direction. Accounts for both regular mouse clicks as well as 487 | pointer-like systems (mobiles, tablets etc.) 488 | 489 | @private 490 | @method getPointerX 491 | @param event {Object} Event object associated with the interaction 492 | @return {Number} Horizontal pointer offset 493 | **/ 494 | getPointerX(event) { 495 | if (event.type.indexOf('touch') === 0) { 496 | return (event.originalEvent.touches[0] || event.originalEvent.changedTouches[0]).pageX; 497 | } 498 | return event.pageX; 499 | } 500 | } 501 | 502 | ResizableColumns.defaults = { 503 | selector: function($table) { 504 | if($table.find('thead').length) { 505 | return SELECTOR_TH; 506 | } 507 | 508 | return SELECTOR_TD; 509 | }, 510 | store: window.store, 511 | syncHandlers: true, 512 | resizeFromBody: true, 513 | maxWidth: null, 514 | minWidth: 0.01 515 | }; 516 | 517 | ResizableColumns.count = 0; 518 | -------------------------------------------------------------------------------- /src/constants.js: -------------------------------------------------------------------------------- 1 | export const DATA_API = 'resizableColumns'; 2 | export const DATA_COLUMNS_ID = 'resizable-columns-id'; 3 | export const DATA_COLUMN_ID = 'resizable-column-id'; 4 | export const DATA_TH = 'th'; 5 | 6 | export const CLASS_TABLE_RESIZING = 'rc-table-resizing'; 7 | export const CLASS_COLUMN_RESIZING = 'rc-column-resizing'; 8 | export const CLASS_HANDLE = 'rc-handle'; 9 | export const CLASS_HANDLE_CONTAINER = 'rc-handle-container'; 10 | 11 | export const EVENT_RESIZE_START = 'column:resize:start'; 12 | export const EVENT_RESIZE = 'column:resize'; 13 | export const EVENT_RESIZE_STOP = 'column:resize:stop'; 14 | 15 | export const SELECTOR_TH = 'tr:first > th:visible'; 16 | export const SELECTOR_TD = 'tr:first > td:visible'; 17 | export const SELECTOR_UNRESIZABLE = `[data-noresize]`; 18 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import ResizableColumns from './class'; 2 | import adapter from './adapter'; 3 | 4 | export default ResizableColumns; --------------------------------------------------------------------------------