Home Reference Source

cables_dev/cables_ui/src/ui/elements/contextmenu.js

  1.  
  2. export default class ContextMenu
  3. {
  4. constructor()
  5. {
  6. this._element = null;
  7. this._modalBg = null;
  8. this._visible = false;
  9. }
  10.  
  11. close()
  12. {
  13. if (this._element) this._element.remove();
  14. if (this._modalBg) this._modalBg.remove();
  15. this._element = null;
  16. this._modalBg = null;
  17. this._visible = false;
  18. }
  19.  
  20. isVisible()
  21. {
  22. return this._visible;
  23. }
  24.  
  25. show(obj, parent)
  26. {
  27. if (!this._modalBg)
  28. {
  29. this._modalBg = document.createElement("div");
  30. this._modalBg.classList.add("cables_contextmenu_modal");
  31. this._modalBg.addEventListener("click",
  32. function ()
  33. {
  34. CABLES.contextMenu.close();
  35. });
  36.  
  37. document.body.appendChild(this._modalBg);
  38. }
  39.  
  40.  
  41. if (!this._element)
  42. {
  43. this._element = document.createElement("ul");
  44. this._element.classList.add("cables_contextmenu");
  45. this._element.classList.add("cablesCssUi");
  46.  
  47. document.body.appendChild(this._element);
  48. }
  49.  
  50. const rect = parent.getBoundingClientRect();
  51. if (rect.x == 0 && rect.y == 0 && rect.width == 0 && rect.height == 0) return;
  52.  
  53. if (rect.left > window.innerWidth - 200)
  54. {
  55. this._element.style.right = window.innerWidth - rect.left + "px";
  56. this._element.style.left = "initial";
  57. }
  58. else
  59. {
  60. this._element.style.right = "initial";
  61. this._element.style.left = rect.left + 5 + "px";
  62. }
  63. this._element.style.top = rect.top + 5 + "px";
  64.  
  65. if (obj && obj.items && obj.items.length > 0)
  66. {
  67. for (let i = 0; i < obj.items.length; i++)
  68. {
  69. const item = document.createElement("li");
  70. item.classList.add("cm_item");
  71. item.innerText = obj.items[i].title;
  72.  
  73. if (obj.items[i].iconClass)
  74. {
  75. const icon = document.createElement("span");
  76. icon.classList.add("cm_icon");
  77. const classes = obj.items[i].iconClass.split(" ");
  78. for (const ii in classes) icon.classList.add(classes[ii]);
  79.  
  80. icon.style.float = "left";
  81. item.appendChild(icon);
  82. }
  83.  
  84. this._element.appendChild(item);
  85. this._visible = true;
  86.  
  87. item.addEventListener("click", function ()
  88. {
  89. if (obj.refresh)
  90. {
  91. setTimeout(function ()
  92. {
  93. CABLES.contextMenu.close();
  94. obj.refresh(parent);
  95. }, 100);
  96. }
  97. else CABLES.contextMenu.close();
  98.  
  99. setTimeout(this.func.bind(this), 20);
  100. }.bind(obj.items[i]));
  101. }
  102. }
  103. }
  104. }