@quantlab/handsontable
Version:
Spreadsheet-like data grid editor that provides copy/paste functionality compatible with Excel/Google Docs
84 lines (65 loc) • 3.13 kB
JavaScript
;
exports.__esModule = true;
var _element = require('./../helpers/dom/element');
var _eventManager = require('./../eventManager');
var _eventManager2 = _interopRequireDefault(_eventManager);
var _src = require('./../3rdparty/walkontable/src');
var _index = require('./index');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var clonableWRAPPER = document.createElement('DIV');
clonableWRAPPER.className = 'htAutocompleteWrapper';
var clonableARROW = document.createElement('DIV');
clonableARROW.className = 'htAutocompleteArrow';
// workaround for https://github.com/handsontable/handsontable/issues/1946
// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips
clonableARROW.appendChild(document.createTextNode(String.fromCharCode(9660)));
var wrapTdContentWithWrapper = function wrapTdContentWithWrapper(TD, WRAPPER) {
WRAPPER.innerHTML = TD.innerHTML;
(0, _element.empty)(TD);
TD.appendChild(WRAPPER);
};
/**
* Autocomplete renderer
*
* @private
* @renderer AutocompleteRenderer
* @param {Object} instance Handsontable instance
* @param {Element} TD Table cell where to render
* @param {Number} row
* @param {Number} col
* @param {String|Number} prop Row object property name
* @param value Value to render (remember to escape unsafe HTML before inserting to DOM!)
* @param {Object} cellProperties Cell properites (shared by cell renderer and editor)
*/
function autocompleteRenderer(instance, TD, row, col, prop, value, cellProperties) {
var WRAPPER = clonableWRAPPER.cloneNode(true); // this is faster than createElement
var ARROW = clonableARROW.cloneNode(true); // this is faster than createElement
if (cellProperties.allowHtml) {
(0, _index.getRenderer)('html').apply(this, arguments);
} else {
(0, _index.getRenderer)('text').apply(this, arguments);
}
TD.appendChild(ARROW);
(0, _element.addClass)(TD, 'htAutocomplete');
if (!TD.firstChild) {
// http://jsperf.com/empty-node-if-needed
// otherwise empty fields appear borderless in demo/renderers.html (IE)
TD.appendChild(document.createTextNode(String.fromCharCode(160))); // workaround for https://github.com/handsontable/handsontable/issues/1946
// this is faster than innerHTML. See: https://github.com/handsontable/handsontable/wiki/JavaScript-&-DOM-performance-tips
}
if (!instance.acArrowListener) {
var eventManager = new _eventManager2.default(instance);
// not very elegant but easy and fast
instance.acArrowListener = function (event) {
if ((0, _element.hasClass)(event.target, 'htAutocompleteArrow')) {
instance.view.wt.getSetting('onCellDblClick', null, new _src.CellCoords(row, col), TD);
}
};
eventManager.addEventListener(instance.rootElement, 'mousedown', instance.acArrowListener);
// We need to unbind the listener after the table has been destroyed
instance.addHookOnce('afterDestroy', function () {
eventManager.destroy();
});
}
}
exports.default = autocompleteRenderer;