Guest User

Untitled

a guest
Dec 12th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.20 KB | None | 0 0
  1. import { isElement, extend, stringToElement } from "./lib/utils";
  2.  
  3. export default class Modal {
  4. constructor(modal = '.modal-overlay', userConfig = {}) {
  5. //If there are multiple elements create a new instance for each of them
  6. if (typeof menu === 'string') {
  7. const elements = document.querySelectorAll(modal);
  8. if (elements.length > 1) {
  9. for (let i = 1; i < elements.length; i++) {
  10. const el = elements[i];
  11. new Modal(el, userConfig);
  12. }
  13. }
  14. }
  15.  
  16. //Merge config with UserConfig
  17. const defaultConfig = {
  18. silent: false,
  19. animationDuration: 300,
  20. closeButtonClass: 'close-modal',
  21. overlayClass: 'modal-overlay',
  22. contentClass: 'modal-content',
  23. modalParent: 'body'
  24. };
  25. this.config = extend(defaultConfig, userConfig);
  26.  
  27. const modalParent = document.querySelector(this.config.modalParent);
  28. if (!isElement(modalParent)) {
  29. this._error('modalParent does not exists');
  30. return;
  31. }
  32.  
  33. this.modal = typeof modal === 'string' ? document.querySelector(modal) : modal;
  34. if (!isElement(this.modal)) {
  35. this._createModal();
  36. }
  37.  
  38. this.closeButton = this.modal.querySelector(`.${this.config.closeButtonClass}`);
  39. this.modalContent = this.modal.querySelector(`.${this.config.contentClass}`);
  40.  
  41. this.close = this.close.bind(this);
  42. this.destroy = this.destroy.bind(this);
  43.  
  44. this.locked = false;
  45.  
  46. //Let's start
  47. this.init();
  48. }
  49.  
  50. /*========================================
  51. = Public Functions =
  52. =========================================*/
  53.  
  54. /**
  55. * Initialize the plugin
  56. */
  57. init() {
  58. this._addEventListener();
  59. }
  60.  
  61. /**
  62. * hide the modal
  63. */
  64. close() {
  65. this.modal.classList.remove('active');
  66. }
  67.  
  68. /**
  69. * delete modal from DOM
  70. */
  71. destroy() {
  72. document.querySelector(this.config.modalParent).removeChild(this.modal);
  73. this.modal.classList.remove('active');
  74. }
  75.  
  76. /**
  77. *
  78. */
  79. open() {
  80. this.modal.classList.add('active');
  81. return this;
  82. }
  83.  
  84. /**
  85. *
  86. * @param content
  87. */
  88. append(content = '') {
  89. this.modalContent.innerHTML = content;
  90. return this;
  91. }
  92.  
  93. /*========================================
  94. = Private Functions =
  95. =========================================*/
  96.  
  97. /**
  98. * Create modal element and add it in the dom
  99. * @param content
  100. * @private
  101. */
  102. _createModal(content = "") {
  103. const modalString = `
  104. <div class="${this.config.overlayClass}">
  105. <div class="${this.config.closeButtonClass}">close</div>
  106. <div class="${this.config.contentClass} scroll-zone"> ${content} </div>
  107. </div>
  108. `;
  109.  
  110. this.modal = stringToElement(modalString);
  111. const modalParent = document.querySelector(this.config.modalParent);
  112. modalParent.appendChild(this.modal);
  113. }
  114.  
  115. /**
  116. *
  117. * @private
  118. */
  119. _addEventListener() {
  120. this.modal.addEventListener('click', this.destroy, false);
  121. this.closeButton.addEventListener('click', this.destroy, false);
  122. this.modalContent.addEventListener('click', (e) => {
  123. e.stopPropagation();
  124. })
  125. }
  126.  
  127. /**
  128. * @param {String} message
  129. * @private
  130. */
  131. _error(message) {
  132. if (!this.config.silent) {
  133. console.error(message);
  134. }
  135. }
  136. }
Add Comment
Please, Sign In to add comment