autocompleteRenderer.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { addClass, hasClass } from './../helpers/dom/element';
  2. import EventManager from './../eventManager';
  3. import { CellCoords } from './../3rdparty/walkontable/src';
  4. import { getRenderer } from './index';
  5. const clonableWRAPPER = document.createElement('DIV');
  6. clonableWRAPPER.className = 'htAutocompleteWrapper';
  7. const clonableARROW = document.createElement('DIV');
  8. clonableARROW.className = 'htAutocompleteArrow';
  9. // workaround for https://github.com/handsontable/handsontable/issues/1946
  10. // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips
  11. clonableARROW.appendChild(document.createTextNode(String.fromCharCode(9660)));
  12. /**
  13. * Autocomplete renderer
  14. *
  15. * @private
  16. * @renderer AutocompleteRenderer
  17. * @param {Object} instance Handsontable instance
  18. * @param {Element} TD Table cell where to render
  19. * @param {Number} row
  20. * @param {Number} col
  21. * @param {String|Number} prop Row object property name
  22. * @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)
  23. * @param {Object} cellProperties Cell properites (shared by cell renderer and editor)
  24. */
  25. function autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties, ...args) {
  26. const rendererType = cellProperties.allowHtml ? 'html' : 'text';
  27. const ARROW = clonableARROW.cloneNode(true); // this is faster than createElement
  28. getRenderer(rendererType).apply(this, [instance, TD, row, col, prop, value, cellProperties, ...args]);
  29. if (!TD.firstChild) { // http://jsperf.com/empty-node-if-needed
  30. // otherwise empty fields appear borderless in demo/renderers.html (IE)
  31. TD.appendChild(document.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946
  32. // this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips
  33. }
  34. TD.insertBefore(ARROW, TD.firstChild);
  35. addClass(TD, 'htAutocomplete');
  36. if (!instance.acArrowListener) {
  37. const eventManager = new EventManager(instance);
  38. // not very elegant but easy and fast
  39. instance.acArrowListener = function(event) {
  40. if (hasClass(event.target, 'htAutocompleteArrow')) {
  41. instance.view.wt.getSetting('onCellDblClick', null, new CellCoords(row, col), TD);
  42. }
  43. };
  44. eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener);
  45. // We need to unbind the listener after the table has been destroyed
  46. instance.addHookOnce('afterDestroy', () => {
  47. eventManager.destroy();
  48. });
  49. }
  50. }
  51. export default autocompleteRenderer;