jsxgrid 2.4.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -318,10 +318,11 @@ anything `sort()` does: a field name, a zero-based field index, or a field refer
318
318
  `"asc"` or `"desc"`, defaulting to `"asc"` when `sortField` is set. Requires `sorting: true`.
319
319
 
320
320
  With `pageLoading: true`, the initial `sortField`/`sortOrder` are sent to `controller.loadData` like any
321
- other sort (same as clicking a sortable header would). For static in-memory `data` (not loaded through a
322
- controller), the array is sorted immediately, before the first render. For a controller-backed grid without
323
- `pageLoading`, the data is left in whatever order the controller returns it - same as clicking a header
324
- does in that setup upstream.
321
+ other sort (same as clicking a sortable header would) - sorting is the server's job there, jsxgrid never
322
+ re-sorts the page client-side on top of it. For static in-memory `data` (not loaded through a controller),
323
+ the array is sorted immediately, before the first render. For a controller-backed grid *without*
324
+ `pageLoading`, there's nothing to sort yet at construction time (data arrives later) - it's sorted once,
325
+ client-side, as soon as the first `loadData()` call resolves.
325
326
 
326
327
  ```javascript
327
328
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
package/dist/jsxgrid.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
package/dist/jsxgrid.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
@@ -244,13 +244,29 @@
244
244
  // Static in-memory data (already present at construction time, not
245
245
  // fetched via a controller) needs an explicit sort here - normal
246
246
  // rendering never sorts on its own, only an actual sort() call does
247
- // (see DirectLoadingStrategy.sort()). Controller-backed data follows
248
- // the same rule sorting already does elsewhere: pageLoading sends
249
- // sortField/sortOrder to the server via loadData()'s filter, while
250
- // plain (non-paged) controller data is left as the controller
251
- // returns it, same as clicking a sortable header would leave it.
247
+ // (see DirectLoadingStrategy.sort()).
252
248
  if($.isArray(this.data) && this.data.length) {
253
249
  this._sortData();
250
+ return;
251
+ }
252
+
253
+ // Controller-backed, non-paged grid: data isn't loaded yet at this
254
+ // point (arrives later via finishLoad), so there's nothing to sort
255
+ // here. Without this flag the header would still show the sort
256
+ // arrow (see _createHeaderRow()) while the actual rows stay in
257
+ // whatever order the controller returned - and the first real
258
+ // click on that same header would then look like it skips
259
+ // straight past the "ascending" pass, since _setSortingParams()
260
+ // reverses the order when clicking the field _sortField already
261
+ // points at. Picked up once, in _handleOptionChange's "data" case,
262
+ // as soon as the first load actually lands.
263
+ // pageLoading grids are excluded - sorting for those already
264
+ // happens server-side, from the sortField/sortOrder this same
265
+ // init sends along in the very first loadData() filter (see
266
+ // _sortingParams()); sorting the current page again client-side on
267
+ // top of that would be redundant at best.
268
+ if(!this.pageLoading) {
269
+ this._pendingInitialSort = true;
254
270
  }
255
271
  },
256
272
 
@@ -422,6 +438,12 @@
422
438
  this.render();
423
439
  break;
424
440
  case "data":
441
+ if(this._pendingInitialSort) {
442
+ this._pendingInitialSort = false;
443
+ this._sortData();
444
+ }
445
+ this.refresh();
446
+ break;
425
447
  case "editing":
426
448
  case "heading":
427
449
  case "filtering":
@@ -1746,7 +1768,7 @@
1746
1768
  setDefaults: setDefaults,
1747
1769
  locales: locales,
1748
1770
  locale: locale,
1749
- version: '2.4.0'
1771
+ version: '2.4.1'
1750
1772
  };
1751
1773
 
1752
1774
  }(window, jQuery));
@@ -1,6 +1,6 @@
1
1
  /*
2
- * jsxgrid v2.4.0 (https://github.com/rok9ru/jsxgrid#readme)
2
+ * jsxgrid v2.4.1 (https://github.com/rok9ru/jsxgrid#readme)
3
3
  * (c) 2026 Mikhail Kremza
4
4
  * Licensed under MIT
5
5
  */
6
- ((a,c,u)=>{function r(t,e){return c.isFunction(t)?t.apply(e,c.makeArray(arguments).slice(2)):t}var n,s="JSGrid",o="JSGridItem",i="JSGridEditRow",d=[],l=0,h="asc",t={loadData:c.noop,insertItem:c.noop,updateItem:c.noop,deleteItem:c.noop};function g(t,e){t=c(t);0==d.length?(this._id=l,l++):this._id=d.pop(),t.data(s,this),this._container=t,this.data=[],this.fields=[],this._editingRow=null,this._sortField=null,this._sortOrder=h,this._firstDisplayingPage=1,this._init(e),this.render()}g.prototype={width:"auto",height:"auto",updateOnResize:!0,locale:null,rowClass:c.noop,rowRenderer:null,rowClick:function(t){this.editing&&this.editItem(c(t.event.target).closest("tr"))},rowDoubleClick:c.noop,noDataContent:"Not found",noDataRowClass:"jsgrid-nodata-row",heading:!0,headerRowRenderer:null,headerRowClass:"jsgrid-header-row",headerCellClass:"jsgrid-header-cell",filtering:!1,filterRowRenderer:null,filterRowClass:"jsgrid-filter-row",inserting:!1,insertRowLocation:"bottom",insertRowRenderer:null,insertRowClass:"jsgrid-insert-row",editing:!1,editRowRenderer:null,editRowClass:"jsgrid-edit-row",confirmDeleting:!0,deleteConfirm:"Are you sure?",selecting:!0,selectedRowClass:"jsgrid-selected-row",oddRowClass:"jsgrid-row",evenRowClass:"jsgrid-alt-row",cellClass:"jsgrid-cell",sorting:!1,sortableClass:"jsgrid-header-sortable",sortAscClass:"jsgrid-header-sort jsgrid-header-sort-asc",sortDescClass:"jsgrid-header-sort jsgrid-header-sort-desc",sortField:null,sortOrder:null,paging:!1,pagerContainer:null,pageIndex:1,pageSize:20,pageButtonCount:15,pagerFormat:"Pages: {first} {prev} {pages} {next} {last} &nbsp;&nbsp; {pageIndex} of {pageCount}",pagePrevText:"Prev",pageNextText:"Next",pageFirstText:"First",pageLastText:"Last",pageNavigatorNextText:"...",pageNavigatorPrevText:"...",pagerContainerClass:"jsgrid-pager-container",pagerClass:"jsgrid-pager",pagerNavButtonClass:"jsgrid-pager-nav-button",pagerNavButtonInactiveClass:"jsgrid-pager-nav-inactive-button",pageClass:"jsgrid-pager-page",currentPageClass:"jsgrid-pager-current-page",customLoading:!1,pageLoading:!1,autoload:!1,controller:t,loadIndication:!0,loadIndicationDelay:500,loadMessage:"Please, wait...",loadShading:!0,invalidMessage:"Invalid data entered!",invalidNotify:function(t){t=c.map(t.errors,function(t){return t.message||null});a.alert([this.invalidMessage].concat(t).join("\n"))},onInit:c.noop,onRefreshing:c.noop,onRefreshed:c.noop,onPageChanged:c.noop,onItemDeleting:c.noop,onItemDeleted:c.noop,onItemInserting:c.noop,onItemInserted:c.noop,onItemEditing:c.noop,onItemEditCancelling:c.noop,onItemUpdating:c.noop,onItemUpdated:c.noop,onItemInvalid:c.noop,onDataLoading:c.noop,onDataLoaded:c.noop,onDataExporting:c.noop,onOptionChanging:c.noop,onOptionChanged:c.noop,onError:c.noop,invalidClass:"jsgrid-invalid",containerClass:"jsgrid",tableClass:"jsgrid-table",gridHeaderClass:"jsgrid-grid-header",gridBodyClass:"jsgrid-grid-body",_init:function(t){this._initInstanceLocale(t&&t.locale),c.extend(this,t),this._initLoadStrategy(),this._initController(),this._initFields(),this._initSorting(),this._attachWindowLoadResize(),this._attachWindowResizeCallback(),this._callEventHandler(this.onInit)},_initSorting:function(){var t;this.sortField&&(t=this._normalizeField(this.sortField))&&(this._sortField=t,this._sortOrder=this.sortOrder||h,c.isArray(this.data))&&this.data.length&&this._sortData()},_initInstanceLocale:function(t){t&&(t=c.isPlainObject(t)?t:jsGrid.locales[t])&&(t.grid&&c.extend(this,t.grid),this._fieldsLocaleConfig=t.fields,this._validatorsLocaleConfig=t.validators)},loadStrategy:function(){return new(this.pageLoading?jsGrid.loadStrategies.PageLoadingStrategy:jsGrid.loadStrategies.DirectLoadingStrategy)(this)},_initLoadStrategy:function(){this._loadStrategy=r(this.loadStrategy,this)},_initController:function(){this._controller=c.extend({},t,r(this.controller,this))},renderTemplate:function(t,e,i){var n,a=[];for(n in i)a.push(i[n]);return a.unshift(t,e),(t=r.apply(null,a))===u||null===t?"":t},loadIndicator:function(t){return new jsGrid.LoadIndicator(t)},validation:function(t){return jsGrid.Validation&&new jsGrid.Validation(t)},_initFields:function(){var i=this,n=i._fieldsLocaleConfig;i.fields=c.map(i.fields,function(t){var e;return c.isPlainObject(t)&&(t.type&&!jsGrid.fields[t.type]&&a.console&&console.warn('[jsxgrid] unknown field type "'+t.type+'" - falling back to the base field (no filtering/inserting/editing UI). Check that its script is loaded, and after jsxgrid.js.'),t=new(t.type&&jsGrid.fields[t.type]||jsGrid.Field)(t=(e=n&&t.type&&n[t.type])?c.extend({},e,t):t)),t._grid=i,t})},_attachWindowLoadResize:function(){c(a).on("load.table-"+this._id,c.proxy(this._refreshSize,this))},_attachWindowResizeCallback:function(){this.updateOnResize&&c(a).on("resize.table-"+this._id,c.proxy(this._refreshSize,this))},_detachWindowLoadResize:function(){c(a).off("load.table-"+this._id)},_detachWindowResizeCallback:function(){c(a).off("resize.table-"+this._id)},option:function(t,e){if(1===arguments.length)return this[t];t={option:t,oldValue:this[t],newValue:e},this._callEventHandler(this.onOptionChanging,t),this._handleOptionChange(t.option,t.newValue),this._callEventHandler(this.onOptionChanged,{option:t.option,value:t.newValue})},fieldOption:function(t,e,i){if(t=this._normalizeField(t),2===arguments.length)return t[e];t[e]=i,this._renderGrid()},_handleOptionChange:function(t,e){switch(this[t]=e,t){case"width":case"height":this._refreshSize();break;case"rowClass":case"rowRenderer":case"rowClick":case"rowDoubleClick":case"noDataRowClass":case"noDataContent":case"selecting":case"selectedRowClass":case"oddRowClass":case"evenRowClass":this._refreshContent();break;case"pageButtonCount":case"pagerFormat":case"pagePrevText":case"pageNextText":case"pageFirstText":case"pageLastText":case"pageNavigatorNextText":case"pageNavigatorPrevText":case"pagerClass":case"pagerNavButtonClass":case"pageClass":case"currentPageClass":case"pagerRenderer":this._refreshPager();break;case"fields":this._initFields(),this.render();break;case"data":case"editing":case"heading":case"filtering":case"inserting":case"paging":this.refresh();break;case"loadStrategy":case"pageLoading":this._initLoadStrategy(),this.search();break;case"pageIndex":this.openPage(e);break;case"pageSize":this.refresh(),this.search();break;case"editRowRenderer":case"editRowClass":this.cancelEdit();break;case"updateOnResize":this._detachWindowResizeCallback(),this._attachWindowResizeCallback();break;case"invalidNotify":case"invalidMessage":break;default:this.render()}},destroy:function(){this._detachWindowResizeCallback(),this._detachWindowLoadResize(),d.push(this._id),this._clear(),this._container.removeData(s)},render:function(){return this._renderGrid(),this.autoload?this.loadData():c.Deferred().resolve().promise()},_renderGrid:function(){this._clear(),this._container.addClass(this.containerClass).css("position","relative").append(this._createHeader()).append(this._createBody()),this._pagerContainer=this._createPagerContainer(),this._loadIndicator=this._createLoadIndicator(),this._validation=this._createValidation(),this.refresh()},_createLoadIndicator:function(){return r(this.loadIndicator,this,{message:this.loadMessage,shading:this.loadShading,container:this._container})},_createValidation:function(){return r(this.validation,this,{validatorsLocale:this._validatorsLocaleConfig})},_clear:function(){this.cancelEdit(),clearTimeout(this._loadingTimer),this._pagerContainer&&this._pagerContainer.empty(),this._container.empty().css({position:"",width:"",height:""})},_createHeader:function(){var t=this._headerRow=this._createHeaderRow(),e=this._filterRow=this._createFilterRow(),i=this._insertRow=this._createInsertRow(),t=this._headerGrid=c("<table>").addClass(this.tableClass).append(t).append(e).append(i);return this._header=c("<div>").addClass(this.gridHeaderClass).addClass(this._scrollBarWidth()?"jsgrid-header-scrollbar":"").append(t)},_createBody:function(){var t=this._content=c("<tbody>"),t=this._bodyGrid=c("<table>").addClass(this.tableClass).append(t);return this._body=c("<div>").addClass(this.gridBodyClass).append(t).on("scroll",c.proxy(function(t){this._header.scrollLeft(t.target.scrollLeft)},this))},_createPagerContainer:function(){var t=this.pagerContainer||c("<div>").appendTo(this._container);return c(t).addClass(this.pagerContainerClass)},_eachField:function(i){var n=this;c.each(this.fields,function(t,e){e.visible&&i.call(n,e,t)})},_createHeaderRow:function(){var n;return c.isFunction(this.headerRowRenderer)?c(this.renderTemplate(this.headerRowRenderer,this)):(n=c("<tr>").addClass(this.headerRowClass),this._eachField(function(t,e){var i=this._prepareCell("<th>",t,"headercss",this.headerCellClass).append(this.renderTemplate(t.headerTemplate,t)).appendTo(n);this.sorting&&t.sorting&&(i.addClass(this.sortableClass).on("click",c.proxy(function(){this.sort(e)},this)),t===this._sortField)&&i.addClass(this._sortOrder===h?this.sortAscClass:this.sortDescClass)}),n)},_prepareCell:function(t,e,i,n){return c(t).css("width",e.width).addClass(n||this.cellClass).addClass(i&&e[i]||e.css).addClass(e.align?"jsgrid-align-"+e.align:"")},_createFilterRow:function(){var e;return c.isFunction(this.filterRowRenderer)?c(this.renderTemplate(this.filterRowRenderer,this)):(e=c("<tr>").addClass(this.filterRowClass),this._eachField(function(t){this._prepareCell("<td>",t,"filtercss").append(this.renderTemplate(t.filterTemplate,t)).appendTo(e)}),e)},_createInsertRow:function(){var e;return c.isFunction(this.insertRowRenderer)?c(this.renderTemplate(this.insertRowRenderer,this)):(e=c("<tr>").addClass(this.insertRowClass),this._eachField(function(t){this._prepareCell("<td>",t,"insertcss").append(this.renderTemplate(t.insertTemplate,t)).appendTo(e)}),e)},_callEventHandler:function(t,e){return t.call(this,c.extend(e,{grid:this})),e},reset:function(){return this._resetSorting(),this._resetPager(),this._loadStrategy.reset()},_resetPager:function(){this._setPage(1)},_resetSorting:function(){this._sortField=null,this._sortOrder=h,this._clearSortingCss()},refresh:function(){this._callEventHandler(this.onRefreshing),this.cancelEdit(),this._refreshHeading(),this._refreshFiltering(),this._refreshInserting(),this._refreshContent(),this._refreshPager(),this._refreshSize(),this._callEventHandler(this.onRefreshed)},_refreshHeading:function(){this._headerRow.toggle(this.heading)},_refreshFiltering:function(){this._filterRow.toggle(this.filtering)},_refreshInserting:function(){this._insertRow.toggle(this.inserting)},_refreshContent:function(){var t=this._content;if(t.empty(),!this.data.length)return t.append(this._createNoDataRow()),this;for(var e=this._loadStrategy.firstDisplayIndex(),i=this._loadStrategy.lastDisplayIndex(),n=e;n<i;n++){var a=this.data[n];t.append(this._createRow(a,n))}},_createNoDataRow:function(){var t=0;return this._eachField(function(){t++}),c("<tr>").addClass(this.noDataRowClass).append(c("<td>").addClass(this.cellClass).attr("colspan",t).append(this.renderTemplate(this.noDataContent,this)))},_createRow:function(e,i){var t;return c.isFunction(this.rowRenderer)?t=this.renderTemplate(this.rowRenderer,this,{item:e,itemIndex:i}):(t=c("<tr>"),this._renderCells(t,e)),t.addClass(this._getRowClasses(e,i)).data(o,e).on("click",c.proxy(function(t){this.rowClick({item:e,itemIndex:i,event:t})},this)).on("dblclick",c.proxy(function(t){this.rowDoubleClick({item:e,itemIndex:i,event:t})},this)),this.selecting&&this._attachRowHover(t),t},_getRowClasses:function(t,e){var i=[];return i.push((e+1)%2?this.oddRowClass:this.evenRowClass),i.push(r(this.rowClass,this,t,e)),i.join(" ")},_attachRowHover:function(t){var e=this.selectedRowClass;t.hover(function(){c(this).addClass(e)},function(){c(this).removeClass(e)})},_renderCells:function(e,i){return this._eachField(function(t){e.append(this._createCell(i,t))}),this},_createCell:function(t,e){var i=this._getItemFieldValue(t,e),t={value:i,item:t},i=c.isFunction(e.cellRenderer)?this.renderTemplate(e.cellRenderer,e,t):c("<td>").append(this.renderTemplate(e.itemTemplate||i,e,t));return this._prepareCell(i,e)},_getItemFieldValue:function(t,e){for(var i=e.name.split("."),n=t[i.shift()];n&&i.length;)n=n[i.shift()];return n},_setItemFieldValue:function(t,e,i){for(var n=e.name.split("."),a=t,r=n[0];a&&n.length;)a=(t=a)[r=n.shift()];if(!a)for(;n.length;)t=t[r]={},r=n.shift();t[r]=i},sort:function(t,e){return c.isPlainObject(t)&&(e=t.order,t=t.field),this._clearSortingCss(),this._setSortingParams(t,e),this._setSortingCss(),this._loadStrategy.sort()},_clearSortingCss:function(){this._headerRow.find("th").removeClass(this.sortAscClass).removeClass(this.sortDescClass)},_setSortingParams:function(t,e){t=this._normalizeField(t),e=e||(this._sortField===t?this._reversedSortOrder(this._sortOrder):h),this._sortField=t,this._sortOrder=e},_normalizeField:function(e){return c.isNumeric(e)?this.fields[e]:"string"==typeof e?c.grep(this.fields,function(t){return t.name===e})[0]:e},_reversedSortOrder:function(t){return t===h?"desc":h},_setSortingCss:function(){var t=this._visibleFieldIndex(this._sortField);this._headerRow.find("th").eq(t).addClass(this._sortOrder===h?this.sortAscClass:this.sortDescClass)},_visibleFieldIndex:function(t){return c.inArray(t,c.grep(this.fields,function(t){return t.visible}))},_sortData:function(){var i,n=this._sortFactor(),a=this._sortField;a&&(i=this).data.sort(function(t,e){t=i._getItemFieldValue(t,a),e=i._getItemFieldValue(e,a);return n*a.sortingFunc(t,e)})},_sortFactor:function(){return this._sortOrder===h?1:-1},_itemsCount:function(){return this._loadStrategy.itemsCount()},_pagesCount:function(){var t=this._itemsCount(),e=this.pageSize;return Math.floor(t/e)+(t%e?1:0)},_refreshPager:function(){var t=this._pagerContainer,e=(t.empty(),this.paging&&t.append(this._createPager()),this.paging&&1<this._pagesCount());t.toggle(e)},_createPager:function(){var t=c.isFunction(this.pagerRenderer)?c(this.pagerRenderer({pageIndex:this.pageIndex,pageCount:this._pagesCount()})):c("<div>").append(this._createPagerByFormat());return t.addClass(this.pagerClass),t},_createPagerByFormat:function(){var i=this.pageIndex,n=this._pagesCount(),a=this._itemsCount(),t=this.pagerFormat.split(" ");return c.map(t,c.proxy(function(t){var e=t;return"{pages}"===t?e=this._createPages():"{first}"===t?e=this._createPagerNavButton(this.pageFirstText,1,1<i):"{prev}"===t?e=this._createPagerNavButton(this.pagePrevText,i-1,1<i):"{next}"===t?e=this._createPagerNavButton(this.pageNextText,i+1,i<n):"{last}"===t?e=this._createPagerNavButton(this.pageLastText,n,i<n):"{pageIndex}"===t?e=i:"{pageCount}"===t?e=n:"{itemCount}"===t&&(e=a),c.isArray(e)?e.concat([" "]):[e," "]},this))},_createPages:function(){var t=this._pagesCount(),e=this.pageButtonCount,i=this._firstDisplayingPage,n=[];1<i&&n.push(this._createPagerPageNavButton(this.pageNavigatorPrevText,this.showPrevPages));for(var a=0,r=i;a<e&&r<=t;a++,r++)n.push(r===this.pageIndex?this._createPagerCurrentPage():this._createPagerPage(r));return i+e-1<t&&n.push(this._createPagerPageNavButton(this.pageNavigatorNextText,this.showNextPages)),n},_createPagerNavButton:function(t,e,i){return this._createPagerButton(t,this.pagerNavButtonClass+(i?"":" "+this.pagerNavButtonInactiveClass),i?function(){this.openPage(e)}:c.noop)},_createPagerPageNavButton:function(t,e){return this._createPagerButton(t,this.pagerNavButtonClass,e)},_createPagerPage:function(t){return this._createPagerButton(t,this.pageClass,function(){this.openPage(t)})},_createPagerButton:function(t,e,i){t=c("<a>").attr("href","javascript:void(0);").html(t).on("click",c.proxy(i,this));return c("<span>").addClass(e).append(t)},_createPagerCurrentPage:function(){return c("<span>").addClass(this.pageClass).addClass(this.currentPageClass).text(this.pageIndex)},_refreshSize:function(){this._refreshHeight(),this._refreshWidth()},_refreshWidth:function(){var t="auto"===this.width?this._getAutoWidth():this.width;this._container.width(t)},_getAutoWidth:function(){var t=this._headerGrid,e=this._header,i=(t.width("auto"),t.outerWidth()),e=e.outerWidth()-e.innerWidth();return t.width(""),i+e},_scrollBarWidth:function(){var t,e,i;return n===u&&((i=(t=c("<div></div>")).get(0)).style.width="50px",i.style.height="50px",i.style.position="absolute",i.style.top="-10000px",i.style.left="-10000px",(i=c("<div></div>")).get(0).style.height="100px",t.append(i).appendTo("body"),e=i.innerWidth(),t.get(0).style.overflowY="auto",i=i.innerWidth(),t.remove(),n=e-i),n},_refreshHeight:function(){var t,e=this._container,i=this._pagerContainer,n=this.height;e.height(n),"auto"!==n&&(n=e.height(),t=this._header.outerHeight(!0),i.parents(e).length&&(t+=i.outerHeight(!0)),this._body.outerHeight(n-t))},showPrevPages:function(){var t=this._firstDisplayingPage,e=this.pageButtonCount;this._firstDisplayingPage=e<t?t-e:1,this._refreshPager()},showNextPages:function(){var t=this._firstDisplayingPage,e=this.pageButtonCount,i=this._pagesCount();this._firstDisplayingPage=i<t+2*e?i-e+1:t+e,this._refreshPager()},openPage:function(t){t<1||t>this._pagesCount()||(this._setPage(t),this._loadStrategy.openPage(t))},_setPage:function(t){this.pageIndex=t,this._firstDisplayingPage=this._centeredFirstDisplayingPage(t),this._callEventHandler(this.onPageChanged,{pageIndex:t})},_centeredFirstDisplayingPage:function(t){var e=this.pageButtonCount,i=this._pagesCount(),t=t-Math.floor((e-1)/2),i=Math.max(1,i-e+1);return Math.min(Math.max(1,t),i)},_controllerCall:function(t,e,i,n){if(i)return c.Deferred().reject().promise();this._showLoading();var a,i=this._controller;if(i&&i[t])return i=i[t](e),a=c.Deferred(),i&&i.then?i.then(function(){a.resolve.apply(a,arguments)},function(){a.reject.apply(a,arguments)}):a.resolve(i),a.promise().done(c.proxy(n,this)).fail(c.proxy(this._errorHandler,this)).always(c.proxy(this._hideLoading,this));throw Error("controller has no method '"+t+"'")},_errorHandler:function(){this._callEventHandler(this.onError,{args:c.makeArray(arguments)})},_showLoading:function(){this.loadIndication&&(clearTimeout(this._loadingTimer),this._loadingTimer=setTimeout(c.proxy(function(){this._loadIndicator.show()},this),this.loadIndicationDelay))},_hideLoading:function(){this.loadIndication&&(clearTimeout(this._loadingTimer),this._loadIndicator.hide())},search:function(t){return this._resetSorting(),this._resetPager(),this.loadData(t)},loadData:function(t){t=t||(this.filtering?this.getFilter():{}),c.extend(t,this._loadStrategy.loadParams(),this._sortingParams());var e=this._callEventHandler(this.onDataLoading,{filter:t});return this._controllerCall("loadData",t,e.cancel,function(t){t&&(this._loadStrategy.finishLoad(t),this._callEventHandler(this.onDataLoaded,{data:t}))})},exportData:function(t){var t=t||{},e=t.type||"csv",i="";return this._callEventHandler(this.onDataExporting),i="csv"===e?this._dataToCsv(t):i},_dataToCsv:function(t){var e=!(t=t||{}).hasOwnProperty("includeHeaders")||t.includeHeaders,i=t.subset||"all",n=t.filter||u,a=[];if(e){for(var r=this.fields.length,s={},o=0;o<r;o++){var d=this.fields[o];"includeInDataExport"in d&&!0===d.includeInDataExport&&(s[o]=d.title||d.name)}e=this._itemToCsv(s,{},t);a.push(e)}for(var e=0,l=this.data.length,o=e="visible"===i?(l=this._firstDisplayingPage*this.pageSize)-this.pageSize:e;o<l;o++){var h=this.data[o],c=!0;(c=!n||n(h)?c:!1)&&(c=this._itemToCsv(h,this.fields,t),a.push(c))}return a.join("")},_itemToCsv:function(r,s,t){var e=(t=t||{}).delimiter||"|",o=!t.hasOwnProperty("encapsulate")||t.encapsulate,i=t.newline||"\r\n",d=t.transforms||{},s=s||{},l=this._getItemFieldValue,h=[];return Object.keys(r).forEach(function(t,e){var i="";if(0<s.length){var n,a=s[e];if("includeInDataExport"in a){if(!a.includeInDataExport)return;i="select"===a.type?(n=l(r,a),(c.grep(a.items,function(t,e){return t[a.valueField]===n})[0]||"")[a.textField]):l(r,a)}else i=l(r,a);d.hasOwnProperty(a.name)&&(i=d[a.name](i))}else i=r[t];h.push(i=o?'"'+i+'"':i)}),h.join(e)+i},getFilter:function(){var e={};return this._eachField(function(t){t.filtering&&this._setItemFieldValue(e,t,t.filterValue())}),e},_sortingParams:function(){return this.sorting&&this._sortField?{sortField:this._sortField.name,sortOrder:this._sortOrder}:{}},getSorting:function(){var t=this._sortingParams();return{field:t.sortField,order:t.sortOrder}},clearFilter:function(){var t=this._createFilterRow();return this._filterRow.replaceWith(t),this._filterRow=t,this.search()},insertItem:function(t){var e=t||this._getValidatedInsertItem();return e?(t=this._callEventHandler(this.onItemInserting,{item:e}),this._controllerCall("insertItem",e,t.cancel,function(t){this._loadStrategy.finishInsert(t=t||e,this.insertRowLocation),this._callEventHandler(this.onItemInserted,{item:t})})):c.Deferred().reject().promise()},_getValidatedInsertItem:function(){var t=this._getInsertItem();return this._validateItem(t,this._insertRow)?t:null},_getInsertItem:function(){var e={};return this._eachField(function(t){t.inserting&&this._setItemFieldValue(e,t,t.insertValue())}),e},_validateItem:function(i,n){var t,a=[],r={item:i,itemIndex:this._rowIndex(n),row:n};return this._eachField(function(e){var t;!e.validate||n===this._insertRow&&!e.inserting||n===this._getEditRow()&&!e.editing||(t=this._getItemFieldValue(i,e),t=this._validation.validate(c.extend({value:t,rules:e.validate},r)),this._setCellValidity(n.children().eq(this._visibleFieldIndex(e)),t),t.length&&a.push.apply(a,c.map(t,function(t){return{field:e,message:t}})))}),!a.length||(t=c.extend({errors:a},r),this._callEventHandler(this.onItemInvalid,t),this.invalidNotify(t),!1)},_setCellValidity:function(t,e){t.toggleClass(this.invalidClass,!!e.length).attr("title",e.join("\n"))},clearInsert:function(){var t=this._createInsertRow();this._insertRow.replaceWith(t),this._insertRow=t,this.refresh()},editItem:function(t){t=this.rowByItem(t);t.length&&this._editRow(t)},rowByItem:function(t){return t.jquery||t.nodeType?c(t):this._content.find("tr").filter(function(){return c.data(this,o)===t})},_editRow:function(t){var e;this.editing&&(e=t.data(o),this._callEventHandler(this.onItemEditing,{row:t,item:e,itemIndex:this._itemIndex(e)}).cancel||(this._editingRow&&this.cancelEdit(),e=this._createEditRow(e),(this._editingRow=t).hide(),e.insertBefore(t),t.data(i,e)))},_createEditRow:function(i){var n;return c.isFunction(this.editRowRenderer)?c(this.renderTemplate(this.editRowRenderer,this,{item:i,itemIndex:this._itemIndex(i)})):(n=c("<tr>").addClass(this.editRowClass),this._eachField(function(t){var e=this._getItemFieldValue(i,t);this._prepareCell("<td>",t,"editcss").append(this.renderTemplate(t.editTemplate||"",t,{value:e,item:i})).appendTo(n)}),n)},updateItem:function(t,e){1===arguments.length&&(e=t);t=t?this.rowByItem(t):this._editingRow;if(e=e||this._getValidatedEditedItem())return this._updateRow(t,e)},_getValidatedEditedItem:function(){var t=this._getEditedItem();return this._validateItem(t,this._getEditRow())?t:null},_updateRow:function(i,t){var n=i.data(o),a=this._itemIndex(n),r=c.extend(!0,{},n,t),t=this._callEventHandler(this.onItemUpdating,{row:i,item:r,itemIndex:a,previousItem:n});return this._controllerCall("updateItem",r,t.cancel,function(t){var e=c.extend(!0,{},n),t=(r=t||c.extend(!0,n,r),this._finishUpdate(i,r,a));this._callEventHandler(this.onItemUpdated,{row:t,item:r,itemIndex:a,previousItem:e})})},_rowIndex:function(t){return this._content.children().index(c(t))},_itemIndex:function(t){return c.inArray(t,this.data)},_finishUpdate:function(t,e,i){this.cancelEdit(),this.data[i]=e;e=this._createRow(e,i);return t.replaceWith(e),e},_getEditedItem:function(){var e={};return this._eachField(function(t){t.editing&&this._setItemFieldValue(e,t,t.editValue())}),e},cancelEdit:function(){var t,e,i;this._editingRow&&(e=(t=this._editingRow).data(o),i=this._itemIndex(e),this._callEventHandler(this.onItemEditCancelling,{row:t,item:e,itemIndex:i}),this._getEditRow().remove(),this._editingRow.show(),this._editingRow=null)},_getEditRow:function(){return this._editingRow&&this._editingRow.data(i)},deleteItem:function(t){t=this.rowByItem(t);if(t.length&&(!this.confirmDeleting||a.confirm(r(this.deleteConfirm,this,t.data(o)))))return this._deleteRow(t)},_deleteRow:function(t){var e=t.data(o),i=this._itemIndex(e),n=this._callEventHandler(this.onItemDeleting,{row:t,item:e,itemIndex:i});return this._controllerCall("deleteItem",e,n.cancel,function(){this._loadStrategy.finishDelete(e,i),this._callEventHandler(this.onItemDeleted,{row:t,item:e,itemIndex:i})})}},c.fn.jsGrid=function(n){var a=c.makeArray(arguments).slice(1),r=this;return this.each(function(){var t,e=c(this),i=e.data(s);if(i)if("string"==typeof n){if((t=i[n].apply(i,a))!==u&&t!==i)return r=t,!1}else i._detachWindowResizeCallback(),i._init(n),i.render();else new g(e,n)}),r};var p={},_={},f=function(i,t){i&&c.each(t,function(t,e){c.isPlainObject(e)?f(i[t]||i[t[0].toUpperCase()+t.slice(1)],e):i.hasOwnProperty(t)?i[t]=e:i.prototype&&(i.prototype[t]=e)})};a.jsGrid={Grid:g,fields:p,setDefaults:function(t){var e;c.isPlainObject(t)?e=g.prototype:(e=p[t].prototype,t=arguments[1]||{}),c.extend(e,t)},locales:_,locale:function(t){var e=c.isPlainObject(t)?t:_[t];if(!e)throw Error("unknown locale "+t);f(jsGrid,e)},version:"2.4.0"}})(window,jQuery),((t,e)=>{function i(t){this._init(t)}i.prototype={container:"body",message:"Loading...",shading:!0,zIndex:1e3,shaderClass:"jsgrid-load-shader",loadPanelClass:"jsgrid-load-panel",_init:function(t){e.extend(!0,this,t),this._initContainer(),this._initShader(),this._initLoadPanel()},_initContainer:function(){this._container=e(this.container)},_initShader:function(){this.shading&&(this._shader=e("<div>").addClass(this.shaderClass).hide().css({position:"absolute",top:0,right:0,bottom:0,left:0,zIndex:this.zIndex}).appendTo(this._container))},_initLoadPanel:function(){this._loadPanel=e("<div>").addClass(this.loadPanelClass).text(this.message).hide().css({position:"absolute",top:"50%",left:"50%",zIndex:this.zIndex}).appendTo(this._container)},show:function(){var t=this._loadPanel.show(),e=t.outerWidth(),i=t.outerHeight();t.css({marginTop:-i/2,marginLeft:-e/2}),this._shader.show()},hide:function(){this._loadPanel.hide(),this._shader.hide()}},t.LoadIndicator=i})(jsGrid,jQuery),((t,e)=>{function i(t){this._grid=t}function n(t){this._grid=t,this._itemsCount=0}i.prototype={firstDisplayIndex:function(){var t=this._grid;return t.option("paging")?(t.option("pageIndex")-1)*t.option("pageSize"):0},lastDisplayIndex:function(){var t=this._grid,e=t.option("data").length;return t.option("paging")?Math.min(t.option("pageIndex")*t.option("pageSize"),e):e},itemsCount:function(){return this._grid.option("data").length},openPage:function(t){this._grid.refresh()},loadParams:function(){return{}},sort:function(){return this._grid._sortData(),this._grid.refresh(),e.Deferred().resolve().promise()},reset:function(){return this._grid.refresh(),e.Deferred().resolve().promise()},finishLoad:function(t){this._grid.option("data",t)},finishInsert:function(t,e){var i=this._grid;"top"===e?i.option("data").unshift(t):i.option("data").push(t),i.refresh()},finishDelete:function(t,e){var i=this._grid;i.option("data").splice(e,1),i.reset()}},n.prototype={firstDisplayIndex:function(){return 0},lastDisplayIndex:function(){return this._grid.option("data").length},itemsCount:function(){return this._itemsCount},openPage:function(t){this._grid.loadData()},loadParams:function(){var t=this._grid;return{pageIndex:t.option("pageIndex"),pageSize:t.option("pageSize")}},reset:function(){return this._grid.loadData()},sort:function(){return this._grid.loadData()},finishLoad:function(t){this._itemsCount=t.itemsCount,this._grid.option("data",t.data)},finishInsert:function(t){this._grid.search()},finishDelete:function(t,e){this._grid.search()}},t.loadStrategies={DirectLoadingStrategy:i,PageLoadingStrategy:n}})(jsGrid,jQuery),(t=>{function i(t){return null!=t}t.sortStrategies={string:function(t,e){return i(t)||i(e)?i(t)?i(e)?(""+t).localeCompare(""+e):1:-1:0},stringNaturalSort:function(t,e){return i(t)||i(e)?i(t)?i(e)?(""+t).localeCompare(""+e,void 0,{numeric:!0,sensitivity:"base"}):1:-1:0},number:function(t,e){return t-e},date:function(t,e){return t-e},numberAsString:function(t,e){return parseFloat(t)-parseFloat(e)}}})(jsGrid,jQuery),((t,a)=>{function e(t){this._init(t)}e.prototype={_init:function(t){a.extend(!0,this,t)},validate:function(i){var n=[];return a.each(this._normalizeRules(i.rules),function(t,e){e.validator(i.value,i.item,e.param)||(e=a.isFunction(e.message)?e.message(i.value,i.item):e.message,n.push(e))}),n},_normalizeRules:function(t){return a.isArray(t)||(t=[t]),a.map(t,a.proxy(function(t){return this._normalizeRule(t)},this))},_normalizeRule:function(t){if(a.isFunction(t="string"==typeof t?{validator:t}:t)&&(t={validator:t}),a.isPlainObject(t))return t=a.extend({},t),a.isFunction(t.validator)?t:this._applyNamedValidator(t,t.validator);throw Error("wrong validation config specified")},_applyNamedValidator:function(t,e){delete t.validator;var i=n[e];if(!i)throw Error('unknown validator "'+e+'"');a.isFunction(i)&&(i={validator:i});e=this.validatorsLocale&&this.validatorsLocale[e];return a.extend({},i,e,t)}},t.Validation=e;var n={required:{message:"Field is required",validator:function(t){return null!=t&&""!==t}},rangeLength:{message:"Field value length is out of the defined range",validator:function(t,e,i){return t.length>=i[0]&&t.length<=i[1]}},minLength:{message:"Field value is too short",validator:function(t,e,i){return t.length>=i}},maxLength:{message:"Field value is too long",validator:function(t,e,i){return t.length<=i}},pattern:{message:"Field value is not matching the defined pattern",validator:function(t,e,i){return(i="string"==typeof i?new RegExp("^(?:"+i+")$"):i).test(t)}},range:{message:"Field value is out of the defined range",validator:function(t,e,i){return t>=i[0]&&t<=i[1]}},min:{message:"Field value is too small",validator:function(t,e,i){return i<=t}},max:{message:"Field value is too large",validator:function(t,e,i){return t<=i}}};t.validators=n})(jsGrid,jQuery),((e,i)=>{function t(t){i.extend(!0,this,t),this.sortingFunc=this._getSortingFunc()}t.prototype={name:"",title:null,css:"",align:"",width:100,visible:!0,filtering:!0,inserting:!0,editing:!0,sorting:!0,sorter:"string",includeInDataExport:!0,headerTemplate:function(){return null==this.title?this.name:this.title},itemTemplate:function(t,e){return t},filterTemplate:function(){return""},insertTemplate:function(){return""},editTemplate:function(t,e){return this._value=t,this.itemTemplate(t,e)},filterValue:function(){return""},insertValue:function(){return""},editValue:function(){return this._value},_getSortingFunc:function(){var t=this.sorter;if(i.isFunction(t))return t;if("string"==typeof t)return e.sortStrategies[t];throw Error('wrong sorter for the field "'+this.name+'"!')}},e.Field=t})(jsGrid,jQuery);
6
+ ((a,c,u)=>{function r(t,e){return c.isFunction(t)?t.apply(e,c.makeArray(arguments).slice(2)):t}var n,s="JSGrid",o="JSGridItem",i="JSGridEditRow",d=[],l=0,h="asc",t={loadData:c.noop,insertItem:c.noop,updateItem:c.noop,deleteItem:c.noop};function g(t,e){t=c(t);0==d.length?(this._id=l,l++):this._id=d.pop(),t.data(s,this),this._container=t,this.data=[],this.fields=[],this._editingRow=null,this._sortField=null,this._sortOrder=h,this._firstDisplayingPage=1,this._init(e),this.render()}g.prototype={width:"auto",height:"auto",updateOnResize:!0,locale:null,rowClass:c.noop,rowRenderer:null,rowClick:function(t){this.editing&&this.editItem(c(t.event.target).closest("tr"))},rowDoubleClick:c.noop,noDataContent:"Not found",noDataRowClass:"jsgrid-nodata-row",heading:!0,headerRowRenderer:null,headerRowClass:"jsgrid-header-row",headerCellClass:"jsgrid-header-cell",filtering:!1,filterRowRenderer:null,filterRowClass:"jsgrid-filter-row",inserting:!1,insertRowLocation:"bottom",insertRowRenderer:null,insertRowClass:"jsgrid-insert-row",editing:!1,editRowRenderer:null,editRowClass:"jsgrid-edit-row",confirmDeleting:!0,deleteConfirm:"Are you sure?",selecting:!0,selectedRowClass:"jsgrid-selected-row",oddRowClass:"jsgrid-row",evenRowClass:"jsgrid-alt-row",cellClass:"jsgrid-cell",sorting:!1,sortableClass:"jsgrid-header-sortable",sortAscClass:"jsgrid-header-sort jsgrid-header-sort-asc",sortDescClass:"jsgrid-header-sort jsgrid-header-sort-desc",sortField:null,sortOrder:null,paging:!1,pagerContainer:null,pageIndex:1,pageSize:20,pageButtonCount:15,pagerFormat:"Pages: {first} {prev} {pages} {next} {last} &nbsp;&nbsp; {pageIndex} of {pageCount}",pagePrevText:"Prev",pageNextText:"Next",pageFirstText:"First",pageLastText:"Last",pageNavigatorNextText:"...",pageNavigatorPrevText:"...",pagerContainerClass:"jsgrid-pager-container",pagerClass:"jsgrid-pager",pagerNavButtonClass:"jsgrid-pager-nav-button",pagerNavButtonInactiveClass:"jsgrid-pager-nav-inactive-button",pageClass:"jsgrid-pager-page",currentPageClass:"jsgrid-pager-current-page",customLoading:!1,pageLoading:!1,autoload:!1,controller:t,loadIndication:!0,loadIndicationDelay:500,loadMessage:"Please, wait...",loadShading:!0,invalidMessage:"Invalid data entered!",invalidNotify:function(t){t=c.map(t.errors,function(t){return t.message||null});a.alert([this.invalidMessage].concat(t).join("\n"))},onInit:c.noop,onRefreshing:c.noop,onRefreshed:c.noop,onPageChanged:c.noop,onItemDeleting:c.noop,onItemDeleted:c.noop,onItemInserting:c.noop,onItemInserted:c.noop,onItemEditing:c.noop,onItemEditCancelling:c.noop,onItemUpdating:c.noop,onItemUpdated:c.noop,onItemInvalid:c.noop,onDataLoading:c.noop,onDataLoaded:c.noop,onDataExporting:c.noop,onOptionChanging:c.noop,onOptionChanged:c.noop,onError:c.noop,invalidClass:"jsgrid-invalid",containerClass:"jsgrid",tableClass:"jsgrid-table",gridHeaderClass:"jsgrid-grid-header",gridBodyClass:"jsgrid-grid-body",_init:function(t){this._initInstanceLocale(t&&t.locale),c.extend(this,t),this._initLoadStrategy(),this._initController(),this._initFields(),this._initSorting(),this._attachWindowLoadResize(),this._attachWindowResizeCallback(),this._callEventHandler(this.onInit)},_initSorting:function(){var t;this.sortField&&(t=this._normalizeField(this.sortField))&&(this._sortField=t,this._sortOrder=this.sortOrder||h,c.isArray(this.data)&&this.data.length?this._sortData():this.pageLoading||(this._pendingInitialSort=!0))},_initInstanceLocale:function(t){t&&(t=c.isPlainObject(t)?t:jsGrid.locales[t])&&(t.grid&&c.extend(this,t.grid),this._fieldsLocaleConfig=t.fields,this._validatorsLocaleConfig=t.validators)},loadStrategy:function(){return new(this.pageLoading?jsGrid.loadStrategies.PageLoadingStrategy:jsGrid.loadStrategies.DirectLoadingStrategy)(this)},_initLoadStrategy:function(){this._loadStrategy=r(this.loadStrategy,this)},_initController:function(){this._controller=c.extend({},t,r(this.controller,this))},renderTemplate:function(t,e,i){var n,a=[];for(n in i)a.push(i[n]);return a.unshift(t,e),(t=r.apply(null,a))===u||null===t?"":t},loadIndicator:function(t){return new jsGrid.LoadIndicator(t)},validation:function(t){return jsGrid.Validation&&new jsGrid.Validation(t)},_initFields:function(){var i=this,n=i._fieldsLocaleConfig;i.fields=c.map(i.fields,function(t){var e;return c.isPlainObject(t)&&(t.type&&!jsGrid.fields[t.type]&&a.console&&console.warn('[jsxgrid] unknown field type "'+t.type+'" - falling back to the base field (no filtering/inserting/editing UI). Check that its script is loaded, and after jsxgrid.js.'),t=new(t.type&&jsGrid.fields[t.type]||jsGrid.Field)(t=(e=n&&t.type&&n[t.type])?c.extend({},e,t):t)),t._grid=i,t})},_attachWindowLoadResize:function(){c(a).on("load.table-"+this._id,c.proxy(this._refreshSize,this))},_attachWindowResizeCallback:function(){this.updateOnResize&&c(a).on("resize.table-"+this._id,c.proxy(this._refreshSize,this))},_detachWindowLoadResize:function(){c(a).off("load.table-"+this._id)},_detachWindowResizeCallback:function(){c(a).off("resize.table-"+this._id)},option:function(t,e){if(1===arguments.length)return this[t];t={option:t,oldValue:this[t],newValue:e},this._callEventHandler(this.onOptionChanging,t),this._handleOptionChange(t.option,t.newValue),this._callEventHandler(this.onOptionChanged,{option:t.option,value:t.newValue})},fieldOption:function(t,e,i){if(t=this._normalizeField(t),2===arguments.length)return t[e];t[e]=i,this._renderGrid()},_handleOptionChange:function(t,e){switch(this[t]=e,t){case"width":case"height":this._refreshSize();break;case"rowClass":case"rowRenderer":case"rowClick":case"rowDoubleClick":case"noDataRowClass":case"noDataContent":case"selecting":case"selectedRowClass":case"oddRowClass":case"evenRowClass":this._refreshContent();break;case"pageButtonCount":case"pagerFormat":case"pagePrevText":case"pageNextText":case"pageFirstText":case"pageLastText":case"pageNavigatorNextText":case"pageNavigatorPrevText":case"pagerClass":case"pagerNavButtonClass":case"pageClass":case"currentPageClass":case"pagerRenderer":this._refreshPager();break;case"fields":this._initFields(),this.render();break;case"data":this._pendingInitialSort&&(this._pendingInitialSort=!1,this._sortData()),this.refresh();break;case"editing":case"heading":case"filtering":case"inserting":case"paging":this.refresh();break;case"loadStrategy":case"pageLoading":this._initLoadStrategy(),this.search();break;case"pageIndex":this.openPage(e);break;case"pageSize":this.refresh(),this.search();break;case"editRowRenderer":case"editRowClass":this.cancelEdit();break;case"updateOnResize":this._detachWindowResizeCallback(),this._attachWindowResizeCallback();break;case"invalidNotify":case"invalidMessage":break;default:this.render()}},destroy:function(){this._detachWindowResizeCallback(),this._detachWindowLoadResize(),d.push(this._id),this._clear(),this._container.removeData(s)},render:function(){return this._renderGrid(),this.autoload?this.loadData():c.Deferred().resolve().promise()},_renderGrid:function(){this._clear(),this._container.addClass(this.containerClass).css("position","relative").append(this._createHeader()).append(this._createBody()),this._pagerContainer=this._createPagerContainer(),this._loadIndicator=this._createLoadIndicator(),this._validation=this._createValidation(),this.refresh()},_createLoadIndicator:function(){return r(this.loadIndicator,this,{message:this.loadMessage,shading:this.loadShading,container:this._container})},_createValidation:function(){return r(this.validation,this,{validatorsLocale:this._validatorsLocaleConfig})},_clear:function(){this.cancelEdit(),clearTimeout(this._loadingTimer),this._pagerContainer&&this._pagerContainer.empty(),this._container.empty().css({position:"",width:"",height:""})},_createHeader:function(){var t=this._headerRow=this._createHeaderRow(),e=this._filterRow=this._createFilterRow(),i=this._insertRow=this._createInsertRow(),t=this._headerGrid=c("<table>").addClass(this.tableClass).append(t).append(e).append(i);return this._header=c("<div>").addClass(this.gridHeaderClass).addClass(this._scrollBarWidth()?"jsgrid-header-scrollbar":"").append(t)},_createBody:function(){var t=this._content=c("<tbody>"),t=this._bodyGrid=c("<table>").addClass(this.tableClass).append(t);return this._body=c("<div>").addClass(this.gridBodyClass).append(t).on("scroll",c.proxy(function(t){this._header.scrollLeft(t.target.scrollLeft)},this))},_createPagerContainer:function(){var t=this.pagerContainer||c("<div>").appendTo(this._container);return c(t).addClass(this.pagerContainerClass)},_eachField:function(i){var n=this;c.each(this.fields,function(t,e){e.visible&&i.call(n,e,t)})},_createHeaderRow:function(){var n;return c.isFunction(this.headerRowRenderer)?c(this.renderTemplate(this.headerRowRenderer,this)):(n=c("<tr>").addClass(this.headerRowClass),this._eachField(function(t,e){var i=this._prepareCell("<th>",t,"headercss",this.headerCellClass).append(this.renderTemplate(t.headerTemplate,t)).appendTo(n);this.sorting&&t.sorting&&(i.addClass(this.sortableClass).on("click",c.proxy(function(){this.sort(e)},this)),t===this._sortField)&&i.addClass(this._sortOrder===h?this.sortAscClass:this.sortDescClass)}),n)},_prepareCell:function(t,e,i,n){return c(t).css("width",e.width).addClass(n||this.cellClass).addClass(i&&e[i]||e.css).addClass(e.align?"jsgrid-align-"+e.align:"")},_createFilterRow:function(){var e;return c.isFunction(this.filterRowRenderer)?c(this.renderTemplate(this.filterRowRenderer,this)):(e=c("<tr>").addClass(this.filterRowClass),this._eachField(function(t){this._prepareCell("<td>",t,"filtercss").append(this.renderTemplate(t.filterTemplate,t)).appendTo(e)}),e)},_createInsertRow:function(){var e;return c.isFunction(this.insertRowRenderer)?c(this.renderTemplate(this.insertRowRenderer,this)):(e=c("<tr>").addClass(this.insertRowClass),this._eachField(function(t){this._prepareCell("<td>",t,"insertcss").append(this.renderTemplate(t.insertTemplate,t)).appendTo(e)}),e)},_callEventHandler:function(t,e){return t.call(this,c.extend(e,{grid:this})),e},reset:function(){return this._resetSorting(),this._resetPager(),this._loadStrategy.reset()},_resetPager:function(){this._setPage(1)},_resetSorting:function(){this._sortField=null,this._sortOrder=h,this._clearSortingCss()},refresh:function(){this._callEventHandler(this.onRefreshing),this.cancelEdit(),this._refreshHeading(),this._refreshFiltering(),this._refreshInserting(),this._refreshContent(),this._refreshPager(),this._refreshSize(),this._callEventHandler(this.onRefreshed)},_refreshHeading:function(){this._headerRow.toggle(this.heading)},_refreshFiltering:function(){this._filterRow.toggle(this.filtering)},_refreshInserting:function(){this._insertRow.toggle(this.inserting)},_refreshContent:function(){var t=this._content;if(t.empty(),!this.data.length)return t.append(this._createNoDataRow()),this;for(var e=this._loadStrategy.firstDisplayIndex(),i=this._loadStrategy.lastDisplayIndex(),n=e;n<i;n++){var a=this.data[n];t.append(this._createRow(a,n))}},_createNoDataRow:function(){var t=0;return this._eachField(function(){t++}),c("<tr>").addClass(this.noDataRowClass).append(c("<td>").addClass(this.cellClass).attr("colspan",t).append(this.renderTemplate(this.noDataContent,this)))},_createRow:function(e,i){var t;return c.isFunction(this.rowRenderer)?t=this.renderTemplate(this.rowRenderer,this,{item:e,itemIndex:i}):(t=c("<tr>"),this._renderCells(t,e)),t.addClass(this._getRowClasses(e,i)).data(o,e).on("click",c.proxy(function(t){this.rowClick({item:e,itemIndex:i,event:t})},this)).on("dblclick",c.proxy(function(t){this.rowDoubleClick({item:e,itemIndex:i,event:t})},this)),this.selecting&&this._attachRowHover(t),t},_getRowClasses:function(t,e){var i=[];return i.push((e+1)%2?this.oddRowClass:this.evenRowClass),i.push(r(this.rowClass,this,t,e)),i.join(" ")},_attachRowHover:function(t){var e=this.selectedRowClass;t.hover(function(){c(this).addClass(e)},function(){c(this).removeClass(e)})},_renderCells:function(e,i){return this._eachField(function(t){e.append(this._createCell(i,t))}),this},_createCell:function(t,e){var i=this._getItemFieldValue(t,e),t={value:i,item:t},i=c.isFunction(e.cellRenderer)?this.renderTemplate(e.cellRenderer,e,t):c("<td>").append(this.renderTemplate(e.itemTemplate||i,e,t));return this._prepareCell(i,e)},_getItemFieldValue:function(t,e){for(var i=e.name.split("."),n=t[i.shift()];n&&i.length;)n=n[i.shift()];return n},_setItemFieldValue:function(t,e,i){for(var n=e.name.split("."),a=t,r=n[0];a&&n.length;)a=(t=a)[r=n.shift()];if(!a)for(;n.length;)t=t[r]={},r=n.shift();t[r]=i},sort:function(t,e){return c.isPlainObject(t)&&(e=t.order,t=t.field),this._clearSortingCss(),this._setSortingParams(t,e),this._setSortingCss(),this._loadStrategy.sort()},_clearSortingCss:function(){this._headerRow.find("th").removeClass(this.sortAscClass).removeClass(this.sortDescClass)},_setSortingParams:function(t,e){t=this._normalizeField(t),e=e||(this._sortField===t?this._reversedSortOrder(this._sortOrder):h),this._sortField=t,this._sortOrder=e},_normalizeField:function(e){return c.isNumeric(e)?this.fields[e]:"string"==typeof e?c.grep(this.fields,function(t){return t.name===e})[0]:e},_reversedSortOrder:function(t){return t===h?"desc":h},_setSortingCss:function(){var t=this._visibleFieldIndex(this._sortField);this._headerRow.find("th").eq(t).addClass(this._sortOrder===h?this.sortAscClass:this.sortDescClass)},_visibleFieldIndex:function(t){return c.inArray(t,c.grep(this.fields,function(t){return t.visible}))},_sortData:function(){var i,n=this._sortFactor(),a=this._sortField;a&&(i=this).data.sort(function(t,e){t=i._getItemFieldValue(t,a),e=i._getItemFieldValue(e,a);return n*a.sortingFunc(t,e)})},_sortFactor:function(){return this._sortOrder===h?1:-1},_itemsCount:function(){return this._loadStrategy.itemsCount()},_pagesCount:function(){var t=this._itemsCount(),e=this.pageSize;return Math.floor(t/e)+(t%e?1:0)},_refreshPager:function(){var t=this._pagerContainer,e=(t.empty(),this.paging&&t.append(this._createPager()),this.paging&&1<this._pagesCount());t.toggle(e)},_createPager:function(){var t=c.isFunction(this.pagerRenderer)?c(this.pagerRenderer({pageIndex:this.pageIndex,pageCount:this._pagesCount()})):c("<div>").append(this._createPagerByFormat());return t.addClass(this.pagerClass),t},_createPagerByFormat:function(){var i=this.pageIndex,n=this._pagesCount(),a=this._itemsCount(),t=this.pagerFormat.split(" ");return c.map(t,c.proxy(function(t){var e=t;return"{pages}"===t?e=this._createPages():"{first}"===t?e=this._createPagerNavButton(this.pageFirstText,1,1<i):"{prev}"===t?e=this._createPagerNavButton(this.pagePrevText,i-1,1<i):"{next}"===t?e=this._createPagerNavButton(this.pageNextText,i+1,i<n):"{last}"===t?e=this._createPagerNavButton(this.pageLastText,n,i<n):"{pageIndex}"===t?e=i:"{pageCount}"===t?e=n:"{itemCount}"===t&&(e=a),c.isArray(e)?e.concat([" "]):[e," "]},this))},_createPages:function(){var t=this._pagesCount(),e=this.pageButtonCount,i=this._firstDisplayingPage,n=[];1<i&&n.push(this._createPagerPageNavButton(this.pageNavigatorPrevText,this.showPrevPages));for(var a=0,r=i;a<e&&r<=t;a++,r++)n.push(r===this.pageIndex?this._createPagerCurrentPage():this._createPagerPage(r));return i+e-1<t&&n.push(this._createPagerPageNavButton(this.pageNavigatorNextText,this.showNextPages)),n},_createPagerNavButton:function(t,e,i){return this._createPagerButton(t,this.pagerNavButtonClass+(i?"":" "+this.pagerNavButtonInactiveClass),i?function(){this.openPage(e)}:c.noop)},_createPagerPageNavButton:function(t,e){return this._createPagerButton(t,this.pagerNavButtonClass,e)},_createPagerPage:function(t){return this._createPagerButton(t,this.pageClass,function(){this.openPage(t)})},_createPagerButton:function(t,e,i){t=c("<a>").attr("href","javascript:void(0);").html(t).on("click",c.proxy(i,this));return c("<span>").addClass(e).append(t)},_createPagerCurrentPage:function(){return c("<span>").addClass(this.pageClass).addClass(this.currentPageClass).text(this.pageIndex)},_refreshSize:function(){this._refreshHeight(),this._refreshWidth()},_refreshWidth:function(){var t="auto"===this.width?this._getAutoWidth():this.width;this._container.width(t)},_getAutoWidth:function(){var t=this._headerGrid,e=this._header,i=(t.width("auto"),t.outerWidth()),e=e.outerWidth()-e.innerWidth();return t.width(""),i+e},_scrollBarWidth:function(){var t,e,i;return n===u&&((i=(t=c("<div></div>")).get(0)).style.width="50px",i.style.height="50px",i.style.position="absolute",i.style.top="-10000px",i.style.left="-10000px",(i=c("<div></div>")).get(0).style.height="100px",t.append(i).appendTo("body"),e=i.innerWidth(),t.get(0).style.overflowY="auto",i=i.innerWidth(),t.remove(),n=e-i),n},_refreshHeight:function(){var t,e=this._container,i=this._pagerContainer,n=this.height;e.height(n),"auto"!==n&&(n=e.height(),t=this._header.outerHeight(!0),i.parents(e).length&&(t+=i.outerHeight(!0)),this._body.outerHeight(n-t))},showPrevPages:function(){var t=this._firstDisplayingPage,e=this.pageButtonCount;this._firstDisplayingPage=e<t?t-e:1,this._refreshPager()},showNextPages:function(){var t=this._firstDisplayingPage,e=this.pageButtonCount,i=this._pagesCount();this._firstDisplayingPage=i<t+2*e?i-e+1:t+e,this._refreshPager()},openPage:function(t){t<1||t>this._pagesCount()||(this._setPage(t),this._loadStrategy.openPage(t))},_setPage:function(t){this.pageIndex=t,this._firstDisplayingPage=this._centeredFirstDisplayingPage(t),this._callEventHandler(this.onPageChanged,{pageIndex:t})},_centeredFirstDisplayingPage:function(t){var e=this.pageButtonCount,i=this._pagesCount(),t=t-Math.floor((e-1)/2),i=Math.max(1,i-e+1);return Math.min(Math.max(1,t),i)},_controllerCall:function(t,e,i,n){if(i)return c.Deferred().reject().promise();this._showLoading();var a,i=this._controller;if(i&&i[t])return i=i[t](e),a=c.Deferred(),i&&i.then?i.then(function(){a.resolve.apply(a,arguments)},function(){a.reject.apply(a,arguments)}):a.resolve(i),a.promise().done(c.proxy(n,this)).fail(c.proxy(this._errorHandler,this)).always(c.proxy(this._hideLoading,this));throw Error("controller has no method '"+t+"'")},_errorHandler:function(){this._callEventHandler(this.onError,{args:c.makeArray(arguments)})},_showLoading:function(){this.loadIndication&&(clearTimeout(this._loadingTimer),this._loadingTimer=setTimeout(c.proxy(function(){this._loadIndicator.show()},this),this.loadIndicationDelay))},_hideLoading:function(){this.loadIndication&&(clearTimeout(this._loadingTimer),this._loadIndicator.hide())},search:function(t){return this._resetSorting(),this._resetPager(),this.loadData(t)},loadData:function(t){t=t||(this.filtering?this.getFilter():{}),c.extend(t,this._loadStrategy.loadParams(),this._sortingParams());var e=this._callEventHandler(this.onDataLoading,{filter:t});return this._controllerCall("loadData",t,e.cancel,function(t){t&&(this._loadStrategy.finishLoad(t),this._callEventHandler(this.onDataLoaded,{data:t}))})},exportData:function(t){var t=t||{},e=t.type||"csv",i="";return this._callEventHandler(this.onDataExporting),i="csv"===e?this._dataToCsv(t):i},_dataToCsv:function(t){var e=!(t=t||{}).hasOwnProperty("includeHeaders")||t.includeHeaders,i=t.subset||"all",n=t.filter||u,a=[];if(e){for(var r=this.fields.length,s={},o=0;o<r;o++){var d=this.fields[o];"includeInDataExport"in d&&!0===d.includeInDataExport&&(s[o]=d.title||d.name)}e=this._itemToCsv(s,{},t);a.push(e)}for(var e=0,l=this.data.length,o=e="visible"===i?(l=this._firstDisplayingPage*this.pageSize)-this.pageSize:e;o<l;o++){var h=this.data[o],c=!0;(c=!n||n(h)?c:!1)&&(c=this._itemToCsv(h,this.fields,t),a.push(c))}return a.join("")},_itemToCsv:function(r,s,t){var e=(t=t||{}).delimiter||"|",o=!t.hasOwnProperty("encapsulate")||t.encapsulate,i=t.newline||"\r\n",d=t.transforms||{},s=s||{},l=this._getItemFieldValue,h=[];return Object.keys(r).forEach(function(t,e){var i="";if(0<s.length){var n,a=s[e];if("includeInDataExport"in a){if(!a.includeInDataExport)return;i="select"===a.type?(n=l(r,a),(c.grep(a.items,function(t,e){return t[a.valueField]===n})[0]||"")[a.textField]):l(r,a)}else i=l(r,a);d.hasOwnProperty(a.name)&&(i=d[a.name](i))}else i=r[t];h.push(i=o?'"'+i+'"':i)}),h.join(e)+i},getFilter:function(){var e={};return this._eachField(function(t){t.filtering&&this._setItemFieldValue(e,t,t.filterValue())}),e},_sortingParams:function(){return this.sorting&&this._sortField?{sortField:this._sortField.name,sortOrder:this._sortOrder}:{}},getSorting:function(){var t=this._sortingParams();return{field:t.sortField,order:t.sortOrder}},clearFilter:function(){var t=this._createFilterRow();return this._filterRow.replaceWith(t),this._filterRow=t,this.search()},insertItem:function(t){var e=t||this._getValidatedInsertItem();return e?(t=this._callEventHandler(this.onItemInserting,{item:e}),this._controllerCall("insertItem",e,t.cancel,function(t){this._loadStrategy.finishInsert(t=t||e,this.insertRowLocation),this._callEventHandler(this.onItemInserted,{item:t})})):c.Deferred().reject().promise()},_getValidatedInsertItem:function(){var t=this._getInsertItem();return this._validateItem(t,this._insertRow)?t:null},_getInsertItem:function(){var e={};return this._eachField(function(t){t.inserting&&this._setItemFieldValue(e,t,t.insertValue())}),e},_validateItem:function(i,n){var t,a=[],r={item:i,itemIndex:this._rowIndex(n),row:n};return this._eachField(function(e){var t;!e.validate||n===this._insertRow&&!e.inserting||n===this._getEditRow()&&!e.editing||(t=this._getItemFieldValue(i,e),t=this._validation.validate(c.extend({value:t,rules:e.validate},r)),this._setCellValidity(n.children().eq(this._visibleFieldIndex(e)),t),t.length&&a.push.apply(a,c.map(t,function(t){return{field:e,message:t}})))}),!a.length||(t=c.extend({errors:a},r),this._callEventHandler(this.onItemInvalid,t),this.invalidNotify(t),!1)},_setCellValidity:function(t,e){t.toggleClass(this.invalidClass,!!e.length).attr("title",e.join("\n"))},clearInsert:function(){var t=this._createInsertRow();this._insertRow.replaceWith(t),this._insertRow=t,this.refresh()},editItem:function(t){t=this.rowByItem(t);t.length&&this._editRow(t)},rowByItem:function(t){return t.jquery||t.nodeType?c(t):this._content.find("tr").filter(function(){return c.data(this,o)===t})},_editRow:function(t){var e;this.editing&&(e=t.data(o),this._callEventHandler(this.onItemEditing,{row:t,item:e,itemIndex:this._itemIndex(e)}).cancel||(this._editingRow&&this.cancelEdit(),e=this._createEditRow(e),(this._editingRow=t).hide(),e.insertBefore(t),t.data(i,e)))},_createEditRow:function(i){var n;return c.isFunction(this.editRowRenderer)?c(this.renderTemplate(this.editRowRenderer,this,{item:i,itemIndex:this._itemIndex(i)})):(n=c("<tr>").addClass(this.editRowClass),this._eachField(function(t){var e=this._getItemFieldValue(i,t);this._prepareCell("<td>",t,"editcss").append(this.renderTemplate(t.editTemplate||"",t,{value:e,item:i})).appendTo(n)}),n)},updateItem:function(t,e){1===arguments.length&&(e=t);t=t?this.rowByItem(t):this._editingRow;if(e=e||this._getValidatedEditedItem())return this._updateRow(t,e)},_getValidatedEditedItem:function(){var t=this._getEditedItem();return this._validateItem(t,this._getEditRow())?t:null},_updateRow:function(i,t){var n=i.data(o),a=this._itemIndex(n),r=c.extend(!0,{},n,t),t=this._callEventHandler(this.onItemUpdating,{row:i,item:r,itemIndex:a,previousItem:n});return this._controllerCall("updateItem",r,t.cancel,function(t){var e=c.extend(!0,{},n),t=(r=t||c.extend(!0,n,r),this._finishUpdate(i,r,a));this._callEventHandler(this.onItemUpdated,{row:t,item:r,itemIndex:a,previousItem:e})})},_rowIndex:function(t){return this._content.children().index(c(t))},_itemIndex:function(t){return c.inArray(t,this.data)},_finishUpdate:function(t,e,i){this.cancelEdit(),this.data[i]=e;e=this._createRow(e,i);return t.replaceWith(e),e},_getEditedItem:function(){var e={};return this._eachField(function(t){t.editing&&this._setItemFieldValue(e,t,t.editValue())}),e},cancelEdit:function(){var t,e,i;this._editingRow&&(e=(t=this._editingRow).data(o),i=this._itemIndex(e),this._callEventHandler(this.onItemEditCancelling,{row:t,item:e,itemIndex:i}),this._getEditRow().remove(),this._editingRow.show(),this._editingRow=null)},_getEditRow:function(){return this._editingRow&&this._editingRow.data(i)},deleteItem:function(t){t=this.rowByItem(t);if(t.length&&(!this.confirmDeleting||a.confirm(r(this.deleteConfirm,this,t.data(o)))))return this._deleteRow(t)},_deleteRow:function(t){var e=t.data(o),i=this._itemIndex(e),n=this._callEventHandler(this.onItemDeleting,{row:t,item:e,itemIndex:i});return this._controllerCall("deleteItem",e,n.cancel,function(){this._loadStrategy.finishDelete(e,i),this._callEventHandler(this.onItemDeleted,{row:t,item:e,itemIndex:i})})}},c.fn.jsGrid=function(n){var a=c.makeArray(arguments).slice(1),r=this;return this.each(function(){var t,e=c(this),i=e.data(s);if(i)if("string"==typeof n){if((t=i[n].apply(i,a))!==u&&t!==i)return r=t,!1}else i._detachWindowResizeCallback(),i._init(n),i.render();else new g(e,n)}),r};var p={},_={},f=function(i,t){i&&c.each(t,function(t,e){c.isPlainObject(e)?f(i[t]||i[t[0].toUpperCase()+t.slice(1)],e):i.hasOwnProperty(t)?i[t]=e:i.prototype&&(i.prototype[t]=e)})};a.jsGrid={Grid:g,fields:p,setDefaults:function(t){var e;c.isPlainObject(t)?e=g.prototype:(e=p[t].prototype,t=arguments[1]||{}),c.extend(e,t)},locales:_,locale:function(t){var e=c.isPlainObject(t)?t:_[t];if(!e)throw Error("unknown locale "+t);f(jsGrid,e)},version:"2.4.1"}})(window,jQuery),((t,e)=>{function i(t){this._init(t)}i.prototype={container:"body",message:"Loading...",shading:!0,zIndex:1e3,shaderClass:"jsgrid-load-shader",loadPanelClass:"jsgrid-load-panel",_init:function(t){e.extend(!0,this,t),this._initContainer(),this._initShader(),this._initLoadPanel()},_initContainer:function(){this._container=e(this.container)},_initShader:function(){this.shading&&(this._shader=e("<div>").addClass(this.shaderClass).hide().css({position:"absolute",top:0,right:0,bottom:0,left:0,zIndex:this.zIndex}).appendTo(this._container))},_initLoadPanel:function(){this._loadPanel=e("<div>").addClass(this.loadPanelClass).text(this.message).hide().css({position:"absolute",top:"50%",left:"50%",zIndex:this.zIndex}).appendTo(this._container)},show:function(){var t=this._loadPanel.show(),e=t.outerWidth(),i=t.outerHeight();t.css({marginTop:-i/2,marginLeft:-e/2}),this._shader.show()},hide:function(){this._loadPanel.hide(),this._shader.hide()}},t.LoadIndicator=i})(jsGrid,jQuery),((t,e)=>{function i(t){this._grid=t}function n(t){this._grid=t,this._itemsCount=0}i.prototype={firstDisplayIndex:function(){var t=this._grid;return t.option("paging")?(t.option("pageIndex")-1)*t.option("pageSize"):0},lastDisplayIndex:function(){var t=this._grid,e=t.option("data").length;return t.option("paging")?Math.min(t.option("pageIndex")*t.option("pageSize"),e):e},itemsCount:function(){return this._grid.option("data").length},openPage:function(t){this._grid.refresh()},loadParams:function(){return{}},sort:function(){return this._grid._sortData(),this._grid.refresh(),e.Deferred().resolve().promise()},reset:function(){return this._grid.refresh(),e.Deferred().resolve().promise()},finishLoad:function(t){this._grid.option("data",t)},finishInsert:function(t,e){var i=this._grid;"top"===e?i.option("data").unshift(t):i.option("data").push(t),i.refresh()},finishDelete:function(t,e){var i=this._grid;i.option("data").splice(e,1),i.reset()}},n.prototype={firstDisplayIndex:function(){return 0},lastDisplayIndex:function(){return this._grid.option("data").length},itemsCount:function(){return this._itemsCount},openPage:function(t){this._grid.loadData()},loadParams:function(){var t=this._grid;return{pageIndex:t.option("pageIndex"),pageSize:t.option("pageSize")}},reset:function(){return this._grid.loadData()},sort:function(){return this._grid.loadData()},finishLoad:function(t){this._itemsCount=t.itemsCount,this._grid.option("data",t.data)},finishInsert:function(t){this._grid.search()},finishDelete:function(t,e){this._grid.search()}},t.loadStrategies={DirectLoadingStrategy:i,PageLoadingStrategy:n}})(jsGrid,jQuery),(t=>{function i(t){return null!=t}t.sortStrategies={string:function(t,e){return i(t)||i(e)?i(t)?i(e)?(""+t).localeCompare(""+e):1:-1:0},stringNaturalSort:function(t,e){return i(t)||i(e)?i(t)?i(e)?(""+t).localeCompare(""+e,void 0,{numeric:!0,sensitivity:"base"}):1:-1:0},number:function(t,e){return t-e},date:function(t,e){return t-e},numberAsString:function(t,e){return parseFloat(t)-parseFloat(e)}}})(jsGrid,jQuery),((t,a)=>{function e(t){this._init(t)}e.prototype={_init:function(t){a.extend(!0,this,t)},validate:function(i){var n=[];return a.each(this._normalizeRules(i.rules),function(t,e){e.validator(i.value,i.item,e.param)||(e=a.isFunction(e.message)?e.message(i.value,i.item):e.message,n.push(e))}),n},_normalizeRules:function(t){return a.isArray(t)||(t=[t]),a.map(t,a.proxy(function(t){return this._normalizeRule(t)},this))},_normalizeRule:function(t){if(a.isFunction(t="string"==typeof t?{validator:t}:t)&&(t={validator:t}),a.isPlainObject(t))return t=a.extend({},t),a.isFunction(t.validator)?t:this._applyNamedValidator(t,t.validator);throw Error("wrong validation config specified")},_applyNamedValidator:function(t,e){delete t.validator;var i=n[e];if(!i)throw Error('unknown validator "'+e+'"');a.isFunction(i)&&(i={validator:i});e=this.validatorsLocale&&this.validatorsLocale[e];return a.extend({},i,e,t)}},t.Validation=e;var n={required:{message:"Field is required",validator:function(t){return null!=t&&""!==t}},rangeLength:{message:"Field value length is out of the defined range",validator:function(t,e,i){return t.length>=i[0]&&t.length<=i[1]}},minLength:{message:"Field value is too short",validator:function(t,e,i){return t.length>=i}},maxLength:{message:"Field value is too long",validator:function(t,e,i){return t.length<=i}},pattern:{message:"Field value is not matching the defined pattern",validator:function(t,e,i){return(i="string"==typeof i?new RegExp("^(?:"+i+")$"):i).test(t)}},range:{message:"Field value is out of the defined range",validator:function(t,e,i){return t>=i[0]&&t<=i[1]}},min:{message:"Field value is too small",validator:function(t,e,i){return i<=t}},max:{message:"Field value is too large",validator:function(t,e,i){return t<=i}}};t.validators=n})(jsGrid,jQuery),((e,i)=>{function t(t){i.extend(!0,this,t),this.sortingFunc=this._getSortingFunc()}t.prototype={name:"",title:null,css:"",align:"",width:100,visible:!0,filtering:!0,inserting:!0,editing:!0,sorting:!0,sorter:"string",includeInDataExport:!0,headerTemplate:function(){return null==this.title?this.name:this.title},itemTemplate:function(t,e){return t},filterTemplate:function(){return""},insertTemplate:function(){return""},editTemplate:function(t,e){return this._value=t,this.itemTemplate(t,e)},filterValue:function(){return""},insertValue:function(){return""},editValue:function(){return this._value},_getSortingFunc:function(){var t=this.sorter;if(i.isFunction(t))return t;if("string"==typeof t)return e.sortStrategies[t];throw Error('wrong sorter for the field "'+this.name+'"!')}},e.Field=t})(jsGrid,jQuery);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jsxgrid",
3
- "version": "2.4.0",
3
+ "version": "2.4.1",
4
4
  "description": "Lightweight data grid jQuery plugin, with a built-in extra field set (avatars, JSON editor, select, collapsible textarea, datetime picker, row selection). A maintained fork of jsGrid.",
5
5
  "keywords": [
6
6
  "grid",
@@ -238,13 +238,29 @@
238
238
  // Static in-memory data (already present at construction time, not
239
239
  // fetched via a controller) needs an explicit sort here - normal
240
240
  // rendering never sorts on its own, only an actual sort() call does
241
- // (see DirectLoadingStrategy.sort()). Controller-backed data follows
242
- // the same rule sorting already does elsewhere: pageLoading sends
243
- // sortField/sortOrder to the server via loadData()'s filter, while
244
- // plain (non-paged) controller data is left as the controller
245
- // returns it, same as clicking a sortable header would leave it.
241
+ // (see DirectLoadingStrategy.sort()).
246
242
  if($.isArray(this.data) && this.data.length) {
247
243
  this._sortData();
244
+ return;
245
+ }
246
+
247
+ // Controller-backed, non-paged grid: data isn't loaded yet at this
248
+ // point (arrives later via finishLoad), so there's nothing to sort
249
+ // here. Without this flag the header would still show the sort
250
+ // arrow (see _createHeaderRow()) while the actual rows stay in
251
+ // whatever order the controller returned - and the first real
252
+ // click on that same header would then look like it skips
253
+ // straight past the "ascending" pass, since _setSortingParams()
254
+ // reverses the order when clicking the field _sortField already
255
+ // points at. Picked up once, in _handleOptionChange's "data" case,
256
+ // as soon as the first load actually lands.
257
+ // pageLoading grids are excluded - sorting for those already
258
+ // happens server-side, from the sortField/sortOrder this same
259
+ // init sends along in the very first loadData() filter (see
260
+ // _sortingParams()); sorting the current page again client-side on
261
+ // top of that would be redundant at best.
262
+ if(!this.pageLoading) {
263
+ this._pendingInitialSort = true;
248
264
  }
249
265
  },
250
266
 
@@ -416,6 +432,12 @@
416
432
  this.render();
417
433
  break;
418
434
  case "data":
435
+ if(this._pendingInitialSort) {
436
+ this._pendingInitialSort = false;
437
+ this._sortData();
438
+ }
439
+ this.refresh();
440
+ break;
419
441
  case "editing":
420
442
  case "heading":
421
443
  case "filtering":