jsgrid.field.control.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. (function(jsGrid, $, undefined) {
  2. var Field = jsGrid.Field;
  3. function ControlField(config) {
  4. Field.call(this, config);
  5. this._configInitialized = false;
  6. }
  7. ControlField.prototype = new Field({
  8. css: "jsgrid-control-field",
  9. align: "center",
  10. width: 50,
  11. filtering: false,
  12. inserting: false,
  13. editing: false,
  14. sorting: false,
  15. buttonClass: "jsgrid-button",
  16. modeButtonClass: "jsgrid-mode-button",
  17. modeOnButtonClass: "jsgrid-mode-on-button",
  18. searchModeButtonClass: "jsgrid-search-mode-button",
  19. insertModeButtonClass: "jsgrid-insert-mode-button",
  20. editButtonClass: "jsgrid-edit-button",
  21. deleteButtonClass: "jsgrid-delete-button",
  22. searchButtonClass: "jsgrid-search-button",
  23. clearFilterButtonClass: "jsgrid-clear-filter-button",
  24. insertButtonClass: "jsgrid-insert-button",
  25. updateButtonClass: "jsgrid-update-button",
  26. cancelEditButtonClass: "jsgrid-cancel-edit-button",
  27. searchModeButtonTooltip: "Switch to searching",
  28. insertModeButtonTooltip: "Switch to inserting",
  29. editButtonTooltip: "Edit",
  30. deleteButtonTooltip: "Delete",
  31. searchButtonTooltip: "Search",
  32. clearFilterButtonTooltip: "Clear filter",
  33. insertButtonTooltip: "Insert",
  34. updateButtonTooltip: "Update",
  35. cancelEditButtonTooltip: "Cancel edit",
  36. editButton: true,
  37. deleteButton: true,
  38. clearFilterButton: true,
  39. modeSwitchButton: true,
  40. _initConfig: function() {
  41. this._hasFiltering = this._grid.filtering;
  42. this._hasInserting = this._grid.inserting;
  43. if(this._hasInserting && this.modeSwitchButton) {
  44. this._grid.inserting = false;
  45. }
  46. this._configInitialized = true;
  47. },
  48. headerTemplate: function() {
  49. if(!this._configInitialized) {
  50. this._initConfig();
  51. }
  52. var hasFiltering = this._hasFiltering;
  53. var hasInserting = this._hasInserting;
  54. if(!this.modeSwitchButton || (!hasFiltering && !hasInserting))
  55. return "";
  56. if(hasFiltering && !hasInserting)
  57. return this._createFilterSwitchButton();
  58. if(hasInserting && !hasFiltering)
  59. return this._createInsertSwitchButton();
  60. return this._createModeSwitchButton();
  61. },
  62. itemTemplate: function(value, item) {
  63. var $result = $([]);
  64. if(this.editButton) {
  65. $result = $result.add(this._createEditButton(item));
  66. }
  67. if(this.deleteButton) {
  68. $result = $result.add(this._createDeleteButton(item));
  69. }
  70. return $result;
  71. },
  72. filterTemplate: function() {
  73. var $result = this._createSearchButton();
  74. return this.clearFilterButton ? $result.add(this._createClearFilterButton()) : $result;
  75. },
  76. insertTemplate: function() {
  77. return this._createInsertButton();
  78. },
  79. editTemplate: function() {
  80. return this._createUpdateButton().add(this._createCancelEditButton());
  81. },
  82. _createFilterSwitchButton: function() {
  83. return this._createOnOffSwitchButton("filtering", this.searchModeButtonClass, true);
  84. },
  85. _createInsertSwitchButton: function() {
  86. return this._createOnOffSwitchButton("inserting", this.insertModeButtonClass, false);
  87. },
  88. _createOnOffSwitchButton: function(option, cssClass, isOnInitially) {
  89. var isOn = isOnInitially;
  90. var updateButtonState = $.proxy(function() {
  91. $button.toggleClass(this.modeOnButtonClass, isOn);
  92. }, this);
  93. var $button = this._createGridButton(this.modeButtonClass + " " + cssClass, "", function(grid) {
  94. isOn = !isOn;
  95. grid.option(option, isOn);
  96. updateButtonState();
  97. });
  98. updateButtonState();
  99. return $button;
  100. },
  101. _createModeSwitchButton: function() {
  102. var isInserting = false;
  103. var updateButtonState = $.proxy(function() {
  104. $button.attr("title", isInserting ? this.searchModeButtonTooltip : this.insertModeButtonTooltip)
  105. .toggleClass(this.insertModeButtonClass, !isInserting)
  106. .toggleClass(this.searchModeButtonClass, isInserting);
  107. }, this);
  108. var $button = this._createGridButton(this.modeButtonClass, "", function(grid) {
  109. isInserting = !isInserting;
  110. grid.option("inserting", isInserting);
  111. grid.option("filtering", !isInserting);
  112. updateButtonState();
  113. });
  114. updateButtonState();
  115. return $button;
  116. },
  117. _createEditButton: function(item) {
  118. return this._createGridButton(this.editButtonClass, this.editButtonTooltip, function(grid, e) {
  119. grid.editItem(item);
  120. e.stopPropagation();
  121. });
  122. },
  123. _createDeleteButton: function(item) {
  124. return this._createGridButton(this.deleteButtonClass, this.deleteButtonTooltip, function(grid, e) {
  125. grid.deleteItem(item);
  126. e.stopPropagation();
  127. });
  128. },
  129. _createSearchButton: function() {
  130. return this._createGridButton(this.searchButtonClass, this.searchButtonTooltip, function(grid) {
  131. grid.search();
  132. });
  133. },
  134. _createClearFilterButton: function() {
  135. return this._createGridButton(this.clearFilterButtonClass, this.clearFilterButtonTooltip, function(grid) {
  136. grid.clearFilter();
  137. });
  138. },
  139. _createInsertButton: function() {
  140. return this._createGridButton(this.insertButtonClass, this.insertButtonTooltip, function(grid) {
  141. grid.insertItem().done(function() {
  142. grid.clearInsert();
  143. });
  144. });
  145. },
  146. _createUpdateButton: function() {
  147. return this._createGridButton(this.updateButtonClass, this.updateButtonTooltip, function(grid, e) {
  148. grid.updateItem();
  149. e.stopPropagation();
  150. });
  151. },
  152. _createCancelEditButton: function() {
  153. return this._createGridButton(this.cancelEditButtonClass, this.cancelEditButtonTooltip, function(grid, e) {
  154. grid.cancelEdit();
  155. e.stopPropagation();
  156. });
  157. },
  158. _createGridButton: function(cls, tooltip, clickHandler) {
  159. var grid = this._grid;
  160. return $("<input>").addClass(this.buttonClass)
  161. .addClass(cls)
  162. .attr({
  163. type: "button",
  164. title: tooltip
  165. })
  166. .on("click", function(e) {
  167. clickHandler(grid, e);
  168. });
  169. },
  170. editValue: function() {
  171. return "";
  172. }
  173. });
  174. jsGrid.fields.control = jsGrid.ControlField = ControlField;
  175. }(jsGrid, jQuery));