rails-adminlte 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +5 -1
  3. data/lib/rails/adminlte/version.rb +1 -1
  4. data/vendor/assets/javascripts/adminlte/adminlte.js +1025 -668
  5. data/vendor/assets/stylesheets/adminlte/adminlte.css +125 -90
  6. data/vendor/assets/stylesheets/adminlte/alt/AdminLTE-select2.css +4 -1
  7. data/vendor/assets/stylesheets/adminlte/alt/AdminLTE-select2.min.css +1 -1
  8. data/vendor/assets/stylesheets/adminlte/alt/AdminLTE-without-plugins.css +98 -88
  9. data/vendor/assets/stylesheets/adminlte/alt/AdminLTE-without-plugins.min.css +4 -4
  10. data/vendor/assets/stylesheets/adminlte/skins/_all-skins.css +84 -73
  11. data/vendor/assets/stylesheets/adminlte/skins/_all-skins.min.css +1 -1
  12. data/vendor/assets/stylesheets/adminlte/skins/skin-black-light.css +12 -14
  13. data/vendor/assets/stylesheets/adminlte/skins/skin-black-light.min.css +1 -1
  14. data/vendor/assets/stylesheets/adminlte/skins/skin-black.css +7 -4
  15. data/vendor/assets/stylesheets/adminlte/skins/skin-black.min.css +1 -1
  16. data/vendor/assets/stylesheets/adminlte/skins/skin-blue-light.css +6 -7
  17. data/vendor/assets/stylesheets/adminlte/skins/skin-blue-light.min.css +1 -1
  18. data/vendor/assets/stylesheets/adminlte/skins/skin-blue.css +7 -4
  19. data/vendor/assets/stylesheets/adminlte/skins/skin-blue.min.css +1 -1
  20. data/vendor/assets/stylesheets/adminlte/skins/skin-green-light.css +6 -7
  21. data/vendor/assets/stylesheets/adminlte/skins/skin-green-light.min.css +1 -1
  22. data/vendor/assets/stylesheets/adminlte/skins/skin-green.css +7 -4
  23. data/vendor/assets/stylesheets/adminlte/skins/skin-green.min.css +1 -1
  24. data/vendor/assets/stylesheets/adminlte/skins/skin-purple-light.css +6 -7
  25. data/vendor/assets/stylesheets/adminlte/skins/skin-purple-light.min.css +1 -1
  26. data/vendor/assets/stylesheets/adminlte/skins/skin-purple.css +7 -4
  27. data/vendor/assets/stylesheets/adminlte/skins/skin-purple.min.css +1 -1
  28. data/vendor/assets/stylesheets/adminlte/skins/skin-red-light.css +6 -7
  29. data/vendor/assets/stylesheets/adminlte/skins/skin-red-light.min.css +1 -1
  30. data/vendor/assets/stylesheets/adminlte/skins/skin-red.css +7 -4
  31. data/vendor/assets/stylesheets/adminlte/skins/skin-red.min.css +1 -1
  32. data/vendor/assets/stylesheets/adminlte/skins/skin-yellow-light.css +6 -7
  33. data/vendor/assets/stylesheets/adminlte/skins/skin-yellow-light.min.css +1 -1
  34. data/vendor/assets/stylesheets/adminlte/skins/skin-yellow.css +7 -4
  35. data/vendor/assets/stylesheets/adminlte/skins/skin-yellow.min.css +1 -1
  36. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ed416d7d02adbd19aa5805945150724dcaa485df
4
- data.tar.gz: 83fcd59321ffee6ee9884f9df129dde7728eca64
2
+ SHA256:
3
+ metadata.gz: 840a75b56048504a5748cf42ab2f5c871caafdc12d7e42ddd5111c1607dde4f1
4
+ data.tar.gz: d89c3de74b7009e7e0bf36bf02a0f03f0de3f3760912c536be4b5f6be8b3e69b
5
5
  SHA512:
6
- metadata.gz: 3ddf86d842ff6b662f65cdec6be56102dcc95fa2821a12f04ba6ef09c6969b75034b05dbb742f936248b433d2b9e3aa6ddd81d5600a914f0d6691f95ce088805
7
- data.tar.gz: 761f8cda2ad4a55833b4cc673c78790d6e70f947125a246ee908d8c4fc9ae3ad21f5a513cccd6234ab83cf816e0b9a137dc034a8313a92e67f27fab7762b9bda
6
+ metadata.gz: f7bd9aac0b495b7ee4e9a476ce6fc5436556ae5b9284c1b7ecdf4882cb3ae0425b923744815f604f353a2f95df4f7c1f292431554d4b4ad30021aa608950e4e0
7
+ data.tar.gz: 4cabe191e2477ad6008337ccb1a07d53a82dca1dae9f20b463b368d6f581c5b9c09cd3d7b44a01b9789f1fec66533683527932baf436178c20a176b6e0d05427
data/README.md CHANGED
@@ -8,6 +8,7 @@ How to use my plugin.
8
8
  Add this line to your application's Gemfile:
9
9
 
10
10
  ```ruby
11
+ gem 'font-awesome-rails'
11
12
  gem 'rails-adminlte'
12
13
  ```
13
14
 
@@ -34,11 +35,14 @@ Add the following to your `app/assets/javascripts/application.js`:
34
35
 
35
36
  Add the following to your `app/assets/stylesheets/application.css`:
36
37
 
38
+ *= require bootstrap
37
39
  *= require adminlte/adminlte
40
+ *= require adminlte/skins/_all-skins
41
+ *= require font-awesome
38
42
 
39
43
  ## Version
40
44
 
41
- 0.1.7 (AdminLTE 2.3.12)
45
+ 0.1.8 (AdminLTE 2.4.2)
42
46
  ## License
43
47
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
44
48
 
@@ -1,5 +1,5 @@
1
1
  module Rails
2
2
  module Adminlte
3
- VERSION = '0.1.7'
3
+ VERSION = '0.1.8'
4
4
  end
5
5
  end
