123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /* Tabulator v4.6.3 (c) Oliver Folkerd */
-
- var Menu = function Menu(table) {
- this.table = table; //hold Tabulator object
- this.menuEl = false;
- this.blurEvent = this.hideMenu.bind(this);
- };
-
- Menu.prototype.initializeColumnHeader = function (column) {
- var _this = this;
-
- var headerMenuEl;
-
- if (column.definition.headerContextMenu) {
- column.getElement().addEventListener("contextmenu", function (e) {
- var menu = typeof column.definition.headerContextMenu == "function" ? column.definition.headerContextMenu(column.getComponent()) : column.definition.headerContextMenu;
-
- e.preventDefault();
-
- _this.loadMenu(e, column, menu);
- });
- }
-
- if (column.definition.headerMenu) {
-
- headerMenuEl = document.createElement("span");
- headerMenuEl.classList.add("tabulator-header-menu-button");
- headerMenuEl.innerHTML = "⋮";
-
- headerMenuEl.addEventListener("click", function (e) {
- var menu = typeof column.definition.headerMenu == "function" ? column.definition.headerMenu(column.getComponent()) : column.definition.headerMenu;
- e.stopPropagation();
- e.preventDefault();
-
- _this.loadMenu(e, column, menu);
- });
-
- column.titleElement.insertBefore(headerMenuEl, column.titleElement.firstChild);
- }
- };
-
- Menu.prototype.initializeCell = function (cell) {
- var _this2 = this;
-
- cell.getElement().addEventListener("contextmenu", function (e) {
- var menu = typeof cell.column.definition.contextMenu == "function" ? cell.column.definition.contextMenu(cell.getComponent()) : cell.column.definition.contextMenu;
-
- e.preventDefault();
-
- _this2.loadMenu(e, cell, menu);
- });
- };
-
- Menu.prototype.initializeRow = function (row) {
- var _this3 = this;
-
- row.getElement().addEventListener("contextmenu", function (e) {
- var menu = typeof _this3.table.options.rowContextMenu == "function" ? _this3.table.options.rowContextMenu(row.getComponent()) : _this3.table.options.rowContextMenu;
-
- e.preventDefault();
-
- _this3.loadMenu(e, row, menu);
- });
- };
-
- Menu.prototype.loadMenu = function (e, component, menu) {
- var _this4 = this;
-
- var docHeight = Math.max(document.body.offsetHeight, window.innerHeight);
-
- //abort if no menu set
- if (!menu || !menu.length) {
- return;
- }
-
- this.hideMenu();
-
- this.menuEl = document.createElement("div");
- this.menuEl.classList.add("tabulator-menu");
-
- menu.forEach(function (item) {
- var itemEl = document.createElement("div");
- var label = item.label;
- var disabled = item.disabled;
-
- if (item.separator) {
- itemEl.classList.add("tabulator-menu-separator");
- } else {
- itemEl.classList.add("tabulator-menu-item");
-
- if (typeof label == "function") {
- label = label(component.getComponent());
- }
-
- if (label instanceof Node) {
- itemEl.appendChild(label);
- } else {
- itemEl.innerHTML = label;
- }
-
- if (typeof disabled == "function") {
- disabled = disabled(component.getComponent());
- }
-
- if (disabled) {
- itemEl.classList.add("tabulator-menu-item-disabled");
- itemEl.addEventListener("click", function (e) {
- e.stopPropagation();
- });
- } else {
- itemEl.addEventListener("click", function (e) {
- _this4.hideMenu();
- item.action(e, component.getComponent());
- });
- }
- }
-
- _this4.menuEl.appendChild(itemEl);
- });
-
- this.menuEl.style.top = e.pageY + "px";
- this.menuEl.style.left = e.pageX + "px";
-
- document.body.addEventListener("click", this.blurEvent);
- this.table.rowManager.element.addEventListener("scroll", this.blurEvent);
-
- setTimeout(function () {
- document.body.addEventListener("contextmenu", _this4.blurEvent);
- }, 100);
-
- document.body.appendChild(this.menuEl);
-
- //move menu to start on right edge if it is too close to the edge of the screen
- if (e.pageX + this.menuEl.offsetWidth >= document.body.offsetWidth) {
- this.menuEl.style.left = "";
- this.menuEl.style.right = document.body.offsetWidth - e.pageX + "px";
- }
-
- //move menu to start on bottom edge if it is too close to the edge of the screen
- if (e.pageY + this.menuEl.offsetHeight >= docHeight) {
- this.menuEl.style.top = "";
- this.menuEl.style.bottom = docHeight - e.pageY + "px";
- }
- };
-
- Menu.prototype.hideMenu = function () {
- if (this.menuEl.parentNode) {
- this.menuEl.parentNode.removeChild(this.menuEl);
- }
-
- if (this.blurEvent) {
- document.body.removeEventListener("click", this.blurEvent);
- document.body.removeEventListener("contextmenu", this.blurEvent);
- this.table.rowManager.element.removeEventListener("scroll", this.blurEvent);
- }
- };
-
- //default accessors
- Menu.prototype.menus = {};
-
- Tabulator.prototype.registerModule("menu", Menu);
|