jsxgrid 2.0.0

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.
Files changed (83) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +2329 -0
  3. package/dist/fields/jsgrid.field.XDateTimeField.min.js +6 -0
  4. package/dist/fields/jsgrid.field.XRowSelectField.min.js +6 -0
  5. package/dist/fields/jsgrid.field.Xcheckbox.min.js +6 -0
  6. package/dist/fields/jsgrid.field.XimgField.min.js +6 -0
  7. package/dist/fields/jsgrid.field.Xjsoneditor.min.js +6 -0
  8. package/dist/fields/jsgrid.field.Xselect.min.js +6 -0
  9. package/dist/fields/jsgrid.field.Xtextarea.min.js +6 -0
  10. package/dist/fields/lib/jsGridSummaryPlugin.min.js +6 -0
  11. package/dist/fields/lib/jsgrid.popup.basic.min.js +6 -0
  12. package/dist/i18n/jsgrid-Ko.js +46 -0
  13. package/dist/i18n/jsgrid-cs.js +46 -0
  14. package/dist/i18n/jsgrid-de.js +46 -0
  15. package/dist/i18n/jsgrid-el.js +46 -0
  16. package/dist/i18n/jsgrid-es.js +46 -0
  17. package/dist/i18n/jsgrid-fa.js +46 -0
  18. package/dist/i18n/jsgrid-fr.js +47 -0
  19. package/dist/i18n/jsgrid-he.js +46 -0
  20. package/dist/i18n/jsgrid-it.js +47 -0
  21. package/dist/i18n/jsgrid-ja.js +46 -0
  22. package/dist/i18n/jsgrid-ka.js +46 -0
  23. package/dist/i18n/jsgrid-lt.js +47 -0
  24. package/dist/i18n/jsgrid-pl.js +62 -0
  25. package/dist/i18n/jsgrid-pt-br.js +46 -0
  26. package/dist/i18n/jsgrid-pt.js +46 -0
  27. package/dist/i18n/jsgrid-ru.js +47 -0
  28. package/dist/i18n/jsgrid-tr.js +47 -0
  29. package/dist/i18n/jsgrid-zh-cn.js +46 -0
  30. package/dist/i18n/jsgrid-zh-tw.js +46 -0
  31. package/dist/icons-2x.png +0 -0
  32. package/dist/icons.png +0 -0
  33. package/dist/jsxgrid-fields.js +606 -0
  34. package/dist/jsxgrid-fields.min.js +6 -0
  35. package/dist/jsxgrid-theme.css +258 -0
  36. package/dist/jsxgrid-theme.min.css +1 -0
  37. package/dist/jsxgrid-xfields.js +979 -0
  38. package/dist/jsxgrid-xfields.min.js +6 -0
  39. package/dist/jsxgrid.css +126 -0
  40. package/dist/jsxgrid.js +2137 -0
  41. package/dist/jsxgrid.min.css +1 -0
  42. package/dist/jsxgrid.min.js +6 -0
  43. package/package.json +57 -0
  44. package/src/fields/jsgrid.field.XDateTimeField.js +122 -0
  45. package/src/fields/jsgrid.field.XRowSelectField.js +62 -0
  46. package/src/fields/jsgrid.field.Xcheckbox.js +108 -0
  47. package/src/fields/jsgrid.field.XimgField.js +99 -0
  48. package/src/fields/jsgrid.field.Xjsoneditor.js +165 -0
  49. package/src/fields/jsgrid.field.Xselect.js +176 -0
  50. package/src/fields/jsgrid.field.Xtextarea.js +97 -0
  51. package/src/fields/jsgrid.field.checkbox.js +97 -0
  52. package/src/fields/jsgrid.field.control.js +224 -0
  53. package/src/fields/jsgrid.field.number.js +41 -0
  54. package/src/fields/jsgrid.field.select.js +130 -0
  55. package/src/fields/jsgrid.field.text.js +69 -0
  56. package/src/fields/jsgrid.field.textarea.js +34 -0
  57. package/src/i18n/Ko.js +46 -0
  58. package/src/i18n/cs.js +46 -0
  59. package/src/i18n/de.js +46 -0
  60. package/src/i18n/el.js +46 -0
  61. package/src/i18n/es.js +46 -0
  62. package/src/i18n/fa.js +46 -0
  63. package/src/i18n/fr.js +47 -0
  64. package/src/i18n/he.js +46 -0
  65. package/src/i18n/it.js +47 -0
  66. package/src/i18n/ja.js +46 -0
  67. package/src/i18n/ka.js +46 -0
  68. package/src/i18n/lt.js +47 -0
  69. package/src/i18n/pl.js +62 -0
  70. package/src/i18n/pt-br.js +46 -0
  71. package/src/i18n/pt.js +46 -0
  72. package/src/i18n/ru.js +47 -0
  73. package/src/i18n/tr.js +47 -0
  74. package/src/i18n/zh-cn.js +46 -0
  75. package/src/i18n/zh-tw.js +46 -0
  76. package/src/jsgrid.core.js +1655 -0
  77. package/src/jsgrid.field.js +74 -0
  78. package/src/jsgrid.load-indicator.js +82 -0
  79. package/src/jsgrid.load-strategies.js +131 -0
  80. package/src/jsgrid.sort-strategies.js +49 -0
  81. package/src/jsgrid.validation.js +135 -0
  82. package/src/lib/jsGridSummaryPlugin.js +37 -0
  83. package/src/lib/jsgrid.popup.basic.js +107 -0