@@ -1,772 +1,1129 @@
1
1
  /*! AdminLTE app.js
2
- * ================
3
- * Main JS application file for AdminLTE v2. This file
4
- * should be included in all pages. It controls some layout
5
- * options and implements exclusive AdminLTE plugins.
6
- *
7
- * @Author Almsaeed Studio
8
- * @Support <http://www.almsaeedstudio.com>
9
- * @Email <abdullah@almsaeedstudio.com>
10
- * @version 2.3.12
11
- * @license MIT <http://opensource.org/licenses/MIT>
12
- */
13
-
14
- //Make sure jQuery has been loaded before app.js
15
- if (typeof jQuery === "undefined") {
16
- throw new Error("AdminLTE requires jQuery");
2
+ * ================
3
+ * Main JS application file for AdminLTE v2. This file
4
+ * should be included in all pages. It controls some layout
5
+ * options and implements exclusive AdminLTE plugins.
6
+ *
7
+ * @Author Almsaeed Studio
8
+ * @Support <https://www.almsaeedstudio.com>
9
+ * @Email <abdullah@almsaeedstudio.com>
10
+ * @version 2.4.2
11
+ * @repository git://github.com/almasaeed2010/AdminLTE.git
12
+ * @license MIT <http://opensource.org/licenses/MIT>
13
+ */
14
+
15
+ // Make sure jQuery has been loaded
16
+ if (typeof jQuery === 'undefined') {
17
+ throw new Error('AdminLTE requires jQuery')
17
18
  }
18
19
 
19
- /* AdminLTE
20
+ /* BoxRefresh()
21
+ * =========
22
+ * Adds AJAX content control to a box.
20
23
  *
21
- * @type Object
22
- * @description $.AdminLTE is the main object for the template's app.
23
- * It's used for implementing functions and options related
24
- * to the template. Keeping everything wrapped in an object
25
- * prevents conflict with other plugins and is a better
26
- * way to organize our code.
24
+ * @Usage: $('#my-box').boxRefresh(options)
25
+ * or add [data-widget="box-refresh"] to the box element
26
+ * Pass any option as data-option="value"
27
27
  */
28
- $.AdminLTE = {};
28
+ +function ($) {
29
+ 'use strict';
29
30
 
30
- /* --------------------
31
- * - AdminLTE Options -
32
- * --------------------
33
- * Modify these options to suit your implementation
34
- */
35
- $.AdminLTE.options = {
36
- //Add slimscroll to navbar menus
37
- //This requires you to load the slimscroll plugin
38
- //in every page before app.js
39
- navbarMenuSlimscroll: true,
40
- navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar
41
- navbarMenuHeight: "200px", //The height of the inner menu
42
- //General animation speed for JS animated elements such as box collapse/expand and
43
- //sidebar treeview slide up/down. This option accepts an integer as milliseconds,
44
- //'fast', 'normal', or 'slow'
45
- animationSpeed: 500,
46
- //Sidebar push menu toggle button selector
47
- sidebarToggleSelector: "[data-toggle='offcanvas']",
48
- //Activate sidebar push menu
49
- sidebarPushMenu: true,
50
- //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin)
51
- sidebarSlimScroll: true,
52
- //Enable sidebar expand on hover effect for sidebar mini
53
- //This option is forced to true if both the fixed layout and sidebar mini
54
- //are used together
55
- sidebarExpandOnHover: false,
56
- //BoxRefresh Plugin
57
- enableBoxRefresh: true,
58
- //Bootstrap.js tooltip
59
- enableBSToppltip: true,
60
- BSTooltipSelector: "[data-toggle='tooltip']",
61
- //Enable Fast Click. Fastclick.js creates a more
62
- //native touch experience with touch devices. If you
63
- //choose to enable the plugin, make sure you load the script
64
- //before AdminLTE's app.js
65
- enableFastclick: false,
66
- //Control Sidebar Tree views
67
- enableControlTreeView: true,
68
- //Control Sidebar Options
69
- enableControlSidebar: true,
70
- controlSidebarOptions: {
71
- //Which button should trigger the open/close event
72
- toggleBtnSelector: "[data-toggle='control-sidebar']",
73
- //The sidebar selector
74
- selector: ".control-sidebar",
75
- //Enable slide over content
76
- slide: true
77
- },
78
- //Box Widget Plugin. Enable this plugin
79
- //to allow boxes to be collapsed and/or removed
80
- enableBoxWidget: true,
81
- //Box Widget plugin options
82
- boxWidgetOptions: {
83
- boxWidgetIcons: {
84
- //Collapse icon
85
- collapse: 'fa-minus',
86
- //Open icon
87
- open: 'fa-plus',
88
- //Remove icon
89
- remove: 'fa-times'
31
+ var DataKey = 'lte.boxrefresh';
32
+
33
+ var Default = {
34
+ source : '',
35
+ params : {},
36
+ trigger : '.refresh-btn',
37
+ content : '.box-body',
38
+ loadInContent : true,
39
+ responseType : '',
40
+ overlayTemplate: '<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>',
41
+ onLoadStart : function () {
90
42
  },
91
- boxWidgetSelectors: {
92
- //Remove button selector
93
- remove: '[data-widget="remove"]',
94
- //Collapse button selector
95
- collapse: '[data-widget="collapse"]'
43
+ onLoadDone : function (response) {
44
+ return response;
96
45
  }
97
- },
98
- //Direct Chat plugin options
99
- directChat: {
100
- //Enable direct chat by default
101
- enable: true,
102
- //The button to open and close the chat contacts pane
103
- contactToggleSelector: '[data-widget="chat-pane-toggle"]'
104
- },
105
- //Define the set of colors to use globally around the website
106
- colors: {
107
- lightBlue: "#3c8dbc",
108
- red: "#f56954",
109
- green: "#00a65a",
110
- aqua: "#00c0ef",
111
- yellow: "#f39c12",
112
- blue: "#0073b7",
113
- navy: "#001F3F",
114
- teal: "#39CCCC",
115
- olive: "#3D9970",
116
- lime: "#01FF70",
117
- orange: "#FF851B",
118
- fuchsia: "#F012BE",
119
- purple: "#8E24AA",
120
- maroon: "#D81B60",
121
- black: "#222222",
122
- gray: "#d2d6de"
123
- },
124
- //The standard screen sizes that bootstrap uses.
125
- //If you change these in the variables.less file, change
126
- //them here too.
127
- screenSizes: {
128
- xs: 480,
129
- sm: 768,
130
- md: 992,
131
- lg: 1200
132
- }
133
- };
134
-
135
- /* ------------------
136
- * - Implementation -
137
- * ------------------
138
- * The next block of code implements AdminLTE's
139
- * functions and plugins as specified by the
140
- * options above.
141
- */
142
- $(function () {
143
- "use strict";
46
+ };
144
47
 
145
- //Fix for IE page transitions
146
- $("body").removeClass("hold-transition");
48
+ var Selector = {
49
+ data: '[data-widget="box-refresh"]'
50
+ };
147
51
 
148
- //Extend options if external options exist
149
- if (typeof AdminLTEOptions !== "undefined") {
150
- $.extend(true,
151
- $.AdminLTE.options,
152
- AdminLTEOptions);
153
- }
52
+ // BoxRefresh Class Definition
53
+ // =========================
54
+ var BoxRefresh = function (element, options) {
55
+ this.element = element;
56
+ this.options = options;
57
+ this.$overlay = $(options.overlay);
154
58
 
155
- //Easy access to options
156
- var o = $.AdminLTE.options;
59
+ if (options.source === '') {
60
+ throw new Error('Source url was not defined. Please specify a url in your BoxRefresh source option.');
61
+ }
157
62
 
158
- //Set up the object
159
- _init();
63
+ this._setUpListeners();
64
+ this.load();
65
+ };
160
66
 
161
- //Activate the layout maker
162
- $.AdminLTE.layout.activate();
67
+ BoxRefresh.prototype.load = function () {
68
+ this._addOverlay();
69
+ this.options.onLoadStart.call($(this));
163
70
 
164
- //Enable sidebar tree view controls
165
- if (o.enableControlTreeView) {
166
- $.AdminLTE.tree('.sidebar');
167
- }
71
+ $.get(this.options.source, this.options.params, function (response) {
72
+ if (this.options.loadInContent) {
73
+ $(this.options.content).html(response);
74
+ }
75
+ this.options.onLoadDone.call($(this), response);
76
+ this._removeOverlay();
77
+ }.bind(this), this.options.responseType !== '' && this.options.responseType);
78
+ };
168
79
 
169
- //Enable control sidebar
170
- if (o.enableControlSidebar) {
171
- $.AdminLTE.controlSidebar.activate();
172
- }
80
+ // Private
173
81
 
174
- //Add slimscroll to navbar dropdown
175
- if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') {
176
- $(".navbar .menu").slimscroll({
177
- height: o.navbarMenuHeight,
178
- alwaysVisible: false,
179
- size: o.navbarMenuSlimscrollWidth
180
- }).css("width", "100%");
181
- }
82
+ BoxRefresh.prototype._setUpListeners = function () {
83
+ $(this.element).on('click', Selector.trigger, function (event) {
84
+ if (event) event.preventDefault();
85
+ this.load();
86
+ }.bind(this));
87
+ };
182
88
 
183
- //Activate sidebar push menu
184
- if (o.sidebarPushMenu) {
185
- $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector);
186
- }
89
+ BoxRefresh.prototype._addOverlay = function () {
90
+ $(this.element).append(this.$overlay);
91
+ };
187
92
 
188
- //Activate Bootstrap tooltip
189
- if (o.enableBSToppltip) {
190
- $('body').tooltip({
191
- selector: o.BSTooltipSelector,
192
- container: 'body'
193
- });
194
- }
93
+ BoxRefresh.prototype._removeOverlay = function () {
94
+ $(this.element).remove(this.$overlay);
95
+ };
195
96
 
196
- //Activate box widget
197
- if (o.enableBoxWidget) {
198
- $.AdminLTE.boxWidget.activate();
199
- }
97
+ // Plugin Definition
98
+ // =================
99
+ function Plugin(option) {
100
+ return this.each(function () {
101
+ var $this = $(this);
102
+ var data = $this.data(DataKey);
200
103
 
201
- //Activate fast click
202
- if (o.enableFastclick && typeof FastClick != 'undefined') {
203
- FastClick.attach(document.body);
204
- }
104
+ if (!data) {
105
+ var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
106
+ $this.data(DataKey, (data = new BoxRefresh($this, options)));
107
+ }
205
108
 
206
- //Activate direct chat widget
207
- if (o.directChat.enable) {
208
- $(document).on('click', o.directChat.contactToggleSelector, function () {
209
- var box = $(this).parents('.direct-chat').first();
210
- box.toggleClass('direct-chat-contacts-open');
109
+ if (typeof data == 'string') {
110
+ if (typeof data[option] == 'undefined') {
111
+ throw new Error('No method named ' + option);
112
+ }
113
+ data[option]();
114
+ }
211
115
  });
212
116
  }
213
117
 
214
- /*
215
- * INITIALIZE BUTTON TOGGLE
216
- * ------------------------
217
- */
218
- $('.btn-group[data-toggle="btn-toggle"]').each(function () {
219
- var group = $(this);
220
- $(this).find(".btn").on('click', function (e) {
221
- group.find(".btn.active").removeClass("active");
222
- $(this).addClass("active");
223
- e.preventDefault();
224
- });
118
+ var old = $.fn.boxRefresh;
119
+
120
+ $.fn.boxRefresh = Plugin;
121
+ $.fn.boxRefresh.Constructor = BoxRefresh;
225
122
 
123
+ // No Conflict Mode
124
+ // ================
125
+ $.fn.boxRefresh.noConflict = function () {
126
+ $.fn.boxRefresh = old;
127
+ return this;
128
+ };
129
+
130
+ // BoxRefresh Data API
131
+ // =================
132
+ $(window).on('load', function () {
133
+ $(Selector.data).each(function () {
134
+ Plugin.call($(this));
135
+ });
226
136
  });
227
- });
228
137
 
229
- /* ----------------------------------
230
- * - Initialize the AdminLTE Object -
231
- * ----------------------------------
232
- * All AdminLTE functions are implemented below.
138
+ }(jQuery);
139
+
140
+
141
+ /* BoxWidget()
142
+ * ======
143
+ * Adds box widget functions to boxes.
144
+ *
145
+ * @Usage: $('.my-box').boxWidget(options)
146
+ * This plugin auto activates on any element using the `.box` class
147
+ * Pass any option as data-option="value"
233
148
  */
234
- function _init() {
149
+ +function ($) {
235
150
  'use strict';
236
- /* Layout
237
- * ======
238
- * Fixes the layout height in case min-height fails.
239
- *
240
- * @type Object
241
- * @usage $.AdminLTE.layout.activate()
242
- * $.AdminLTE.layout.fix()
243
- * $.AdminLTE.layout.fixSidebar()
244
- */
245
- $.AdminLTE.layout = {
246
- activate: function () {
247
- var _this = this;
248
- _this.fix();
249
- _this.fixSidebar();
250
- $('body, html, .wrapper').css('height', 'auto');
251
- $(window, ".wrapper").resize(function () {
252
- _this.fix();
253
- _this.fixSidebar();
254
- });
255
- },
256
- fix: function () {
257
- // Remove overflow from .wrapper if layout-boxed exists
258
- $(".layout-boxed > .wrapper").css('overflow', 'hidden');
259
- //Get window height and the wrapper height
260
- var footer_height = $('.main-footer').outerHeight() || 0;
261
- var neg = $('.main-header').outerHeight() + footer_height;
262
- var window_height = $(window).height();
263
- var sidebar_height = $(".sidebar").height() || 0;
264
- //Set the min-height of the content and sidebar based on the
265
- //the height of the document.
266
- if ($("body").hasClass("fixed")) {
267
- $(".content-wrapper, .right-side").css('min-height', window_height - footer_height);
268
- } else {
269
- var postSetWidth;
270
- if (window_height >= sidebar_height) {
271
- $(".content-wrapper, .right-side").css('min-height', window_height - neg);
272
- postSetWidth = window_height - neg;
273
- } else {
274
- $(".content-wrapper, .right-side").css('min-height', sidebar_height);
275
- postSetWidth = sidebar_height;
276
- }
277
151
 
278
- //Fix for the control sidebar height
279
- var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector);
280
- if (typeof controlSidebar !== "undefined") {
281
- if (controlSidebar.height() > postSetWidth)
282
- $(".content-wrapper, .right-side").css('min-height', controlSidebar.height());
283
- }
152
+ var DataKey = 'lte.boxwidget';
284
153
 
154
+ var Default = {
155
+ animationSpeed : 500,
156
+ collapseTrigger: '[data-widget="collapse"]',
157
+ removeTrigger : '[data-widget="remove"]',
158
+ collapseIcon : 'fa-minus',
159
+ expandIcon : 'fa-plus',
160
+ removeIcon : 'fa-times'
161
+ };
162
+
163
+ var Selector = {
164
+ data : '.box',
165
+ collapsed: '.collapsed-box',
166
+ header : '.box-header',
167
+ body : '.box-body',
168
+ footer : '.box-footer',
169
+ tools : '.box-tools'
170
+ };
171
+
172
+ var ClassName = {
173
+ collapsed: 'collapsed-box'
174
+ };
175
+
176
+ var Event = {
177
+ collapsed: 'collapsed.boxwidget',
178
+ expanded : 'expanded.boxwidget',
179
+ removed : 'removed.boxwidget'
180
+ };
181
+
182
+ // BoxWidget Class Definition
183
+ // =====================
184
+ var BoxWidget = function (element, options) {
185
+ this.element = element;
186
+ this.options = options;
187
+
188
+ this._setUpListeners();
189
+ };
190
+
191
+ BoxWidget.prototype.toggle = function () {
192
+ var isOpen = !$(this.element).is(Selector.collapsed);
193
+
194
+ if (isOpen) {
195
+ this.collapse();
196
+ } else {
197
+ this.expand();
198
+ }
199
+ };
200
+
201
+ BoxWidget.prototype.expand = function () {
202
+ var expandedEvent = $.Event(Event.expanded);
203
+ var collapseIcon = this.options.collapseIcon;
204
+ var expandIcon = this.options.expandIcon;
205
+
206
+ $(this.element).removeClass(ClassName.collapsed);
207
+
208
+ $(this.element)
209
+ .children(Selector.header + ', ' + Selector.body + ', ' + Selector.footer)
210
+ .children(Selector.tools)
211
+ .find('.' + expandIcon)
212
+ .removeClass(expandIcon)
213
+ .addClass(collapseIcon);
214
+
215
+ $(this.element).children(Selector.body + ', ' + Selector.footer)
216
+ .slideDown(this.options.animationSpeed, function () {
217
+ $(this.element).trigger(expandedEvent);
218
+ }.bind(this));
219
+ };
220
+
221
+ BoxWidget.prototype.collapse = function () {
222
+ var collapsedEvent = $.Event(Event.collapsed);
223
+ var collapseIcon = this.options.collapseIcon;
224
+ var expandIcon = this.options.expandIcon;
225
+
226
+ $(this.element)
227
+ .children(Selector.header + ', ' + Selector.body + ', ' + Selector.footer)
228
+ .children(Selector.tools)
229
+ .find('.' + collapseIcon)
230
+ .removeClass(collapseIcon)
231
+ .addClass(expandIcon);
232
+
233
+ $(this.element).children(Selector.body + ', ' + Selector.footer)
234
+ .slideUp(this.options.animationSpeed, function () {
235
+ $(this.element).addClass(ClassName.collapsed);
236
+ $(this.element).trigger(collapsedEvent);
237
+ }.bind(this));
238
+ };
239
+
240
+ BoxWidget.prototype.remove = function () {
241
+ var removedEvent = $.Event(Event.removed);
242
+
243
+ $(this.element).slideUp(this.options.animationSpeed, function () {
244
+ $(this.element).trigger(removedEvent);
245
+ $(this.element).remove();
246
+ }.bind(this));
247
+ };
248
+
249
+ // Private
250
+
251
+ BoxWidget.prototype._setUpListeners = function () {
252
+ var that = this;
253
+
254
+ $(this.element).on('click', this.options.collapseTrigger, function (event) {
255
+ if (event) event.preventDefault();
256
+ that.toggle($(this));
257
+ return false;
258
+ });
259
+
260
+ $(this.element).on('click', this.options.removeTrigger, function (event) {
261
+ if (event) event.preventDefault();
262
+ that.remove($(this));
263
+ return false;
264
+ });
265
+ };
266
+
267
+ // Plugin Definition
268
+ // =================
269
+ function Plugin(option) {
270
+ return this.each(function () {
271
+ var $this = $(this);
272
+ var data = $this.data(DataKey);
273
+
274
+ if (!data) {
275
+ var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
276
+ $this.data(DataKey, (data = new BoxWidget($this, options)));
285
277
  }
286
- },
287
- fixSidebar: function () {
288
- //Make sure the body tag has the .fixed class
289
- if (!$("body").hasClass("fixed")) {
290
- if (typeof $.fn.slimScroll != 'undefined') {
291
- $(".sidebar").slimScroll({destroy: true}).height("auto");
292
- }
293
- return;
294
- } else if (typeof $.fn.slimScroll == 'undefined' && window.console) {
295
- window.console.error("Error: the fixed layout requires the slimscroll plugin!");
296
- }
297
- //Enable slimscroll for fixed layout
298
- if ($.AdminLTE.options.sidebarSlimScroll) {
299
- if (typeof $.fn.slimScroll != 'undefined') {
300
- //Destroy if it exists
301
- $(".sidebar").slimScroll({destroy: true}).height("auto");
302
- //Add slimscroll
303
- $(".sidebar").slimScroll({
304
- height: ($(window).height() - $(".main-header").height()) + "px",
305
- color: "rgba(0,0,0,0.2)",
306
- size: "3px"
307
- });
278
+
279
+ if (typeof option == 'string') {
280
+ if (typeof data[option] == 'undefined') {
281
+ throw new Error('No method named ' + option);
308
282
  }
283
+ data[option]();
309
284
  }
285
+ });
286
+ }
287
+
288
+ var old = $.fn.boxWidget;
289
+
290
+ $.fn.boxWidget = Plugin;
291
+ $.fn.boxWidget.Constructor = BoxWidget;
292
+
293
+ // No Conflict Mode
294
+ // ================
295
+ $.fn.boxWidget.noConflict = function () {
296
+ $.fn.boxWidget = old;
297
+ return this;
298
+ };
299
+
300
+ // BoxWidget Data API
301
+ // ==================
302
+ $(window).on('load', function () {
303
+ $(Selector.data).each(function () {
304
+ Plugin.call($(this));
305
+ });
306
+ });
307
+ }(jQuery);
308
+
309
+
310
+ /* ControlSidebar()
311
+ * ===============
312
+ * Toggles the state of the control sidebar
313
+ *
314
+ * @Usage: $('#control-sidebar-trigger').controlSidebar(options)
315
+ * or add [data-toggle="control-sidebar"] to the trigger
316
+ * Pass any option as data-option="value"
317
+ */
318
+ +function ($) {
319
+ 'use strict';
320
+
321
+ var DataKey = 'lte.controlsidebar';
322
+
323
+ var Default = {
324
+ slide: true
325
+ };
326
+
327
+ var Selector = {
328
+ sidebar: '.control-sidebar',
329
+ data : '[data-toggle="control-sidebar"]',
330
+ open : '.control-sidebar-open',
331
+ bg : '.control-sidebar-bg',
332
+ wrapper: '.wrapper',
333
+ content: '.content-wrapper',
334
+ boxed : '.layout-boxed'
335
+ };
336
+
337
+ var ClassName = {
338
+ open : 'control-sidebar-open',
339
+ fixed: 'fixed'
340
+ };
341
+
342
+ var Event = {
343
+ collapsed: 'collapsed.controlsidebar',
344
+ expanded : 'expanded.controlsidebar'
345
+ };
346
+
347
+ // ControlSidebar Class Definition
348
+ // ===============================
349
+ var ControlSidebar = function (element, options) {
350
+ this.element = element;
351
+ this.options = options;
352
+ this.hasBindedResize = false;
353
+
354
+ this.init();
355
+ };
356
+
357
+ ControlSidebar.prototype.init = function () {
358
+ // Add click listener if the element hasn't been
359
+ // initialized using the data API
360
+ if (!$(this.element).is(Selector.data)) {
361
+ $(this).on('click', this.toggle);
310
362
  }
363
+
364
+ this.fix();
365
+ $(window).resize(function () {
366
+ this.fix();
367
+ }.bind(this));
311
368
  };
312
369
 
313
- /* PushMenu()
314
- * ==========
315
- * Adds the push menu functionality to the sidebar.
316
- *
317
- * @type Function
318
- * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']")
319
- */
320
- $.AdminLTE.pushMenu = {
321
- activate: function (toggleBtn) {
322
- //Get the screen sizes
323
- var screenSizes = $.AdminLTE.options.screenSizes;
324
-
325
- //Enable sidebar toggle
326
- $(document).on('click', toggleBtn, function (e) {
327
- e.preventDefault();
328
-
329
- //Enable sidebar push menu
330
- if ($(window).width() > (screenSizes.sm - 1)) {
331
- if ($("body").hasClass('sidebar-collapse')) {
332
- $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu');
333
- } else {
334
- $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu');
335
- }
336
- }
337
- //Handle sidebar push menu for small screens
338
- else {
339
- if ($("body").hasClass('sidebar-open')) {
340
- $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu');
341
- } else {
342
- $("body").addClass('sidebar-open').trigger('expanded.pushMenu');
343
- }
344
- }
345
- });
370
+ ControlSidebar.prototype.toggle = function (event) {
371
+ if (event) event.preventDefault();
346
372
 
347
- $(".content-wrapper").click(function () {
348
- //Enable hide menu when clicking on the content-wrapper on small screens
349
- if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) {
350
- $("body").removeClass('sidebar-open');
351
- }
352
- });
373
+ this.fix();
353
374
 
354
- //Enable expand on hover for sidebar mini
355
- if ($.AdminLTE.options.sidebarExpandOnHover
356
- || ($('body').hasClass('fixed')
357
- && $('body').hasClass('sidebar-mini'))) {
358
- this.expandOnHover();
375
+ if (!$(Selector.sidebar).is(Selector.open) && !$('body').is(Selector.open)) {
376
+ this.expand();
377
+ } else {
378
+ this.collapse();
379
+ }
380
+ };
381
+
382
+ ControlSidebar.prototype.expand = function () {
383
+ if (!this.options.slide) {
384
+ $('body').addClass(ClassName.open);
385
+ } else {
386
+ $(Selector.sidebar).addClass(ClassName.open);
387
+ }
388
+
389
+ $(this.element).trigger($.Event(Event.expanded));
390
+ };
391
+
392
+ ControlSidebar.prototype.collapse = function () {
393
+ $('body, ' + Selector.sidebar).removeClass(ClassName.open);
394
+ $(this.element).trigger($.Event(Event.collapsed));
395
+ };
396
+
397
+ ControlSidebar.prototype.fix = function () {
398
+ if ($('body').is(Selector.boxed)) {
399
+ this._fixForBoxed($(Selector.bg));
400
+ }
401
+ };
402
+
403
+ // Private
404
+
405
+ ControlSidebar.prototype._fixForBoxed = function (bg) {
406
+ bg.css({
407
+ position: 'absolute',
408
+ height : $(Selector.wrapper).height()
409
+ });
410
+ };
411
+
412
+ // Plugin Definition
413
+ // =================
414
+ function Plugin(option) {
415
+ return this.each(function () {
416
+ var $this = $(this);
417
+ var data = $this.data(DataKey);
418
+
419
+ if (!data) {
420
+ var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
421
+ $this.data(DataKey, (data = new ControlSidebar($this, options)));
359
422
  }
360
- },
361
- expandOnHover: function () {
362
- var _this = this;
363
- var screenWidth = $.AdminLTE.options.screenSizes.sm - 1;
364
- //Expand sidebar on hover
365
- $('.main-sidebar').hover(function () {
366
- if ($('body').hasClass('sidebar-mini')
367
- && $("body").hasClass('sidebar-collapse')
368
- && $(window).width() > screenWidth) {
369
- _this.expand();
370
- }
371
- }, function () {
372
- if ($('body').hasClass('sidebar-mini')
373
- && $('body').hasClass('sidebar-expanded-on-hover')
374
- && $(window).width() > screenWidth) {
375
- _this.collapse();
376
- }
377
- });
378
- },
379
- expand: function () {
380
- $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover');
381
- },
382
- collapse: function () {
383
- if ($('body').hasClass('sidebar-expanded-on-hover')) {
384
- $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse');
423
+
424
+ if (typeof option == 'string') data.toggle();
425
+ });
426
+ }
427
+
428
+ var old = $.fn.controlSidebar;
429
+
430
+ $.fn.controlSidebar = Plugin;
431
+ $.fn.controlSidebar.Constructor = ControlSidebar;
432
+
433
+ // No Conflict Mode
434
+ // ================
435
+ $.fn.controlSidebar.noConflict = function () {
436
+ $.fn.controlSidebar = old;
437
+ return this;
438
+ };
439
+
440
+ // ControlSidebar Data API
441
+ // =======================
442
+ $(document).on('click', Selector.data, function (event) {
443
+ if (event) event.preventDefault();
444
+ Plugin.call($(this), 'toggle');
445
+ });
446
+
447
+ }(jQuery);
448
+
449
+
450
+ /* DirectChat()
451
+ * ===============
452
+ * Toggles the state of the control sidebar
453
+ *
454
+ * @Usage: $('#my-chat-box').directChat()
455
+ * or add [data-widget="direct-chat"] to the trigger
456
+ */
457
+ +function ($) {
458
+ 'use strict';
459
+
460
+ var DataKey = 'lte.directchat';
461
+
462
+ var Selector = {
463
+ data: '[data-widget="chat-pane-toggle"]',
464
+ box : '.direct-chat'
465
+ };
466
+
467
+ var ClassName = {
468
+ open: 'direct-chat-contacts-open'
469
+ };
470
+
471
+ // DirectChat Class Definition
472
+ // ===========================
473
+ var DirectChat = function (element) {
474
+ this.element = element;
475
+ };
476
+
477
+ DirectChat.prototype.toggle = function ($trigger) {
478
+ $trigger.parents(Selector.box).first().toggleClass(ClassName.open);
479
+ };
480
+
481
+ // Plugin Definition
482
+ // =================
483
+ function Plugin(option) {
484
+ return this.each(function () {
485
+ var $this = $(this);
486
+ var data = $this.data(DataKey);
487
+
488
+ if (!data) {
489
+ $this.data(DataKey, (data = new DirectChat($this)));
385
490
  }
386
- }
491
+
492
+ if (typeof option == 'string') data.toggle($this);
493
+ });
494
+ }
495
+
496
+ var old = $.fn.directChat;
497
+
498
+ $.fn.directChat = Plugin;
499
+ $.fn.directChat.Constructor = DirectChat;
500
+
501
+ // No Conflict Mode
502
+ // ================
503
+ $.fn.directChat.noConflict = function () {
504
+ $.fn.directChat = old;
505
+ return this;
387
506
  };
388
507
 
389
- /* Tree()
390
- * ======
391
- * Converts the sidebar into a multilevel
392
- * tree view menu.
393
- *
394
- * @type Function
395
- * @Usage: $.AdminLTE.tree('.sidebar')
396
- */
397
- $.AdminLTE.tree = function (menu) {
398
- var _this = this;
399
- var animationSpeed = $.AdminLTE.options.animationSpeed;
400
- $(document).off('click', menu + ' li a')
401
- .on('click', menu + ' li a', function (e) {
402
- //Get the clicked link and the next element
403
- var $this = $(this);
404
- var checkElement = $this.next();
405
-
406
- //Check if the next element is a menu and is visible
407
- if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible')) && (!$('body').hasClass('sidebar-collapse'))) {
408
- //Close the menu
409
- checkElement.slideUp(animationSpeed, function () {
410
- checkElement.removeClass('menu-open');
411
- //Fix the layout in case the sidebar stretches over the height of the window
412
- //_this.layout.fix();
413
- });
414
- checkElement.parent("li").removeClass("active");
415
- }
416
- //If the menu is not visible
417
- else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) {
418
- //Get the parent menu
419
- var parent = $this.parents('ul').first();
420
- //Close all open menus within the parent
421
- var ul = parent.find('ul:visible').slideUp(animationSpeed);
422
- //Remove the menu-open class from the parent
423
- ul.removeClass('menu-open');
424
- //Get the parent li
425
- var parent_li = $this.parent("li");
426
-
427
- //Open the target menu and add the menu-open class
428
- checkElement.slideDown(animationSpeed, function () {
429
- //Add the class active to the parent li
430
- checkElement.addClass('menu-open');
431
- parent.find('li.active').removeClass('active');
432
- parent_li.addClass('active');
433
- //Fix the layout in case the sidebar stretches over the height of the window
434
- _this.layout.fix();
435
- });
436
- }
437
- //if this isn't a link, prevent the page from being redirected
438
- if (checkElement.is('.treeview-menu')) {
439
- e.preventDefault();
440
- }
441
- });
508
+ // DirectChat Data API
509
+ // ===================
510
+ $(document).on('click', Selector.data, function (event) {
511
+ if (event) event.preventDefault();
512
+ Plugin.call($(this), 'toggle');
513
+ });
514
+
515
+ }(jQuery);
516
+
517
+
518
+ /* Layout()
519
+ * ========
520
+ * Implements AdminLTE layout.
521
+ * Fixes the layout height in case min-height fails.
522
+ *
523
+ * @usage activated automatically upon window load.
524
+ * Configure any options by passing data-option="value"
525
+ * to the body tag.
526
+ */
527
+ +function ($) {
528
+ 'use strict';
529
+
530
+ var DataKey = 'lte.layout';
531
+
532
+ var Default = {
533
+ slimscroll : true,
534
+ resetHeight: true
442
535
  };
443
536
 
444
- /* ControlSidebar
445
- * ==============
446
- * Adds functionality to the right sidebar
447
- *
448
- * @type Object
449
- * @usage $.AdminLTE.controlSidebar.activate(options)
450
- */
451
- $.AdminLTE.controlSidebar = {
452
- //instantiate the object
453
- activate: function () {
454
- //Get the object
455
- var _this = this;
456
- //Update options
457
- var o = $.AdminLTE.options.controlSidebarOptions;
458
- //Get the sidebar
459
- var sidebar = $(o.selector);
460
- //The toggle button
461
- var btn = $(o.toggleBtnSelector);
462
-
463
- //Listen to the click event
464
- btn.on('click', function (e) {
465
- e.preventDefault();
466
- //If the sidebar is not open
467
- if (!sidebar.hasClass('control-sidebar-open')
468
- && !$('body').hasClass('control-sidebar-open')) {
469
- //Open the sidebar
470
- _this.open(sidebar, o.slide);
471
- } else {
472
- _this.close(sidebar, o.slide);
473
- }
537
+ var Selector = {
538
+ wrapper : '.wrapper',
539
+ contentWrapper: '.content-wrapper',
540
+ layoutBoxed : '.layout-boxed',
541
+ mainFooter : '.main-footer',
542
+ mainHeader : '.main-header',
543
+ sidebar : '.sidebar',
544
+ controlSidebar: '.control-sidebar',
545
+ fixed : '.fixed',
546
+ sidebarMenu : '.sidebar-menu',
547
+ logo : '.main-header .logo'
548
+ };
549
+
550
+ var ClassName = {
551
+ fixed : 'fixed',
552
+ holdTransition: 'hold-transition'
553
+ };
554
+
555
+ var Layout = function (options) {
556
+ this.options = options;
557
+ this.bindedResize = false;
558
+ this.activate();
559
+ };
560
+
561
+ Layout.prototype.activate = function () {
562
+ this.fix();
563
+ this.fixSidebar();
564
+
565
+ $('body').removeClass(ClassName.holdTransition);
566
+
567
+ if (this.options.resetHeight) {
568
+ $('body, html, ' + Selector.wrapper).css({
569
+ 'height' : 'auto',
570
+ 'min-height': '100%'
474
571
  });
572
+ }
475
573
 
476
- //If the body has a boxed layout, fix the sidebar bg position
477
- var bg = $(".control-sidebar-bg");
478
- _this._fix(bg);
574
+ if (!this.bindedResize) {
575
+ $(window).resize(function () {
576
+ this.fix();
577
+ this.fixSidebar();
479
578
 
480
- //If the body has a fixed layout, make the control sidebar fixed
481
- if ($('body').hasClass('fixed')) {
482
- _this._fixForFixed(sidebar);
579
+ $(Selector.logo + ', ' + Selector.sidebar).one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function () {
580
+ this.fix();
581
+ this.fixSidebar();
582
+ }.bind(this));
583
+ }.bind(this));
584
+
585
+ this.bindedResize = true;
586
+ }
587
+
588
+ $(Selector.sidebarMenu).on('expanded.tree', function () {
589
+ this.fix();
590
+ this.fixSidebar();
591
+ }.bind(this));
592
+
593
+ $(Selector.sidebarMenu).on('collapsed.tree', function () {
594
+ this.fix();
595
+ this.fixSidebar();
596
+ }.bind(this));
597
+ };
598
+
599
+ Layout.prototype.fix = function () {
600
+ // Remove overflow from .wrapper if layout-boxed exists
601
+ $(Selector.layoutBoxed + ' > ' + Selector.wrapper).css('overflow', 'hidden');
602
+
603
+ // Get window height and the wrapper height
604
+ var footerHeight = $(Selector.mainFooter).outerHeight() || 0;
605
+ var neg = $(Selector.mainHeader).outerHeight() + footerHeight;
606
+ var windowHeight = $(window).height();
607
+ var sidebarHeight = $(Selector.sidebar).height() || 0;
608
+
609
+ // Set the min-height of the content and sidebar based on
610
+ // the height of the document.
611
+ if ($('body').hasClass(ClassName.fixed)) {
612
+ $(Selector.contentWrapper).css('min-height', windowHeight - footerHeight);
613
+ } else {
614
+ var postSetHeight;
615
+
616
+ if (windowHeight >= sidebarHeight) {
617
+ $(Selector.contentWrapper).css('min-height', windowHeight - neg);
618
+ postSetHeight = windowHeight - neg;
483
619
  } else {
484
- //If the content height is less than the sidebar's height, force max height
485
- if ($('.content-wrapper, .right-side').height() < sidebar.height()) {
486
- _this._fixForContent(sidebar);
487
- }
620
+ $(Selector.contentWrapper).css('min-height', sidebarHeight);
621
+ postSetHeight = sidebarHeight;
488
622
  }
489
- },
490
- //Open the control sidebar
491
- open: function (sidebar, slide) {
492
- //Slide over content
493
- if (slide) {
494
- sidebar.addClass('control-sidebar-open');
495
- } else {
496
- //Push the content by adding the open class to the body instead
497
- //of the sidebar itself
498
- $('body').addClass('control-sidebar-open');
623
+
624
+ // Fix for the control sidebar height
625
+ var $controlSidebar = $(Selector.controlSidebar);
626
+ if (typeof $controlSidebar !== 'undefined') {
627
+ if ($controlSidebar.height() > postSetHeight)
628
+ $(Selector.contentWrapper).css('min-height', $controlSidebar.height());
499
629
  }
500
- },
501
- //Close the control sidebar
502
- close: function (sidebar, slide) {
503
- if (slide) {
504
- sidebar.removeClass('control-sidebar-open');
505
- } else {
506
- $('body').removeClass('control-sidebar-open');
630
+ }
631
+ };
632
+
633
+ Layout.prototype.fixSidebar = function () {
634
+ // Make sure the body tag has the .fixed class
635
+ if (!$('body').hasClass(ClassName.fixed)) {
636
+ if (typeof $.fn.slimScroll !== 'undefined') {
637
+ $(Selector.sidebar).slimScroll({ destroy: true }).height('auto');
507
638
  }
508
- },
509
- _fix: function (sidebar) {
510
- var _this = this;
511
- if ($("body").hasClass('layout-boxed')) {
512
- sidebar.css('position', 'absolute');
513
- sidebar.height($(".wrapper").height());
514
- if (_this.hasBindedResize) {
515
- return;
516
- }
517
- $(window).resize(function () {
518
- _this._fix(sidebar);
519
- });
520
- _this.hasBindedResize = true;
521
- } else {
522
- sidebar.css({
523
- 'position': 'fixed',
524
- 'height': 'auto'
639
+ return;
640
+ }
641
+
642
+ // Enable slimscroll for fixed layout
643
+ if (this.options.slimscroll) {
644
+ if (typeof $.fn.slimScroll !== 'undefined') {
645
+ // Destroy if it exists
646
+ // $(Selector.sidebar).slimScroll({ destroy: true }).height('auto')
647
+
648
+ // Add slimscroll
649
+ $(Selector.sidebar).slimScroll({
650
+ height: ($(window).height() - $(Selector.mainHeader).height()) + 'px'
525
651
  });
526
652
  }
527
- },
528
- _fixForFixed: function (sidebar) {
529
- sidebar.css({
530
- 'position': 'fixed',
531
- 'max-height': '100%',
532
- 'overflow': 'auto',
533
- 'padding-bottom': '50px'
534
- });
535
- },
536
- _fixForContent: function (sidebar) {
537
- $(".content-wrapper, .right-side").css('min-height', sidebar.height());
538
653
  }
539
654
  };
540
655
 
541
- /* BoxWidget
542
- * =========
543
- * BoxWidget is a plugin to handle collapsing and
544
- * removing boxes from the screen.
545
- *
546
- * @type Object
547
- * @usage $.AdminLTE.boxWidget.activate()
548
- * Set all your options in the main $.AdminLTE.options object
549
- */
550
- $.AdminLTE.boxWidget = {
551
- selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,
552
- icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,
553
- animationSpeed: $.AdminLTE.options.animationSpeed,
554
- activate: function (_box) {
555
- var _this = this;
556
- if (!_box) {
557
- _box = document; // activate all boxes per default
656
+ // Plugin Definition
657
+ // =================
658
+ function Plugin(option) {
659
+ return this.each(function () {
660
+ var $this = $(this);
661
+ var data = $this.data(DataKey);
662
+
663
+ if (!data) {
664
+ var options = $.extend({}, Default, $this.data(), typeof option === 'object' && option);
665
+ $this.data(DataKey, (data = new Layout(options)));
558
666
  }
559
- //Listen for collapse event triggers
560
- $(_box).on('click', _this.selectors.collapse, function (e) {
561
- e.preventDefault();
562
- _this.collapse($(this));
563
- });
564
667
 
565
- //Listen for remove event triggers
566
- $(_box).on('click', _this.selectors.remove, function (e) {
567
- e.preventDefault();
568
- _this.remove($(this));
569
- });
570
- },
571
- collapse: function (element) {
572
- var _this = this;
573
- //Find the box parent
574
- var box = element.parents(".box").first();
575
- //Find the body and the footer
576
- var box_content = box.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer");
577
- if (!box.hasClass("collapsed-box")) {
578
- //Convert minus into plus
579
- element.children(":first")
580
- .removeClass(_this.icons.collapse)
581
- .addClass(_this.icons.open);
582
- //Hide the content
583
- box_content.slideUp(_this.animationSpeed, function () {
584
- box.addClass("collapsed-box");
585
- });
586
- } else {
587
- //Convert plus into minus
588
- element.children(":first")
589
- .removeClass(_this.icons.open)
590
- .addClass(_this.icons.collapse);
591
- //Show the content
592
- box_content.slideDown(_this.animationSpeed, function () {
593
- box.removeClass("collapsed-box");
594
- });
668
+ if (typeof option === 'string') {
669
+ if (typeof data[option] === 'undefined') {
670
+ throw new Error('No method named ' + option);
671
+ }
672
+ data[option]();
595
673
  }
596
- },
597
- remove: function (element) {
598
- //Find the box parent
599
- var box = element.parents(".box").first();
600
- box.slideUp(this.animationSpeed);
601
- }
674
+ });
675
+ }
676
+
677
+ var old = $.fn.layout;
678
+
679
+ $.fn.layout = Plugin;
680
+ $.fn.layout.Constuctor = Layout;
681
+
682
+ // No conflict mode
683
+ // ================
684
+ $.fn.layout.noConflict = function () {
685
+ $.fn.layout = old;
686
+ return this;
602
687
  };
603
- }
604
688
 
605
- /* ------------------
606
- * - Custom Plugins -
607
- * ------------------
608
- * All custom plugins are defined below.
609
- */
689
+ // Layout DATA-API
690
+ // ===============
691
+ $(window).on('load', function () {
692
+ Plugin.call($('body'));
693
+ });
694
+ }(jQuery);
695
+
610
696
 
611
- /*
612
- * BOX REFRESH BUTTON
613
- * ------------------
614
- * This is a custom plugin to use with the component BOX. It allows you to add
615
- * a refresh button to the box. It converts the box's state to a loading state.
697
+ /* PushMenu()
698
+ * ==========
699
+ * Adds the push menu functionality to the sidebar.
616
700
  *
617
- * @type plugin
618
- * @usage $("#box-widget").boxRefresh( options );
701
+ * @usage: $('.btn').pushMenu(options)
702
+ * or add [data-toggle="push-menu"] to any button
703
+ * Pass any option as data-option="value"
619
704
  */
620
- (function ($) {
705
+ +function ($) {
706
+ 'use strict';
621
707
 
622
- "use strict";
708
+ var DataKey = 'lte.pushmenu';
623
709
 
624
- $.fn.boxRefresh = function (options) {
710
+ var Default = {
711
+ collapseScreenSize : 767,
712
+ expandOnHover : false,
713
+ expandTransitionDelay: 200
714
+ };
625
715
 
626
- // Render options
627
- var settings = $.extend({
628
- //Refresh button selector
629
- trigger: ".refresh-btn",
630
- //File source to be loaded (e.g: ajax/src.php)
631
- source: "",
632
- //Callbacks
633
- onLoadStart: function (box) {
634
- return box;
635
- }, //Right after the button has been clicked
636
- onLoadDone: function (box) {
637
- return box;
638
- } //When the source has been loaded
716
+ var Selector = {
717
+ collapsed : '.sidebar-collapse',
718
+ open : '.sidebar-open',
719
+ mainSidebar : '.main-sidebar',
720
+ contentWrapper: '.content-wrapper',
721
+ searchInput : '.sidebar-form .form-control',
722
+ button : '[data-toggle="push-menu"]',
723
+ mini : '.sidebar-mini',
724
+ expanded : '.sidebar-expanded-on-hover',
725
+ layoutFixed : '.fixed'
726
+ };
639
727
 
640
- }, options);
728
+ var ClassName = {
729
+ collapsed : 'sidebar-collapse',
730
+ open : 'sidebar-open',
731
+ mini : 'sidebar-mini',
732
+ expanded : 'sidebar-expanded-on-hover',
733
+ expandFeature: 'sidebar-mini-expand-feature',
734
+ layoutFixed : 'fixed'
735
+ };
641
736
 
642
- //The overlay
643
- var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');
737
+ var Event = {
738
+ expanded : 'expanded.pushMenu',
739
+ collapsed: 'collapsed.pushMenu'
740
+ };
644
741
 
645
- return this.each(function () {
646
- //if a source is specified
647
- if (settings.source === "") {
648
- if (window.console) {
649
- window.console.log("Please specify a source first - boxRefresh()");
650
- }
651
- return;
742
+ // PushMenu Class Definition
743
+ // =========================
744
+ var PushMenu = function (options) {
745
+ this.options = options;
746
+ this.init();
747
+ };
748
+
749
+ PushMenu.prototype.init = function () {
750
+ if (this.options.expandOnHover
751
+ || ($('body').is(Selector.mini + Selector.layoutFixed))) {
752
+ this.expandOnHover();
753
+ $('body').addClass(ClassName.expandFeature);
754
+ }
755
+
756
+ $(Selector.contentWrapper).click(function () {
757
+ // Enable hide menu when clicking on the content-wrapper on small screens
758
+ if ($(window).width() <= this.options.collapseScreenSize && $('body').hasClass(ClassName.open)) {
759
+ this.close();
652
760
  }
653
- //the box
654
- var box = $(this);
655
- //the button
656
- var rBtn = box.find(settings.trigger).first();
657
-
658
- //On trigger click
659
- rBtn.on('click', function (e) {
660
- e.preventDefault();
661
- //Add loading overlay
662
- start(box);
663
-
664
- //Perform ajax call
665
- box.find(".box-body").load(settings.source, function () {
666
- done(box);
667
- });
668
- });
761
+ }.bind(this));
762
+
763
+ // __Fix for android devices
764
+ $(Selector.searchInput).click(function (e) {
765
+ e.stopPropagation();
669
766
  });
767
+ };
670
768
 
671
- function start(box) {
672
- //Add overlay and loading img
673
- box.append(overlay);
769
+ PushMenu.prototype.toggle = function () {
770
+ var windowWidth = $(window).width();
771
+ var isOpen = !$('body').hasClass(ClassName.collapsed);
674
772
 
675
- settings.onLoadStart.call(box);
773
+ if (windowWidth <= this.options.collapseScreenSize) {
774
+ isOpen = $('body').hasClass(ClassName.open);
676
775
  }
677
776
 
678
- function done(box) {
679
- //Remove overlay and loading img
680
- box.find(overlay).remove();
777
+ if (!isOpen) {
778
+ this.open();
779
+ } else {
780
+ this.close();
781
+ }
782
+ };
783
+
784
+ PushMenu.prototype.open = function () {
785
+ var windowWidth = $(window).width();
681
786
 
682
- settings.onLoadDone.call(box);
787
+ if (windowWidth > this.options.collapseScreenSize) {
788
+ $('body').removeClass(ClassName.collapsed)
789
+ .trigger($.Event(Event.expanded));
683
790
  }
791
+ else {
792
+ $('body').addClass(ClassName.open)
793
+ .trigger($.Event(Event.expanded));
794
+ }
795
+ };
796
+
797
+ PushMenu.prototype.close = function () {
798
+ var windowWidth = $(window).width();
799
+ if (windowWidth > this.options.collapseScreenSize) {
800
+ $('body').addClass(ClassName.collapsed)
801
+ .trigger($.Event(Event.collapsed));
802
+ } else {
803
+ $('body').removeClass(ClassName.open + ' ' + ClassName.collapsed)
804
+ .trigger($.Event(Event.collapsed));
805
+ }
806
+ };
807
+
808
+ PushMenu.prototype.expandOnHover = function () {
809
+ $(Selector.mainSidebar).hover(function () {
810
+ if ($('body').is(Selector.mini + Selector.collapsed)
811
+ && $(window).width() > this.options.collapseScreenSize) {
812
+ this.expand();
813
+ }
814
+ }.bind(this), function () {
815
+ if ($('body').is(Selector.expanded)) {
816
+ this.collapse();
817
+ }
818
+ }.bind(this));
819
+ };
820
+
821
+ PushMenu.prototype.expand = function () {
822
+ setTimeout(function () {
823
+ $('body').removeClass(ClassName.collapsed)
824
+ .addClass(ClassName.expanded);
825
+ }, this.options.expandTransitionDelay);
826
+ };
827
+
828
+ PushMenu.prototype.collapse = function () {
829
+ setTimeout(function () {
830
+ $('body').removeClass(ClassName.expanded)
831
+ .addClass(ClassName.collapsed);
832
+ }, this.options.expandTransitionDelay);
833
+ };
834
+
835
+ // PushMenu Plugin Definition
836
+ // ==========================
837
+ function Plugin(option) {
838
+ return this.each(function () {
839
+ var $this = $(this);
840
+ var data = $this.data(DataKey);
841
+
842
+ if (!data) {
843
+ var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
844
+ $this.data(DataKey, (data = new PushMenu(options)));
845
+ }
684
846
 
847
+ if (option === 'toggle') data.toggle();
848
+ });
849
+ }
850
+
851
+ var old = $.fn.pushMenu;
852
+
853
+ $.fn.pushMenu = Plugin;
854
+ $.fn.pushMenu.Constructor = PushMenu;
855
+
856
+ // No Conflict Mode
857
+ // ================
858
+ $.fn.pushMenu.noConflict = function () {
859
+ $.fn.pushMenu = old;
860
+ return this;
685
861
  };
686
862
 
687
- })(jQuery);
863
+ // Data API
864
+ // ========
865
+ $(document).on('click', Selector.button, function (e) {
866
+ e.preventDefault();
867
+ Plugin.call($(this), 'toggle');
868
+ });
869
+ $(window).on('load', function () {
870
+ Plugin.call($(Selector.button));
871
+ });
872
+ }(jQuery);
873
+
688
874
 
689
- /*
690
- * EXPLICIT BOX CONTROLS
691
- * -----------------------
692
- * This is a custom plugin to use with the component BOX. It allows you to activate
693
- * a box inserted in the DOM after the app.js was loaded, toggle and remove box.
875
+ /* TodoList()
876
+ * =========
877
+ * Converts a list into a todoList.
694
878
  *
695
- * @type plugin
696
- * @usage $("#box-widget").activateBox();
697
- * @usage $("#box-widget").toggleBox();
698
- * @usage $("#box-widget").removeBox();
879
+ * @Usage: $('.my-list').todoList(options)
880
+ * or add [data-widget="todo-list"] to the ul element
881
+ * Pass any option as data-option="value"
699
882
  */
700
- (function ($) {
701
-
883
+ +function ($) {
702
884
  'use strict';
703
885
 
704
- $.fn.activateBox = function () {
705
- $.AdminLTE.boxWidget.activate(this);
886
+ var DataKey = 'lte.todolist';
887
+
888
+ var Default = {
889
+ onCheck : function (item) {
890
+ return item;
891
+ },
892
+ onUnCheck: function (item) {
893
+ return item;
894
+ }
895
+ };
896
+
897
+ var Selector = {
898
+ data: '[data-widget="todo-list"]'
899
+ };
900
+
901
+ var ClassName = {
902
+ done: 'done'
903
+ };
904
+
905
+ // TodoList Class Definition
906
+ // =========================
907
+ var TodoList = function (element, options) {
908
+ this.element = element;
909
+ this.options = options;
910
+
911
+ this._setUpListeners();
912
+ };
913
+
914
+ TodoList.prototype.toggle = function (item) {
915
+ item.parents(Selector.li).first().toggleClass(ClassName.done);
916
+ if (!item.prop('checked')) {
917
+ this.unCheck(item);
918
+ return;
919
+ }
920
+
921
+ this.check(item);
706
922
  };
707
923
 
708
- $.fn.toggleBox = function () {
709
- var button = $($.AdminLTE.boxWidget.selectors.collapse, this);
710
- $.AdminLTE.boxWidget.collapse(button);
924
+ TodoList.prototype.check = function (item) {
925
+ this.options.onCheck.call(item);
711
926
  };
712
927
 
713
- $.fn.removeBox = function () {
714
- var button = $($.AdminLTE.boxWidget.selectors.remove, this);
715
- $.AdminLTE.boxWidget.remove(button);
928
+ TodoList.prototype.unCheck = function (item) {
929
+ this.options.onUnCheck.call(item);
716
930
  };
717
931
 
718
- })(jQuery);
932
+ // Private
719
933
 
720
- /*
721
- * TODO LIST CUSTOM PLUGIN
722
- * -----------------------
723
- * This plugin depends on iCheck plugin for checkbox and radio inputs
934
+ TodoList.prototype._setUpListeners = function () {
935
+ var that = this;
936
+ $(this.element).on('change ifChanged', 'input:checkbox', function () {
937
+ that.toggle($(this));
938
+ });
939
+ };
940
+
941
+ // Plugin Definition
942
+ // =================
943
+ function Plugin(option) {
944
+ return this.each(function () {
945
+ var $this = $(this);
946
+ var data = $this.data(DataKey);
947
+
948
+ if (!data) {
949
+ var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
950
+ $this.data(DataKey, (data = new TodoList($this, options)));
951
+ }
952
+
953
+ if (typeof data == 'string') {
954
+ if (typeof data[option] == 'undefined') {
955
+ throw new Error('No method named ' + option);
956
+ }
957
+ data[option]();
958
+ }
959
+ });
960
+ }
961
+
962
+ var old = $.fn.todoList;
963
+
964
+ $.fn.todoList = Plugin;
965
+ $.fn.todoList.Constructor = TodoList;
966
+
967
+ // No Conflict Mode
968
+ // ================
969
+ $.fn.todoList.noConflict = function () {
970
+ $.fn.todoList = old;
971
+ return this;
972
+ };
973
+
974
+ // TodoList Data API
975
+ // =================
976
+ $(window).on('load', function () {
977
+ $(Selector.data).each(function () {
978
+ Plugin.call($(this));
979
+ });
980
+ });
981
+
982
+ }(jQuery);
983
+
984
+
985
+ /* Tree()
986
+ * ======
987
+ * Converts a nested list into a multilevel
988
+ * tree view menu.
724
989
  *
725
- * @type plugin
726
- * @usage $("#todo-widget").todolist( options );
990
+ * @Usage: $('.my-menu').tree(options)
991
+ * or add [data-widget="tree"] to the ul element
992
+ * Pass any option as data-option="value"
727
993
  */
728
- (function ($) {
729
-
994
+ +function ($) {
730
995
  'use strict';
731
996
 
732
- $.fn.todolist = function (options) {
733
- // Render options
734
- var settings = $.extend({
735
- //When the user checks the input
736
- onCheck: function (ele) {
737
- return ele;
738
- },
739
- //When the user unchecks the input
740
- onUncheck: function (ele) {
741
- return ele;
742
- }
743
- }, options);
997
+ var DataKey = 'lte.tree';
744
998
 
745
- return this.each(function () {
999
+ var Default = {
1000
+ animationSpeed: 500,
1001
+ accordion : true,
1002
+ followLink : false,
1003
+ trigger : '.treeview a'
1004
+ };
746
1005
 
747
- if (typeof $.fn.iCheck != 'undefined') {
748
- $('input', this).on('ifChecked', function () {
749
- var ele = $(this).parents("li").first();
750
- ele.toggleClass("done");
751
- settings.onCheck.call(ele);
752
- });
1006
+ var Selector = {
1007
+ tree : '.tree',
1008
+ treeview : '.treeview',
1009
+ treeviewMenu: '.treeview-menu',
1010
+ open : '.menu-open, .active',
1011
+ li : 'li',
1012
+ data : '[data-widget="tree"]',
1013
+ active : '.active'
1014
+ };
753
1015
 
754
- $('input', this).on('ifUnchecked', function () {
755
- var ele = $(this).parents("li").first();
756
- ele.toggleClass("done");
757
- settings.onUncheck.call(ele);
758
- });
759
- } else {
760
- $('input', this).on('change', function () {
761
- var ele = $(this).parents("li").first();
762
- ele.toggleClass("done");
763
- if ($('input', ele).is(":checked")) {
764
- settings.onCheck.call(ele);
765
- } else {
766
- settings.onUncheck.call(ele);
767
- }
768
- });
1016
+ var ClassName = {
1017
+ open: 'menu-open',
1018
+ tree: 'tree'
1019
+ };
1020
+
1021
+ var Event = {
1022
+ collapsed: 'collapsed.tree',
1023
+ expanded : 'expanded.tree'
1024
+ };
1025
+
1026
+ // Tree Class Definition
1027
+ // =====================
1028
+ var Tree = function (element, options) {
1029
+ this.element = element;
1030
+ this.options = options;
1031
+
1032
+ $(this.element).addClass(ClassName.tree);
1033
+
1034
+ $(Selector.treeview + Selector.active, this.element).addClass(ClassName.open);
1035
+
1036
+ this._setUpListeners();
1037
+ };
1038
+
1039
+ Tree.prototype.toggle = function (link, event) {
1040
+ var treeviewMenu = link.next(Selector.treeviewMenu);
1041
+ var parentLi = link.parent();
1042
+ var isOpen = parentLi.hasClass(ClassName.open);
1043
+
1044
+ if (!parentLi.is(Selector.treeview)) {
1045
+ return;
1046
+ }
1047
+
1048
+ if (!this.options.followLink || link.attr('href') === '#') {
1049
+ event.preventDefault();
1050
+ }
1051
+
1052
+ if (isOpen) {
1053
+ this.collapse(treeviewMenu, parentLi);
1054
+ } else {
1055
+ this.expand(treeviewMenu, parentLi);
1056
+ }
1057
+ };
1058
+
1059
+ Tree.prototype.expand = function (tree, parent) {
1060
+ var expandedEvent = $.Event(Event.expanded);
1061
+
1062
+ if (this.options.accordion) {
1063
+ var openMenuLi = parent.siblings(Selector.open);
1064
+ var openTree = openMenuLi.children(Selector.treeviewMenu);
1065
+ this.collapse(openTree, openMenuLi);
1066
+ }
1067
+
1068
+ parent.addClass(ClassName.open);
1069
+ tree.slideDown(this.options.animationSpeed, function () {
1070
+ $(this.element).trigger(expandedEvent);
1071
+ }.bind(this));
1072
+ };
1073
+
1074
+ Tree.prototype.collapse = function (tree, parentLi) {
1075
+ var collapsedEvent = $.Event(Event.collapsed);
1076
+
1077
+ tree.find(Selector.open).removeClass(ClassName.open);
1078
+ parentLi.removeClass(ClassName.open);
1079
+ tree.slideUp(this.options.animationSpeed, function () {
1080
+ tree.find(Selector.open + ' > ' + Selector.treeview).slideUp();
1081
+ $(this.element).trigger(collapsedEvent);
1082
+ }.bind(this));
1083
+ };
1084
+
1085
+ // Private
1086
+
1087
+ Tree.prototype._setUpListeners = function () {
1088
+ var that = this;
1089
+
1090
+ $(this.element).on('click', this.options.trigger, function (event) {
1091
+ that.toggle($(this), event);
1092
+ });
1093
+ };
1094
+
1095
+ // Plugin Definition
1096
+ // =================
1097
+ function Plugin(option) {
1098
+ return this.each(function () {
1099
+ var $this = $(this);
1100
+ var data = $this.data(DataKey);
1101
+
1102
+ if (!data) {
1103
+ var options = $.extend({}, Default, $this.data(), typeof option == 'object' && option);
1104
+ $this.data(DataKey, new Tree($this, options));
769
1105
  }
770
1106
  });
1107
+ }
1108
+
1109
+ var old = $.fn.tree;
1110
+
1111
+ $.fn.tree = Plugin;
1112
+ $.fn.tree.Constructor = Tree;
1113
+
1114
+ // No Conflict Mode
1115
+ // ================
1116
+ $.fn.tree.noConflict = function () {
1117
+ $.fn.tree = old;
1118
+ return this;
771
1119
  };
772
- }(jQuery));
1120
+
1121
+ // Tree Data API
1122
+ // =============
1123
+ $(window).on('load', function () {
1124
+ $(Selector.data).each(function () {
1125
+ Plugin.call($(this));
1126
+ });
1127
+ });
1128
+
1129
+ }(jQuery);