PageRenderTime 29ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/backend/transparent/lib/widgster/widgster.js

https://gitlab.com/kaouech/theme
JavaScript | 289 lines | 204 code | 65 blank | 20 comment | 31 complexity | dd4477809b87e3206b2f38315da1e296 MD5 | raw file
  1. /**
  2. * Widgster plugin.
  3. */
  4. !function ($) {
  5. "use strict";
  6. // WIDGSTER CLASS DEFINITION
  7. // ======================
  8. var Widgster = function (el, options) {
  9. this.$element = $(el);
  10. this.$collapse = this.$element.find('[data-widgster=collapse]');
  11. this.$expand = this.$element.find('[data-widgster=expand]');
  12. this.$fullscreen = this.$element.find('[data-widgster=fullscreen]');
  13. this.$restore = this.$element.find('[data-widgster=restore]');
  14. this.options = options;
  15. this.collapsed = options.collapsed;
  16. this.fullscreened = options.fullscreened;
  17. this._initHandlers();
  18. if (this.collapsed){
  19. this.collapse(false);
  20. } else {
  21. this.$expand.hide();
  22. }
  23. if (this.fullscreened){
  24. this.fullscreen();
  25. } else {
  26. this.$restore.hide();
  27. }
  28. this.options.autoload && this.load();
  29. var interval = parseInt(this.options.autoload);
  30. if (!isNaN(interval)){
  31. var widgster = this;
  32. this._autoloadInterval = setInterval(function(){
  33. widgster.load();
  34. }, interval)
  35. }
  36. };
  37. Widgster.DEFAULTS = {
  38. collapsed: false,
  39. fullscreened: false,
  40. transitionDuration: 150,
  41. bodySelector: '.body',
  42. showLoader: true,
  43. autoload: false,
  44. loaderTemplate: '<div style="text-align: center; margin-top: 10px;">Loading...</div>',
  45. /**
  46. * provide a way to insert a prompt before removing widget
  47. * @param callback
  48. */
  49. closePrompt: function(callback){
  50. callback()
  51. }
  52. };
  53. Widgster.prototype.collapse = function(animate){
  54. animate = typeof animate == "undefined" ? true : animate;
  55. var e = $.Event('collapse.widgster');
  56. this.$element.trigger(e);
  57. if (e.isDefaultPrevented()) return;
  58. var widgster = this,
  59. duration = animate ? this.options.transitionDuration : 0;
  60. this.$element.find(this.options.bodySelector).slideUp(duration, function(){
  61. widgster.$element.addClass('collapsed');
  62. widgster.$element.trigger($.Event('collapsed.widgster'));
  63. widgster.collapsed = true;
  64. });
  65. this.$collapse.hide();
  66. this.$expand.show();
  67. return false;
  68. };
  69. Widgster.prototype.expand = function(animate){
  70. animate = typeof animate == "undefined" ? true : animate;
  71. var e = $.Event('expand.widgster');
  72. this.$element.trigger(e);
  73. if (e.isDefaultPrevented()) return;
  74. var widgster = this,
  75. duration = animate ? this.options.transitionDuration : 0;
  76. this.$element.find(this.options.bodySelector).slideDown(duration, function(){
  77. widgster.$element.removeClass('collapsed');
  78. widgster.$element.trigger($.Event('expanded.widgster'));
  79. widgster.collapsed = false;
  80. });
  81. this.$collapse.show();
  82. this.$expand.hide();
  83. return false;
  84. };
  85. Widgster.prototype.close = function(){
  86. this.options.closePrompt && this.options.closePrompt($.proxy(this._doClose, this));
  87. return false;
  88. };
  89. Widgster.prototype.load = function(){
  90. var e = $.Event('load.widgster');
  91. this.$element.trigger(e);
  92. if (e.isDefaultPrevented()) return;
  93. var widgster = this;
  94. this.$element.find(this.options.bodySelector).load(this.options.load, function(responseText, textStatus, xhr){
  95. widgster.expand();
  96. widgster.options.showLoader && widgster._hideLoader();
  97. widgster.$element.trigger($.Event('loaded.widgster', {
  98. responseText: responseText,
  99. textStatus: textStatus,
  100. xhr: xhr
  101. }))
  102. });
  103. this.options.showLoader && this._showLoader();
  104. return false;
  105. };
  106. Widgster.prototype.fullscreen = function(){
  107. var e = $.Event('fullscreen.widgster');
  108. this.$element.trigger(e);
  109. if (e.isDefaultPrevented()) return;
  110. this.$element.css({
  111. position: 'fixed',
  112. top: 0,
  113. right: 0,
  114. bottom: 0,
  115. left: 0,
  116. margin: 0,
  117. 'z-index': 10000
  118. });
  119. $('body').css('overflow', 'hidden');
  120. this.wasCollapsed = this.collapsed;
  121. this.expand(false);
  122. this.$fullscreen.hide();
  123. this.$restore.show();
  124. this.$collapse.hide(); this.$expand.hide();
  125. this.$element.addClass('fullscreened');
  126. this.$element.trigger($.Event('fullscreened.widgster'));
  127. return false;
  128. };
  129. Widgster.prototype.restore = function(){
  130. var e = $.Event('restore.widgster');
  131. this.$element.trigger(e);
  132. if (e.isDefaultPrevented()) return;
  133. this.$element.css({
  134. position: '',
  135. top: '',
  136. right: '',
  137. bottom: '',
  138. left: '',
  139. margin: '',
  140. 'z-index': ''
  141. });
  142. $('body').css('overflow', '');
  143. this.$fullscreen.show();
  144. this.$restore.hide();
  145. if (this.collapsed){
  146. this.$collapse.hide(); this.$expand.show();
  147. } else {
  148. this.$collapse.show(); this.$expand.hide();
  149. }
  150. this.wasCollapsed && this.collapse(false);
  151. this.$element.removeClass('fullscreened');
  152. this.$element.trigger($.Event('restored.widgster'));
  153. return false;
  154. };
  155. Widgster.prototype._doClose = function(){
  156. //could have been remove.widgster, but http://bugs.jquery.com/ticket/14600
  157. var e = $.Event('close.widgster');
  158. this.$element.trigger(e);
  159. if (e.isDefaultPrevented()) return;
  160. this.$element.detach();
  161. e = $.Event('closed.widgster', {$element: this.$element});
  162. this.$element.trigger(e);
  163. };
  164. Widgster.prototype._showLoader = function(){
  165. var $body = this.$element.find(this.options.bodySelector);
  166. this.$loaderWrap = this.$element.find('.widgster-loader-wrap');
  167. //create loader html if does not exist
  168. if (this.$loaderWrap.length == 0){
  169. this.$loaderWrap = $('<div class="widgster-loader-wrap" style="position: absolute; top: 0; right: 0; bottom: 0; ' +
  170. 'left: 0; display: none"></div>');
  171. this.$element.append(this.$loaderWrap);
  172. }
  173. this.$loaderWrap.html(this.options.loaderTemplate);
  174. this.$loaderWrap.css({
  175. 'margin-top': $body.position().top
  176. });
  177. if (!this.collapsed){
  178. $body.fadeTo(this.options.transitionDuration, 0);
  179. this.$loaderWrap.fadeIn(this.options.transitionDuration)
  180. }
  181. };
  182. Widgster.prototype._hideLoader = function(){
  183. this.$loaderWrap.fadeOut(this.options.transitionDuration);
  184. this.$element.find(this.options.bodySelector).fadeTo(this.options.transitionDuration, 1);
  185. };
  186. /**
  187. * Attach all required widgster functions to data-widgster elements.
  188. * @private
  189. */
  190. Widgster.prototype._initHandlers = function(){
  191. this.$element.on('click.collapse.widgster', '[data-widgster=collapse]', $.proxy(this.collapse, this));
  192. this.$element.on('click.expand.widgster', '[data-widgster=expand]', $.proxy(this.expand, this));
  193. this.$element.on('click.close.widgster', '[data-widgster=close]', $.proxy(this.close, this));
  194. this.$element.on('click.load.widgster', '[data-widgster=load]', $.proxy(this.load, this));
  195. this.$element.on('click.fullscreen.widgster', '[data-widgster=fullscreen]', $.proxy(this.fullscreen, this));
  196. this.$element.on('click.restore.widgster', '[data-widgster=restore]', $.proxy(this.restore, this));
  197. };
  198. // NAMESPACED DATA ATTRIBUTES
  199. // =======================
  200. function getNamespacedData(namespace, data){
  201. var namespacedData = {};
  202. for (var key in data){
  203. // key starts with namespace
  204. if (key.slice(0, namespace.length) == namespace){
  205. var namespacedKey = key.slice(namespace.length, key.length);
  206. namespacedKey = namespacedKey.charAt(0).toLowerCase() + namespacedKey.slice(1);
  207. namespacedData[namespacedKey] = data[key];
  208. }
  209. }
  210. return namespacedData;
  211. }
  212. // WIDGSTER PLUGIN DEFINITION
  213. // =======================
  214. $.fn.widgster = function (option) {
  215. return this.each(function () {
  216. var $this = $(this);
  217. var data = $this.data('widgster');
  218. var options = $.extend({}, Widgster.DEFAULTS, getNamespacedData('widgster', $this.data()), typeof option == 'object' && option);
  219. if (!data) $this.data('widgster', new Widgster(this, options));
  220. if (typeof option == 'string') data[option]();
  221. })
  222. };
  223. $.fn.widgster.Constructor = Widgster;
  224. }(window.jQuery);