Guest User

Untitled

a guest
Nov 24th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.41 KB | None | 0 0
  1. export class ctlTooltip extends my.core.Control {
  2. ctlType: string = "ctlTooltip";
  3. element: HTMLDivElement;
  4. readOnly: boolean = false;
  5. reset: Function;
  6. disabled: boolean = false;
  7. value: string;
  8. isOpen: boolean = false;
  9. cfg: ITooltip;
  10.  
  11. objectDefaults: ITooltip = {
  12. target: document.getElementsByTagName('body')[0],
  13. title: 'Tooltip',
  14. position: 'top',
  15. contentTemplate: '<div class="ctltooltip-title"></div><div class="ctltooltip-content"></div>',
  16. event: 'hover'
  17. }
  18.  
  19. TOOLTIP_CLASS: string = 'ctlTooltip';
  20. TOOLTIP_VISIBLE_CLASS: string = 'tooltipOpen';
  21.  
  22. constructor(cfg: ITooltip) {
  23. super('div');
  24.  
  25. this.config = cfg;
  26. this.attachEventListeners();
  27. }
  28.  
  29. set config(val: ITooltip) {
  30. if (val) {
  31. this.cfg = val;
  32. }
  33. }
  34.  
  35. get config(): ITooltip {
  36. return this.cfg;
  37. }
  38.  
  39. getPosition = (el: object): object => {
  40. /* 0 for X and 1 for Y */
  41. let pos = this.extractPositions(),
  42. w = this.extractWidth();
  43.  
  44. switch (this.cfg.position) {
  45. case "top":
  46. return {
  47. top: pos[1] - 50,
  48. left: pos[0],
  49. w: w[0]
  50. }
  51. case "right":
  52. return {
  53. top: el['offsetTop'],
  54. left: el['offsetLeft'] + el['offsetWidth']
  55. }
  56. case "bottom":
  57. return {
  58. top: el['offsetTop'] + el['offsetHeight'],
  59. left: el['offsetLeft']
  60. }
  61. case "left":
  62. return {
  63. top: el['offsetTop'],
  64. left: el['offsetLeft'] - el['offsetWidth']
  65. }
  66. }
  67. }
  68.  
  69. extractPositions = () => {
  70. return this.cfg.target['element']['style']['transform'].match(/(-?[0-9.]+)/g);
  71. }
  72.  
  73. extractWidth = () => {
  74. return this.cfg.target['element']['style']['width'].match('[0-9px]+');
  75. }
  76.  
  77. attachEventListeners = (): void => {
  78. let self = this,
  79. el = this.cfg.target;
  80.  
  81. switch (this.cfg.event) {
  82. case "hover":
  83. el['element'].addEventListener('mouseenter', self.render);
  84. /* add mouseleave to destroy the tooltip */
  85. el['element'].addEventListener('mouseleave', self.destroy);
  86. break;
  87. case "click":
  88. el['element'].addEventListener('click', self.render);
  89. break;
  90. }
  91. }
  92.  
  93. createElement = (): HTMLElement => {
  94. return document.createElement('div');
  95. }
  96.  
  97. render = (): void => {
  98. if (!this.isOpen) {
  99. this.show();
  100. this.isOpen = true;
  101. } else {
  102. this.destroy();
  103. }
  104. }
  105.  
  106. show = (): void => {
  107. let container = this.cfg.target['element'].parentNode,
  108. div = this.createElement(),
  109. pos = this.getPosition(this.cfg.target['element']);
  110.  
  111. div.innerHTML = this.cfg.contentTemplate;
  112. div.style.transform = 'translate(' + pos['left'] + 'px, ' + pos['top'] + 'px)';
  113. div.style.width = pos['w'];
  114.  
  115. div.classList.add(this.TOOLTIP_CLASS, this.TOOLTIP_VISIBLE_CLASS);
  116. container.appendChild(div);
  117. }
  118.  
  119. destroy = (): void => {
  120. if (this.isOpen) {
  121. let parent = this.cfg.target['element'].parentElement;
  122. if (parent.querySelector('.ctlTooltip') !== null) {
  123. parent.removeChild(document.getElementsByClassName(this.TOOLTIP_CLASS)[0]);
  124. }
  125. this.isOpen = false;
  126. }
  127. }
  128. }
  129.  
  130. .tooltipOpen {
  131. position: relative;
  132. border: 1px solid black;
  133. background-color: white;
  134. border-radius: 3px;
  135. text-align: center;
  136. }
  137.  
  138. .tooltipOpen::before {
  139. position: relative;
  140. content: "";
  141. display: block;
  142. border-right: 2px solid black;
  143. border-bottom: 2px solid black;
  144. width: 15px;
  145. height: 15px;
  146. top: 20px;
  147. left: 45px;
  148. transform: rotate(45deg);
  149. z-index: -1;
  150. }
Add Comment
Please, Sign In to add comment