您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

JitsiPopover.js 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /* global $ */
  2. var JitsiPopover = (function () {
  3. /**
  4. * Constructs new JitsiPopover and attaches it to the element
  5. * @param element jquery selector
  6. * @param options the options for the popover.
  7. * @constructor
  8. */
  9. function JitsiPopover(element, options)
  10. {
  11. let { skin, content, hasArrow } = options;
  12. this.options = {};
  13. this.options.skin = skin || 'white';
  14. this.options.content = content || '';
  15. this.options.hasArrow = true;
  16. if (typeof(hasArrow) !== 'undefined') {
  17. this.options.hasArrow = false;
  18. }
  19. this.elementIsHovered = false;
  20. this.popoverIsHovered = false;
  21. this.popoverShown = false;
  22. element.data("jitsi_popover", this);
  23. this.element = element;
  24. this.template = this.getTemplate();
  25. var self = this;
  26. this.element.on("mouseenter", function () {
  27. self.elementIsHovered = true;
  28. self.show();
  29. }).on("mouseleave", function () {
  30. self.elementIsHovered = false;
  31. setTimeout(function () {
  32. self.hide();
  33. }, 10);
  34. });
  35. }
  36. /**
  37. * Returns template for popover
  38. */
  39. JitsiPopover.prototype.getTemplate = function () {
  40. let arrow = '';
  41. if (this.options.hasArrow) {
  42. arrow = '<div class="arrow"></div>';
  43. }
  44. return (
  45. `<div class="jitsipopover ${this.options.skin}">
  46. ${arrow}
  47. <div class="jitsipopover__content"></div>
  48. <div class="jitsipopover__menu-padding"></div></div>`
  49. );
  50. };
  51. /**
  52. * Shows the popover
  53. */
  54. JitsiPopover.prototype.show = function () {
  55. if(!JitsiPopover.enabled)
  56. return;
  57. this.createPopover();
  58. this.popoverShown = true;
  59. };
  60. /**
  61. * Hides the popover
  62. */
  63. JitsiPopover.prototype.hide = function () {
  64. if(!this.elementIsHovered && !this.popoverIsHovered &&
  65. this.popoverShown) {
  66. this.forceHide();
  67. }
  68. };
  69. /**
  70. * Hides the popover.
  71. */
  72. JitsiPopover.prototype.forceHide = function () {
  73. $(".jitsipopover").remove();
  74. this.popoverShown = false;
  75. };
  76. /**
  77. * Creates the popover html.
  78. */
  79. JitsiPopover.prototype.createPopover = function () {
  80. $("body").append(this.template);
  81. $(".jitsipopover > .jitsipopover__content").html(this.options.content);
  82. var self = this;
  83. $(".jitsipopover").on("mouseenter", function () {
  84. self.popoverIsHovered = true;
  85. }).on("mouseleave", function () {
  86. self.popoverIsHovered = false;
  87. self.hide();
  88. });
  89. this.refreshPosition();
  90. };
  91. /**
  92. * Refreshes the position of the popover.
  93. */
  94. JitsiPopover.prototype.refreshPosition = function () {
  95. $(".jitsipopover").position({
  96. my: "bottom",
  97. at: "top",
  98. collision: "fit",
  99. of: this.element,
  100. using: function (position, elements) {
  101. var calcLeft = elements.target.left - elements.element.left +
  102. elements.target.width/2;
  103. $(".jitsipopover").css(
  104. {top: position.top, left: position.left, display: "table"});
  105. $(".jitsipopover > .arrow").css({left: calcLeft});
  106. $(".jitsipopover > .jitsipopover__menu-padding").css(
  107. {left: calcLeft - 50});
  108. }
  109. });
  110. };
  111. /**
  112. * Updates the content of popover.
  113. * @param content new content
  114. */
  115. JitsiPopover.prototype.updateContent = function (content) {
  116. this.options.content = content;
  117. if(!this.popoverShown)
  118. return;
  119. $(".jitsipopover").remove();
  120. this.createPopover();
  121. };
  122. JitsiPopover.enabled = true;
  123. return JitsiPopover;
  124. })();
  125. module.exports = JitsiPopover;