@@ -0,0 +1 @@
1
+ .jsgrid{position:relative;overflow:hidden;font-size:1em}.jsgrid,.jsgrid *,.jsgrid :after,.jsgrid :before{box-sizing:border-box}.jsgrid input,.jsgrid select,.jsgrid textarea{font-size:1em}.jsgrid-grid-header{overflow-x:hidden;overflow-y:scroll;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.jsgrid-grid-body{overflow-x:auto;overflow-y:scroll;-webkit-overflow-scrolling:touch}.jsgrid-table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0}.jsgrid-cell{padding:.5em .5em}.jsgrid-cell,.jsgrid-header-cell{box-sizing:border-box}.jsgrid-align-left{text-align:left}.jsgrid-align-center,.jsgrid-align-center input,.jsgrid-align-center select,.jsgrid-align-center textarea{text-align:center}.jsgrid-align-right,.jsgrid-align-right input,.jsgrid-align-right select,.jsgrid-align-right textarea{text-align:right}.jsgrid-header-cell{padding:.5em .5em}.jsgrid-edit-row input,.jsgrid-edit-row select,.jsgrid-edit-row textarea,.jsgrid-filter-row input,.jsgrid-filter-row select,.jsgrid-filter-row textarea,.jsgrid-insert-row input,.jsgrid-insert-row select,.jsgrid-insert-row textarea{width:100%;padding:.3em .5em}.jsgrid-edit-row input[type=checkbox],.jsgrid-filter-row input[type=checkbox],.jsgrid-insert-row input[type=checkbox]{width:auto}.jsgrid-selected-row .jsgrid-cell{cursor:pointer}.jsgrid-nodata-row .jsgrid-cell{padding:.5em 0;text-align:center}.jsgrid-header-sort{cursor:pointer}.jsgrid-pager{padding:.5em 0}.jsgrid-pager-nav-button{padding:.2em .6em}.jsgrid-pager-nav-inactive-button{display:none;pointer-events:none}.jsgrid-pager-page{padding:.2em .6em}
@@ -0,0 +1,6 @@
1
+ /*
2
+ * jsxgrid v2.0.0 (https://github.com/rok9ru/jsxgrid#readme)
3
+ * (c) 2026 Mikhail Kremza
4
+ * Licensed under MIT
5
+ */
6
+ ((e,c,u)=>{function a(t,e){return c.isFunction(t)?t.apply(e,c.makeArray(arguments).slice(2)):t}var n,s="JSGrid",o="JSGridItem",i="JSGridEditRow",r=[],d=0,l="asc",t={loadData:c.noop,insertItem:c.noop,updateItem:c.noop,deleteItem:c.noop};function h(t,e){t=c(t);0==r.length?(this._id=d,d++):this._id=r.pop(),t.data(s,this),this._container=t,this.data=[],this.fields=[],this._editingRow=null,this._sortField=null,this._sortOrder=l,this._firstDisplayingPage=1,this._init(e),this.render()}h.prototype={width:"auto",height:"auto",updateOnResize:!0,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",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});e.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){c.extend(this,t),this._initLoadStrategy(),this._initController(),this._initFields(),this._attachWindowLoadResize(),this._attachWindowResizeCallback(),this._callEventHandler(this.onInit)},loadStrategy:function(){return new(this.pageLoading?jsGrid.loadStrategies.PageLoadingStrategy:jsGrid.loadStrategies.DirectLoadingStrategy)(this)},_initLoadStrategy:function(){this._loadStrategy=a(this.loadStrategy,this)},_initController:function(){this._controller=c.extend({},t,a(this.controller,this))},renderTemplate:function(t,e,i){var n,r=[];for(n in i)r.push(i[n]);return r.unshift(t,e),(t=a.apply(null,r))===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 e=this;e.fields=c.map(e.fields,function(t){return(t=c.isPlainObject(t)?new(t.type&&jsGrid.fields[t.type]||jsGrid.Field)(t):t)._grid=e,t})},_attachWindowLoadResize:function(){c(e).on("load.table-"+this._id,c.proxy(this._refreshSize,this))},_attachWindowResizeCallback:function(){this.updateOnResize&&c(e).on("resize.table-"+this._id,c.proxy(this._refreshSize,this))},_detachWindowLoadResize:function(){c(e).off("load.table-"+this._id)},_detachWindowResizeCallback:function(){c(e).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(),r.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 a(this.loadIndicator,this,{message:this.loadMessage,shading:this.loadShading,container:this._container})},_createValidation:function(){return a(this.validation,this)},_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))}),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._firstDisplayingPage=1,this._setPage(1)},_resetSorting:function(){this._sortField=null,this._sortOrder=l,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 r=this.data[n];t.append(this._createRow(r,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(a(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("."),r=t,a=n[0];r&&n.length;)r=(t=r)[a=n.shift()];if(!r)for(;n.length;)t=t[a]={},a=n.shift();t[a]=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):l),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===l?"desc":l},_setSortingCss:function(){var t=this._visibleFieldIndex(this._sortField);this._headerRow.find("th").eq(t).addClass(this._sortOrder===l?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(),r=this._sortField;r&&(i=this).data.sort(function(t,e){t=i._getItemFieldValue(t,r),e=i._getItemFieldValue(e,r);return n*r.sortingFunc(t,e)})},_sortFactor:function(){return this._sortOrder===l?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(),r=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=r),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 r=0,a=i;r<e&&a<=t;r++,a++)n.push(a===this.pageIndex?this._createPagerCurrentPage():this._createPagerPage(a));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){var e=this._firstDisplayingPage,i=this.pageButtonCount;(this.pageIndex=t)<e&&(this._firstDisplayingPage=t),e+i-1<t&&(this._firstDisplayingPage=t-i+1),this._callEventHandler(this.onPageChanged,{pageIndex:t})},_controllerCall:function(t,e,i,n){if(i)return c.Deferred().reject().promise();this._showLoading();var r,i=this._controller;if(i&&i[t])return i=i[t](e),r=c.Deferred(),i&&i.then?i.then(function(){r.resolve.apply(r,arguments)},function(){r.reject.apply(r,arguments)}):r.resolve(i),r.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,r=[];if(e){for(var a=this.fields.length,s={},o=0;o<a;o++){var d=this.fields[o];"includeInDataExport"in d&&!0===d.includeInDataExport&&(s[o]=d.title||d.name)}e=this._itemToCsv(s,{},t);r.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),r.push(c))}return r.join("")},_itemToCsv:function(a,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(a).forEach(function(t,e){var i="";if(0<s.length){var n,r=s[e];if("includeInDataExport"in r){if(!r.includeInDataExport)return;i="select"===r.type?(n=l(a,r),(c.grep(r.items,function(t,e){return t[r.valueField]===n})[0]||"")[r.textField]):l(a,r)}else i=l(a,r);d.hasOwnProperty(r.name)&&(i=d[r.name](i))}else i=a[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,r=[],a={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},a)),this._setCellValidity(n.children().eq(this._visibleFieldIndex(e)),t),t.length&&r.push.apply(r,c.map(t,function(t){return{field:e,message:t}})))}),!r.length||(t=c.extend({errors:r},a),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),r=this._itemIndex(n),a=c.extend(!0,{},n,t),t=this._callEventHandler(this.onItemUpdating,{row:i,item:a,itemIndex:r,previousItem:n});return this._controllerCall("updateItem",a,t.cancel,function(t){var e=c.extend(!0,{},n),t=(a=t||c.extend(!0,n,a),this._finishUpdate(i,a,r));this._callEventHandler(this.onItemUpdated,{row:t,item:a,itemIndex:r,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||e.confirm(a(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 r=c.makeArray(arguments).slice(1),a=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,r))!==u&&t!==i)return a=t,!1}else i._detachWindowResizeCallback(),i._init(n),i.render();else new h(e,n)}),a};var g={},p={},_=function(i,t){c.each(t,function(t,e){c.isPlainObject(e)?_(i[t]||i[t[0].toUpperCase()+t.slice(1)],e):i.hasOwnProperty(t)?i[t]=e:i.prototype[t]=e})};e.jsGrid={Grid:h,fields:g,setDefaults:function(t){var e;c.isPlainObject(t)?e=h.prototype:(e=g[t].prototype,t=arguments[1]||{}),c.extend(e,t)},locales:p,locale:function(t){var e=c.isPlainObject(t)?t:p[t];if(!e)throw Error("unknown locale "+t);_(jsGrid,e)},version:"2.0.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,r)=>{function e(t){this._init(t)}e.prototype={_init:function(t){r.extend(!0,this,t)},validate:function(i){var n=[];return r.each(this._normalizeRules(i.rules),function(t,e){e.validator(i.value,i.item,e.param)||(e=r.isFunction(e.message)?e.message(i.value,i.item):e.message,n.push(e))}),n},_normalizeRules:function(t){return r.isArray(t)||(t=[t]),r.map(t,r.proxy(function(t){return this._normalizeRule(t)},this))},_normalizeRule:function(t){if(r.isFunction(t="string"==typeof t?{validator:t}:t)&&(t={validator:t}),r.isPlainObject(t))return t=r.extend({},t),r.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)return r.isFunction(i)&&(i={validator:i}),r.extend({},i,t);throw Error('unknown validator "'+e+'"')}},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 ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "jsxgrid",
3
+ "version": "2.0.0",
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
+ "keywords": [
6
+ "grid",
7
+ "jquery",
8
+ "plugin",
9
+ "jsgrid"
10
+ ],
11
+ "homepage": "https://github.com/rok9ru/jsxgrid#readme",
12
+ "author": "Mikhail Kremza",
13
+ "contributors": [
14
+ {
15
+ "name": "Artem Tabalin",
16
+ "url": "https://github.com/tabalinas"
17
+ }
18
+ ],
19
+ "license": "MIT",
20
+ "main": "dist/jsxgrid.js",
21
+ "directories": {
22
+ "test": "tests"
23
+ },
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/rok9ru/jsxgrid.git"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/rok9ru/jsxgrid/issues"
30
+ },
31
+ "scripts": {
32
+ "build": "grunt",
33
+ "test": "grunt test",
34
+ "prepublishOnly": "npm run build"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "src"
39
+ ],
40
+ "peerDependencies": {
41
+ "jquery": ">=3.0.0"
42
+ },
43
+ "optionalDependencies": {
44
+ "jsoneditor": "^10.0.0",
45
+ "select2": "4.1.0-rc.0"
46
+ },
47
+ "devDependencies": {
48
+ "grunt": "^1.6.2",
49
+ "grunt-cli": "^1.5.0",
50
+ "grunt-contrib-clean": "^2.0.1",
51
+ "grunt-contrib-concat": "~2.1.0",
52
+ "grunt-contrib-copy": "^1.0.0",
53
+ "grunt-contrib-cssmin": "^5.0.0",
54
+ "grunt-contrib-qunit": "^10.2.0",
55
+ "grunt-contrib-uglify": "^5.2.2"
56
+ }
57
+ }
@@ -0,0 +1,122 @@
1
+ (function(jsGrid, $, undefined) {
2
+ var XDateTimeField = function (config) {
3
+ jsGrid.Field.call(this, config);
4
+ };
5
+ XDateTimeField.prototype = new jsGrid.Field({
6
+
7
+ css: "date-field", // redefine general property 'css'
8
+ align: "center", // redefine general property 'align'
9
+ datePickerType: "datetime-local",
10
+ dateRange: false,
11
+ defaultSelected: null,//value (or {from, to} when dateRange is true) to preset the filter with, applied once on first filter render then reset
12
+ sorter: function (date1, date2) {
13
+ return new Date(date1) - new Date(date2);
14
+ },
15
+
16
+ filterTemplate: function () {
17
+ if (!this.filtering)
18
+ return "";
19
+
20
+
21
+ var grid = this._grid;
22
+ var $result = $();
23
+ if(this.dateRange){
24
+ var $container = $("<div class='jsgrid-date-range-wrapper'>");
25
+
26
+ var $startInput = $("<input>", {
27
+ "class": "jsgrid-date-picker jsgrid-date-start",
28
+ "type": this.datePickerType,
29
+ "title": "Period date start"
30
+ });
31
+
32
+ var $endInput = $("<input>", {
33
+ "class": "jsgrid-date-picker jsgrid-date-end",
34
+ "type": this.datePickerType,
35
+ "title": "Period date end"
36
+ });
37
+
38
+ $container.val = function () {
39
+ var fromVal = $startInput.val();
40
+ var toVal = $endInput.val();
41
+
42
+ return {
43
+ from: fromVal,
44
+ to: toVal
45
+ };
46
+ };
47
+
48
+ $result = this.filterControl = $container.append($startInput).append($endInput);
49
+
50
+ if (this.defaultSelected !== null) {
51
+ var range = this.defaultSelected || {};
52
+ $startInput.val(range.from || '');
53
+ $endInput.val(range.to || '');
54
+ this.defaultSelected = null;
55
+ }
56
+
57
+ if (this.autosearch) {
58
+ $result.on("change", ".jsgrid-date-picker", function (e) {
59
+ grid.search();
60
+ });
61
+ }
62
+ }else{
63
+ $result = this.filterControl = this._createPicker();
64
+
65
+ if (this.defaultSelected !== null) {
66
+ $result.val(this.defaultSelected);
67
+ this.defaultSelected = null;
68
+ }
69
+
70
+ if (this.autosearch) {
71
+ $result.on("change", function (e) {
72
+ grid.search();
73
+ });
74
+ }
75
+ }
76
+
77
+ return $result;
78
+ },
79
+
80
+ filterValue: function () {
81
+ return this.filterControl.val();
82
+ },
83
+
84
+ itemTemplate: function (value) {
85
+ if (!value) {
86
+ return '';
87
+ }
88
+ var options = this.options || {
89
+ weekday: 'short',
90
+ year: 'numeric',
91
+ month: 'short',
92
+ day: 'numeric',
93
+ hour: '2-digit',
94
+ minute: '2-digit',
95
+ second: '2-digit'
96
+ };
97
+ return new Date(value.replace(' ', 'T')).toLocaleDateString(undefined, options);
98
+ },
99
+
100
+ insertTemplate: function () {
101
+ return this._insertPicker = this._createPicker();
102
+ },
103
+
104
+ editTemplate: function (value) {
105
+ return this._editPicker = this._createPicker().val(value);
106
+ },
107
+
108
+ insertValue: function () {
109
+ return this._insertPicker.val();
110
+ },
111
+
112
+ editValue: function () {
113
+ return this._editPicker.val();
114
+ },
115
+ _createPicker: function () {
116
+ return $("<input class='date-picker'>").attr("type", this.datePickerType);
117
+ }
118
+ });
119
+
120
+
121
+ jsGrid.fields.XDateTimeField = XDateTimeField;
122
+ }(jsGrid, jQuery));
@@ -0,0 +1,62 @@
1
+ (function(jsGrid, $, undefined) {
2
+
3
+ var XRowSelectField = function (config) {
4
+ this.selectedItems = [];
5
+ // Must be generated per instance: the prototype literal is shared by
6
+ // every XRowSelectField, so a uid set there would be identical for
7
+ // all of them, letting unselectAll() clobber checkboxes from other
8
+ // grids/fields sharing the page.
9
+ this.uid = Date.now().toString(36) + Math.random().toString(36).substring(2);
10
+ jsGrid.Field.call(this, config);
11
+ };
12
+
13
+ XRowSelectField.prototype = new jsGrid.Field({
14
+ filtering: false,
15
+ deleteItemByItem: false,
16
+ buttonText: "",
17
+ selectedItemsAction: function (selectedItems) {
18
+
19
+ },
20
+ unselectAll: function () {
21
+ this.selectedItems = [];
22
+ this._grid._container.find('[data-uid=\'' + this.uid + '\'] ').prop('checked', false);
23
+ },
24
+ headerTemplate: function () {
25
+ if (!this.buttonText) {
26
+ return '';
27
+ }
28
+ var that = this;
29
+ return $("<button>").attr("type", "button").text(that.buttonText)
30
+ .on("click", function (event) {
31
+ that.selectedItemsAction(that.selectedItems);
32
+ event.stopPropagation();
33
+ });
34
+ },
35
+ itemTemplate: function (_, item) {
36
+ var that = this;
37
+ return $("<input data-uid='" + that.uid + "' type='checkbox'>")
38
+ .prop("checked", $.inArray(item, that.selectedItems) > -1)
39
+ .on("change", function () {
40
+ $(this).is(":checked") ? that.selectItem(item) : that.unselectItem(item);
41
+ }).click(function (event) {
42
+ event.stopPropagation();
43
+ });
44
+ },
45
+ editTemplate: function () {
46
+ return '';
47
+ },
48
+ align: "center",
49
+
50
+ selectItem: function (item) {
51
+ this.selectedItems.push(item);
52
+ },
53
+ unselectItem: function (item) {
54
+ this.selectedItems = $.grep(this.selectedItems, function (i) {
55
+ return i !== item;
56
+ });
57
+ }
58
+ });
59
+
60
+ jsGrid.fields.XRowSelectField = XRowSelectField;
61
+
62
+ }(jsGrid, jQuery));
@@ -0,0 +1,108 @@
1
+ (function(jsGrid, $, undefined) {
2
+
3
+ // Standalone: does not extend jsGrid.CheckboxField, only jsGrid.Field.
4
+ // Same tri-state (checked/unchecked/indeterminate) filter behavior as
5
+ // CheckboxField, reimplemented here directly instead of inherited.
6
+
7
+ var Field = jsGrid.Field;
8
+
9
+ var Xcheckbox = function (config) {
10
+ Field.call(this, config);
11
+ };
12
+
13
+ Xcheckbox.prototype = new Field({
14
+ sorter: "number",
15
+ align: "center",
16
+ autosearch: true,
17
+ defaultSelected: null,//value (0/1/true/false) to preset the filter checkbox with, applied once on first filter render then reset
18
+
19
+ filterTemplate: function () {
20
+ if (!this.filtering)
21
+ return "";
22
+
23
+ var grid = this._grid,
24
+ $result = this.filterControl = this._createCheckbox();
25
+
26
+ $result.prop({
27
+ readOnly: true,
28
+ indeterminate: true
29
+ });
30
+
31
+ $result.on("click", function () {
32
+ var $cb = $(this);
33
+
34
+ if ($cb.prop("readOnly")) {
35
+ $cb.prop({
36
+ checked: false,
37
+ readOnly: false
38
+ });
39
+ } else if (!$cb.prop("checked")) {
40
+ $cb.prop({
41
+ readOnly: true,
42
+ indeterminate: true
43
+ });
44
+ }
45
+ });
46
+
47
+ if (this.autosearch) {
48
+ $result.on("click", function () {
49
+ grid.search();
50
+ });
51
+ }
52
+
53
+ if (this.defaultSelected !== null) {
54
+ $result.prop({
55
+ checked: !!this.defaultSelected,
56
+ indeterminate: false,
57
+ readOnly: false
58
+ });
59
+ this.defaultSelected = null;
60
+ }
61
+
62
+ return $result;
63
+ },
64
+
65
+ filterValue: function () {
66
+ return this.filterControl.get(0).indeterminate
67
+ ? undefined
68
+ : (this.filterControl.is(":checked") ? 1 : 0);
69
+ },
70
+
71
+ insertTemplate: function () {
72
+ if (!this.inserting)
73
+ return "";
74
+
75
+ return this.insertControl = this._createCheckbox();
76
+ },
77
+
78
+ insertValue: function () {
79
+ return +(this.insertControl.is(":checked"));
80
+ },
81
+
82
+ editValue: function () {
83
+ return +(this.editControl.is(":checked"));
84
+ },
85
+ itemTemplate: function (value) {
86
+ return this._createCheckbox().prop({
87
+ checked: +value,
88
+ disabled: true
89
+ });
90
+ },
91
+ editTemplate: function (value) {
92
+ if (!this.editing)
93
+ return this.itemTemplate.apply(this, arguments);
94
+
95
+ var $result = this.editControl = this._createCheckbox();
96
+ $result.prop("checked", +value);
97
+ return $result;
98
+ },
99
+
100
+ _createCheckbox: function () {
101
+ return $("<input>").attr("type", "checkbox");
102
+ }
103
+
104
+ });
105
+
106
+ jsGrid.fields.Xcheckbox = Xcheckbox;
107
+
108
+ }(jsGrid, jQuery));
@@ -0,0 +1,99 @@
1
+ (function(jsGrid, $, undefined) {
2
+
3
+ // Standalone: does not extend jsGrid.TextField, only jsGrid.Field.
4
+
5
+ var Field = jsGrid.Field;
6
+
7
+ var XimgField = function (config) {
8
+ Field.call(this, config);
9
+ };
10
+
11
+ XimgField.prototype = new Field({
12
+ autosearch: true,
13
+ readOnly: false,
14
+ fm_callback: null,
15
+ editButtonText: 'Open FM',
16
+ defaultSelected: null,//value to preset the filter input with, applied once on first filter render then reset
17
+
18
+ filterTemplate: function () {
19
+ if (!this.filtering)
20
+ return "";
21
+
22
+ var grid = this._grid,
23
+ $result = this.filterControl = this._createTextBox();
24
+
25
+ if (this.autosearch) {
26
+ $result.on("keypress", function (e) {
27
+ if (e.which === 13) {
28
+ grid.search();
29
+ e.preventDefault();
30
+ }
31
+ });
32
+ }
33
+
34
+ if (this.defaultSelected !== null) {
35
+ $result.val(this.defaultSelected);
36
+ this.defaultSelected = null;
37
+ }
38
+
39
+ return $result;
40
+ },
41
+
42
+ filterValue: function () {
43
+ return this.filterControl.val();
44
+ },
45
+
46
+ itemTemplate: function (value) {
47
+ var img = $('<img class="jsgrid-img" src="">');
48
+ img.attr("src", value || '');
49
+ img.css('max-height', '50px');
50
+ img.css('max-width', '50px');
51
+
52
+ return img;
53
+ }
54
+ , editTemplate: function (value) {
55
+ if (!this.editing)
56
+ return this.itemTemplate.apply(this, arguments);
57
+ var fm = this.fm_callback;
58
+
59
+ var editControl = this.editControl = $('<input type="text">').val(value || '');
60
+ if (fm) {
61
+ return $('<button class="jsgrid-imgField-button">' + this.editButtonText + '</button>').click(function () {
62
+ fm(editControl);
63
+ });
64
+ }
65
+ return editControl;
66
+
67
+ },
68
+ insertTemplate: function () {
69
+ if (!this.inserting)
70
+ return "";
71
+ var fm = this.fm_callback;
72
+
73
+ var insertControl = this.insertControl = $('<input type="text">');
74
+ if (typeof fm == 'function') {
75
+ return $('<button class="jsgrid-imgField-button">'+this.editButtonText+'</button>').click(function () {
76
+ fm(insertControl);
77
+ });
78
+ }
79
+ return insertControl;
80
+ },
81
+
82
+ insertValue: function () {
83
+ return this.insertControl.val();
84
+ },
85
+
86
+ editValue: function () {
87
+ return this.editControl.val();
88
+ },
89
+
90
+ _createTextBox: function () {
91
+ return $("<input>").attr("type", "text")
92
+ .prop("readonly", !!this.readOnly);
93
+ }
94
+
95
+ });
96
+
97
+ jsGrid.fields.XimgField = XimgField;
98
+
99
+ }(jsGrid, jQuery));