define([ 'js/system/events', 'html!ui/templates/context/template', 'css!ui/templates/context/styles', 'html!ui/templates/context/templateItem' ], function ( events, template, styles, templateItem ) { return { tpl: template, modal: true, postRender: function () { this.onEvent('onContextMenu', this.onContextMenu.bind(this)); this.onEvent('onHideContextMenu', this.onMouseDown.bind(this)); this.onEvent('mouseDown', this.onMouseDown.bind(this)); $('.ui-container').on('mouseup', this.onMouseDown.bind(this)); }, onContextMenu: function (config, e) { let container = this.el.find('.list') .empty(); config.forEach(function (c, i) { let text = c.text ? c.text : c; let html = templateItem .replace('$TEXT$', text); let row = $(html) .appendTo(container); if (c.callback) row.on('click', this.onClick.bind(this, i, c.callback)); else row.addClass('no-hover'); }, this); this.el .css({ left: e.clientX, top: e.clientY }) .show(); }, onClick: function (index, callback) { this.el.hide(); callback(); }, onMouseDown: function (e) { if ((!this.el.is(':visible')) || (e.cancel) || (e.button == 2)) return; this.el.hide(); } }; });