UNPKG

jsgrid

Version:

Lightweight data grid jQuery plugin. It supports basic grid operations like inserting, filtering, editing, deleting, paging, sorting, and validation. jsGrid is tunable and allows to customize appearance and components.

224 lines (175 loc) 7.32 kB
(function(jsGrid, $, undefined) { var Field = jsGrid.Field; function ControlField(config) { Field.call(this, config); this._configInitialized = false; } ControlField.prototype = new Field({ css: "jsgrid-control-field", align: "center", width: 50, filtering: false, inserting: false, editing: false, sorting: false, buttonClass: "jsgrid-button", modeButtonClass: "jsgrid-mode-button", modeOnButtonClass: "jsgrid-mode-on-button", searchModeButtonClass: "jsgrid-search-mode-button", insertModeButtonClass: "jsgrid-insert-mode-button", editButtonClass: "jsgrid-edit-button", deleteButtonClass: "jsgrid-delete-button", searchButtonClass: "jsgrid-search-button", clearFilterButtonClass: "jsgrid-clear-filter-button", insertButtonClass: "jsgrid-insert-button", updateButtonClass: "jsgrid-update-button", cancelEditButtonClass: "jsgrid-cancel-edit-button", searchModeButtonTooltip: "Switch to searching", insertModeButtonTooltip: "Switch to inserting", editButtonTooltip: "Edit", deleteButtonTooltip: "Delete", searchButtonTooltip: "Search", clearFilterButtonTooltip: "Clear filter", insertButtonTooltip: "Insert", updateButtonTooltip: "Update", cancelEditButtonTooltip: "Cancel edit", editButton: true, deleteButton: true, clearFilterButton: true, modeSwitchButton: true, _initConfig: function() { this._hasFiltering = this._grid.filtering; this._hasInserting = this._grid.inserting; if(this._hasInserting && this.modeSwitchButton) { this._grid.inserting = false; } this._configInitialized = true; }, headerTemplate: function() { if(!this._configInitialized) { this._initConfig(); } var hasFiltering = this._hasFiltering; var hasInserting = this._hasInserting; if(!this.modeSwitchButton || (!hasFiltering && !hasInserting)) return ""; if(hasFiltering && !hasInserting) return this._createFilterSwitchButton(); if(hasInserting && !hasFiltering) return this._createInsertSwitchButton(); return this._createModeSwitchButton(); }, itemTemplate: function(value, item) { var $result = $([]); if(this.editButton) { $result = $result.add(this._createEditButton(item)); } if(this.deleteButton) { $result = $result.add(this._createDeleteButton(item)); } return $result; }, filterTemplate: function() { var $result = this._createSearchButton(); return this.clearFilterButton ? $result.add(this._createClearFilterButton()) : $result; }, insertTemplate: function() { return this._createInsertButton(); }, editTemplate: function() { return this._createUpdateButton().add(this._createCancelEditButton()); }, _createFilterSwitchButton: function() { return this._createOnOffSwitchButton("filtering", this.searchModeButtonClass, true); }, _createInsertSwitchButton: function() { return this._createOnOffSwitchButton("inserting", this.insertModeButtonClass, false); }, _createOnOffSwitchButton: function(option, cssClass, isOnInitially) { var isOn = isOnInitially; var updateButtonState = $.proxy(function() { $button.toggleClass(this.modeOnButtonClass, isOn); }, this); var $button = this._createGridButton(this.modeButtonClass + " " + cssClass, "", function(grid) { isOn = !isOn; grid.option(option, isOn); updateButtonState(); }); updateButtonState(); return $button; }, _createModeSwitchButton: function() { var isInserting = false; var updateButtonState = $.proxy(function() { $button.attr("title", isInserting ? this.searchModeButtonTooltip : this.insertModeButtonTooltip) .toggleClass(this.insertModeButtonClass, !isInserting) .toggleClass(this.searchModeButtonClass, isInserting); }, this); var $button = this._createGridButton(this.modeButtonClass, "", function(grid) { isInserting = !isInserting; grid.option("inserting", isInserting); grid.option("filtering", !isInserting); updateButtonState(); }); updateButtonState(); return $button; }, _createEditButton: function(item) { return this._createGridButton(this.editButtonClass, this.editButtonTooltip, function(grid, e) { grid.editItem(item); e.stopPropagation(); }); }, _createDeleteButton: function(item) { return this._createGridButton(this.deleteButtonClass, this.deleteButtonTooltip, function(grid, e) { grid.deleteItem(item); e.stopPropagation(); }); }, _createSearchButton: function() { return this._createGridButton(this.searchButtonClass, this.searchButtonTooltip, function(grid) { grid.search(); }); }, _createClearFilterButton: function() { return this._createGridButton(this.clearFilterButtonClass, this.clearFilterButtonTooltip, function(grid) { grid.clearFilter(); }); }, _createInsertButton: function() { return this._createGridButton(this.insertButtonClass, this.insertButtonTooltip, function(grid) { grid.insertItem().done(function() { grid.clearInsert(); }); }); }, _createUpdateButton: function() { return this._createGridButton(this.updateButtonClass, this.updateButtonTooltip, function(grid, e) { grid.updateItem(); e.stopPropagation(); }); }, _createCancelEditButton: function() { return this._createGridButton(this.cancelEditButtonClass, this.cancelEditButtonTooltip, function(grid, e) { grid.cancelEdit(); e.stopPropagation(); }); }, _createGridButton: function(cls, tooltip, clickHandler) { var grid = this._grid; return $("<input>").addClass(this.buttonClass) .addClass(cls) .attr({ type: "button", title: tooltip }) .on("click", function(e) { clickHandler(grid, e); }); }, editValue: function() { return ""; } }); jsGrid.fields.control = jsGrid.ControlField = ControlField; }(jsGrid, jQuery));