/src/renderers/checkboxRenderer.js

https://github.com/Gianluca68/jquery-handsontable · JavaScript · 128 lines · 92 code · 26 blank · 10 comment · 24 complexity · 38a129bc6c10ada11f7c3d7b635cd10c MD5 · raw file

  1. /**
  2. * Checkbox renderer
  3. * @param {Object} instance Handsontable instance
  4. * @param {Element} TD Table cell where to render
  5. * @param {Number} row
  6. * @param {Number} col
  7. * @param {String|Number} prop Row object property name
  8. * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)
  9. * @param {Object} cellProperties Cell properites (shared by cell renderer and editor)
  10. */
  11. (function (Handsontable) {
  12. 'use strict';
  13. var clonableINPUT = document.createElement('INPUT');
  14. clonableINPUT.className = 'htCheckboxRendererInput';
  15. clonableINPUT.type = 'checkbox';
  16. clonableINPUT.setAttribute('autocomplete', 'off');
  17. var CheckboxRenderer = function (instance, TD, row, col, prop, value, cellProperties) {
  18. if (typeof cellProperties.checkedTemplate === "undefined") {
  19. cellProperties.checkedTemplate = true;
  20. }
  21. if (typeof cellProperties.uncheckedTemplate === "undefined") {
  22. cellProperties.uncheckedTemplate = false;
  23. }
  24. instance.view.wt.wtDom.empty(TD); //TODO identify under what circumstances this line can be removed
  25. var INPUT = clonableINPUT.cloneNode(false); //this is faster than createElement
  26. if (value === cellProperties.checkedTemplate || value === Handsontable.helper.stringify(cellProperties.checkedTemplate)) {
  27. INPUT.checked = true;
  28. TD.appendChild(INPUT);
  29. }
  30. else if (value === cellProperties.uncheckedTemplate || value === Handsontable.helper.stringify(cellProperties.uncheckedTemplate)) {
  31. TD.appendChild(INPUT);
  32. }
  33. else if (value === null) { //default value
  34. INPUT.className += ' noValue';
  35. TD.appendChild(INPUT);
  36. }
  37. else {
  38. instance.view.wt.wtDom.fastInnerText(TD, '#bad value#'); //this is faster than innerHTML. See: https://github.com/warpech/jquery-handsontable/wiki/JavaScript-&-DOM-performance-tips
  39. }
  40. var $input = $(INPUT);
  41. if (cellProperties.readOnly) {
  42. $input.on('click', function (event) {
  43. event.preventDefault();
  44. });
  45. }
  46. else {
  47. $input.on('mousedown', function (event) {
  48. event.stopPropagation(); //otherwise can confuse cell mousedown handler
  49. });
  50. $input.on('mouseup', function (event) {
  51. event.stopPropagation(); //otherwise can confuse cell dblclick handler
  52. });
  53. $input.on('change', function(){
  54. if (this.checked) {
  55. instance.setDataAtRowProp(row, prop, cellProperties.checkedTemplate);
  56. }
  57. else {
  58. instance.setDataAtRowProp(row, prop, cellProperties.uncheckedTemplate);
  59. }
  60. });
  61. }
  62. if(!instance.CheckboxRenderer || !instance.CheckboxRenderer.beforeKeyDownHookBound){
  63. instance.CheckboxRenderer = {
  64. beforeKeyDownHookBound : true
  65. };
  66. instance.addHook('beforeKeyDown', function(event){
  67. if(event.keyCode == Handsontable.helper.keyCode.SPACE){
  68. var selection = instance.getSelected();
  69. var cell, checkbox, cellProperties;
  70. var selStart = {
  71. row: Math.min(selection[0], selection[2]),
  72. col: Math.min(selection[1], selection[3])
  73. };
  74. var selEnd = {
  75. row: Math.max(selection[0], selection[2]),
  76. col: Math.max(selection[1], selection[3])
  77. };
  78. for(var row = selStart.row; row <= selEnd.row; row++ ){
  79. for(var col = selEnd.col; col <= selEnd.col; col++){
  80. cell = instance.getCell(row, col);
  81. cellProperties = instance.getCellMeta(row, col);
  82. checkbox = cell.querySelectorAll('input[type=checkbox]');
  83. if(checkbox.length > 0 && !cellProperties.readOnly){
  84. if(!event.isImmediatePropagationStopped()){
  85. event.stopImmediatePropagation();
  86. event.preventDefault();
  87. }
  88. for(var i = 0, len = checkbox.length; i < len; i++){
  89. checkbox[i].checked = !checkbox[i].checked;
  90. $(checkbox[i]).trigger('change');
  91. }
  92. }
  93. }
  94. }
  95. }
  96. });
  97. }
  98. };
  99. Handsontable.CheckboxRenderer = CheckboxRenderer;
  100. Handsontable.renderers.CheckboxRenderer = CheckboxRenderer;
  101. Handsontable.renderers.registerRenderer('checkbox', CheckboxRenderer);
  102. })(Handsontable);