modal.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*
  2. * script: modalbox
  3. * author: rekjn
  4. * description: frontend utility modal boxes
  5. */
  6. let modalbox =
  7. {
  8. __blackout: null,
  9. __active: { },
  10. displayModal: function ( id, title, content, options )
  11. {
  12. if ( modalbox.__active.hasOwnProperty ( id ) )
  13. return modalbox.__active [id];
  14. let modal =
  15. {
  16. title: title,
  17. content: content,
  18. options: options,
  19. element: modalbox.generateModal ( id, title, content, options )
  20. };
  21. modalbox.__active [id] = modal;
  22. return modal;
  23. },
  24. generateModal: function ( id, title, content, options )
  25. {
  26. // construct dom tree
  27. let modalObject = document.createElement ( 'div' );
  28. modalObject.classList.add ( 'modalObject' );
  29. modalObject.setAttribute ( 'id', id );
  30. let modalObjectTitle = document.createElement ( 'div' );
  31. modalObjectTitle.classList.add ( 'modalObjectTitle' );
  32. modalObjectTitle.innerHTML = title;
  33. let modalObjectCloseButton = document.createElement ( 'a' );
  34. modalObjectCloseButton.classList.add ( 'modalObjectClose' );
  35. modalObjectTitle.appendChild ( modalObjectCloseButton );
  36. modalObjectCloseButton.addEventListener ( 'click', function ( ev )
  37. {
  38. modalbox.closeModal ( this );
  39. } );
  40. let modalObjectContent = document.createElement ( 'div' );
  41. modalObjectContent.classList.add ( 'modalObjectContent' );
  42. modalObjectContent.innerHTML = content;
  43. let modalObjectOptions = document.createElement ( 'div' );
  44. modalObjectOptions.classList.add ( 'modalObjectOptions' );
  45. modalbox.generateModalOptions ( id, options, modalObjectOptions );
  46. modalObject.appendChild ( modalObjectTitle );
  47. modalObject.appendChild ( modalObjectContent );
  48. modalObject.appendChild ( modalObjectOptions );
  49. let blackout = modalbox.getBlackout ( );
  50. blackout.appendChild ( modalObject );
  51. return modalObject;
  52. },
  53. generateModalOptions: function ( modal_id, options, wrapper )
  54. {
  55. if ( !Array.isArray ( options ) )
  56. throw new Error ( 'invalid type passed as option array' );
  57. options.forEach ( function ( value, index )
  58. {
  59. if ( typeof value !== 'object' )
  60. throw new Error ( 'invalid option format' );
  61. let id = modal_id + '__' + index;
  62. if ( value.id ) id = value.id;
  63. let styleClasses = 'modalOption';
  64. if ( value.additionalClasses ) styleClasses += ' ' + value.additionalClasses;
  65. let optionObject = document.createElement ( 'a' );
  66. optionObject.setAttribute ( 'id', id );
  67. optionObject.setAttribute ( 'class', styleClasses );
  68. optionObject.innerHTML = value.message;
  69. if ( typeof value.handler !== 'function' )
  70. throw new Error ( 'invalid option handler format' );
  71. optionObject.addEventListener ( 'click', value.handler );
  72. wrapper.appendChild ( optionObject );
  73. } );
  74. },
  75. getBlackout: function ( )
  76. {
  77. if ( modalbox.__blackout ) return modalbox.__blackout;
  78. let blackout = document.createElement ( 'div' );
  79. blackout.setAttribute ( 'id', 'modalBlackout' );
  80. blackout.classList.add ( 'modalBlackout' );
  81. document.querySelector ( 'body' ).appendChild ( blackout );
  82. modalbox.__blackout = blackout;
  83. return modalbox.__blackout;
  84. },
  85. closeModal: function ( object )
  86. {
  87. let modalObject = object.closest ( '.modalObject' );
  88. let id = modalObject.getAttribute ( 'id' );
  89. modalObject.remove ( );
  90. delete modalbox.__active [id];
  91. if ( Object.keys ( modalbox.__active ).length === 0 )
  92. {
  93. modalbox.__blackout.remove ( );
  94. modalbox.__blackout = null;
  95. }
  96. }
  97. };