/* * jsGrid v1.5.3 (http://js-grid.com) * (c) 2016 Artem Tabalin * Licensed under MIT (https://github.com/tabalinas/jsgrid/blob/master/LICENSE) */ ! function(a, b, c) { function d(a, c) { var d = b(a); d.data(f, this), this._container = d, this.data = [], this.fields = [], this._editingRow = null, this._sortField = null, this._sortOrder = i, this._firstDisplayingPage = 1, this._init(c), this.render() } var e = "JSGrid", f = e, g = "JSGridItem", h = "JSGridEditRow", i = "asc", j = "desc", k = "{first}", l = "{pages}", m = "{prev}", n = "{next}", o = "{last}", p = "{pageIndex}", q = "{pageCount}", r = "{itemCount}", s = "javascript:void(0);", t = function(a, c) { return b.isFunction(a) ? a.apply(c, b.makeArray(arguments).slice(2)) : a }, u = function(a) { var c = b.Deferred(); return a && a.then ? a.then(function() { c.resolve.apply(c, arguments) }, function() { c.reject.apply(c, arguments) }) : c.resolve(a), c.promise() }, v = { loadData: b.noop, insertItem: b.noop, updateItem: b.noop, deleteItem: b.noop }; d.prototype = { width: "auto", height: "auto", updateOnResize: !0, rowClass: b.noop, rowRenderer: null, rowClick: function(a) { this.editing && this.editItem(b(a.event.target).closest("tr")) }, rowDoubleClick: b.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, 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} {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: v, loadIndication: !0, loadIndicationDelay: 500, loadMessage: "Please, wait...", loadShading: !0, invalidMessage: "Invalid data entered!", invalidNotify: function(c) { var d = b.map(c.errors, function(a) { return a.message || null }); a.alert([this.invalidMessage].concat(d).join("\n")) }, onInit: b.noop, onRefreshing: b.noop, onRefreshed: b.noop, onPageChanged: b.noop, onItemDeleting: b.noop, onItemDeleted: b.noop, onItemInserting: b.noop, onItemInserted: b.noop, onItemEditing: b.noop, onItemUpdating: b.noop, onItemUpdated: b.noop, onItemInvalid: b.noop, onDataLoading: b.noop, onDataLoaded: b.noop, onOptionChanging: b.noop, onOptionChanged: b.noop, onError: b.noop, invalidClass: "jsgrid-invalid", containerClass: "jsgrid", tableClass: "jsgrid-table", gridHeaderClass: "jsgrid-grid-header", gridBodyClass: "jsgrid-grid-body", _init: function(a) { b.extend(this, a), this._initLoadStrategy(), this._initController(), this._initFields(), this._attachWindowLoadResize(), this._attachWindowResizeCallback(), this._callEventHandler(this.onInit) }, loadStrategy: function() { return this.pageLoading ? new jsGrid.loadStrategies.PageLoadingStrategy(this) : new jsGrid.loadStrategies.DirectLoadingStrategy(this) }, _initLoadStrategy: function() { this._loadStrategy = t(this.loadStrategy, this) }, _initController: function() { this._controller = b.extend({}, v, t(this.controller, this)) }, renderTemplate: function(a, b, d) { args = []; for (var e in d) args.push(d[e]); return args.unshift(a, b), a = t.apply(null, args), a === c || null === a ? "" : a }, loadIndicator: function(a) { return new jsGrid.LoadIndicator(a) }, validation: function(a) { return jsGrid.Validation && new jsGrid.Validation(a) }, _initFields: function() { var a = this; a.fields = b.map(a.fields, function(c) { if (b.isPlainObject(c)) { var d = c.type && jsGrid.fields[c.type] || jsGrid.Field; c = new d(c) } return c._grid = a, c }) }, _attachWindowLoadResize: function() { b(a).on("load", b.proxy(this._refreshSize, this)) }, _attachWindowResizeCallback: function() { this.updateOnResize && b(a).on("resize", b.proxy(this._refreshSize, this)) }, _detachWindowResizeCallback: function() { b(a).off("resize", this._refreshSize) }, option: function(a, b) { var c, d; return 1 === arguments.length ? this[a] : (c = { option: a, oldValue: this[a], newValue: b }, this._callEventHandler(this.onOptionChanging, c), this._handleOptionChange(c.option, c.newValue), d = { option: c.option, value: c.newValue }, void this._callEventHandler(this.onOptionChanged, d)) }, fieldOption: function(a, b, c) { return a = this._normalizeField(a), 2 === arguments.length ? a[b] : (a[b] = c, void this._renderGrid()) }, _handleOptionChange: function(a, b) { switch (this[a] = b, a) { 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(b); 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._clear(), this._container.removeData(f) }, render: function() { return this._renderGrid(), this.autoload ? this.loadData() : b.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 t(this.loadIndicator, this, { message: this.loadMessage, shading: this.loadShading, container: this._container }) }, _createValidation: function() { return t(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 a = this._headerRow = this._createHeaderRow(), c = this._filterRow = this._createFilterRow(), d = this._insertRow = this._createInsertRow(), e = this._headerGrid = b("
", c, "headercss", this.headerCellClass).append(this.renderTemplate(c.headerTemplate, c)).appendTo(a); this.sorting && c.sorting && e.addClass(this.sortableClass).on("click", b.proxy(function() { this.sort(d) }, this)) }), a }, _prepareCell: function(a, c, d, e) { return b(a).css("width", c.width).addClass(e || this.cellClass).addClass(d && c[d] || c.css).addClass(c.align ? "jsgrid-align-" + c.align : "") }, _createFilterRow: function() { if (b.isFunction(this.filterRowRenderer)) return b(this.renderTemplate(this.filterRowRenderer, this)); var a = b(" |
---|
", b, "filtercss").append(this.renderTemplate(b.filterTemplate, b)).appendTo(a) }), a }, _createInsertRow: function() { if (b.isFunction(this.insertRowRenderer)) return b(this.renderTemplate(this.insertRowRenderer, this)); var a = b(" |
", b, "insertcss").append(this.renderTemplate(b.insertTemplate, b)).appendTo(a) }), a }, _callEventHandler: function(a, c) { return a.call(this, b.extend(c, { grid: this })), c }, 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 = i, 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 a = this._content; if (a.empty(), !this.data.length) return a.append(this._createNoDataRow()), this; for (var b = this._loadStrategy.firstDisplayIndex(), c = this._loadStrategy.lastDisplayIndex(), d = b; c > d; d++) { var e = this.data[d]; a.append(this._createRow(e, d)) } }, _createNoDataRow: function() { var a = 0; return this._eachField(function() { a++ }), b(" |
").addClass(this.cellClass).attr("colspan", a).append(this.renderTemplate(this.noDataContent, this))) }, _createRow: function(a, c) { var d; return b.isFunction(this.rowRenderer) ? d = this.renderTemplate(this.rowRenderer, this, { item: a, itemIndex: c }) : (d = b(" |
").append(this.renderTemplate(c.itemTemplate || e, c, f)), this._prepareCell(d, c) }, _getItemFieldValue: function(a, b) { for (var c = b.name.split("."), d = a[c.shift()]; d && c.length;) d = d[c.shift()]; return d }, _setItemFieldValue: function(a, b, c) { for (var d = b.name.split("."), e = a, f = d[0]; e && d.length;) a = e, f = d.shift(), e = a[f]; if (!e) for (; d.length;) a = a[f] = {}, f = d.shift(); a[f] = c }, sort: function(a, c) { return b.isPlainObject(a) && (c = a.order, a = a.field), this._clearSortingCss(), this._setSortingParams(a, c), this._setSortingCss(), this._loadStrategy.sort() }, _clearSortingCss: function() { this._headerRow.find("th").removeClass(this.sortAscClass).removeClass(this.sortDescClass) }, _setSortingParams: function(a, b) { a = this._normalizeField(a), b = b || (this._sortField === a ? this._reversedSortOrder(this._sortOrder) : i), this._sortField = a, this._sortOrder = b }, _normalizeField: function(a) { return b.isNumeric(a) ? this.fields[a] : "string" == typeof a ? b.grep(this.fields, function(b) { return b.name === a })[0] : a }, _reversedSortOrder: function(a) { return a === i ? j : i }, _setSortingCss: function() { var a = this._visibleFieldIndex(this._sortField); this._headerRow.find("th").eq(a).addClass(this._sortOrder === i ? this.sortAscClass : this.sortDescClass) }, _visibleFieldIndex: function(a) { return b.inArray(a, b.grep(this.fields, function(a) { return a.visible })) }, _sortData: function() { var a = this._sortFactor(), b = this._sortField; b && this.data.sort(function(c, d) { return a * b.sortingFunc(c[b.name], d[b.name]) }) }, _sortFactor: function() { return this._sortOrder === i ? 1 : -1 }, _itemsCount: function() { return this._loadStrategy.itemsCount() }, _pagesCount: function() { var a = this._itemsCount(), b = this.pageSize; return Math.floor(a / b) + (a % b ? 1 : 0) }, _refreshPager: function() { var a = this._pagerContainer; a.empty(), this.paging && a.append(this._createPager()); var b = this.paging && this._pagesCount() > 1; a.toggle(b) }, _createPager: function() { var a; return a = b.isFunction(this.pagerRenderer) ? b(this.pagerRenderer({ pageIndex: this.pageIndex, pageCount: this._pagesCount() })) : b(" |