fuelux-rails 2.3.2 → 2.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -3
  3. data/lib/fuelux-rails/version.rb +1 -1
  4. data/lib/generators/fuelux/install_generator.rb +2 -2
  5. data/lib/tasks/fuelux-rails_tasks.rake +99 -3
  6. data/vendor/assets/javascripts/fuelux.js +4 -4
  7. data/vendor/assets/javascripts/fuelux/checkbox.js +22 -3
  8. data/vendor/assets/javascripts/fuelux/combobox.js +5 -2
  9. data/vendor/assets/javascripts/fuelux/datagrid.js +61 -12
  10. data/vendor/assets/javascripts/fuelux/intelligent-dropdown.js +132 -0
  11. data/vendor/assets/javascripts/fuelux/pillbox.js +64 -12
  12. data/vendor/assets/javascripts/fuelux/radio.js +11 -1
  13. data/vendor/assets/javascripts/fuelux/search.js +4 -1
  14. data/vendor/assets/javascripts/fuelux/select.js +13 -16
  15. data/vendor/assets/javascripts/fuelux/spinner.js +20 -6
  16. data/vendor/assets/javascripts/fuelux/tree.js +98 -27
  17. data/vendor/assets/javascripts/fuelux/util.js +3 -1
  18. data/vendor/assets/javascripts/fuelux/wizard.js +69 -13
  19. data/vendor/toolkit/fuelux.less +6 -4
  20. data/vendor/toolkit/fuelux/checkbox.less +14 -2
  21. data/vendor/toolkit/fuelux/combobox.less +1 -1
  22. data/vendor/toolkit/fuelux/datagrid.less +5 -0
  23. data/vendor/toolkit/fuelux/intelligent-dropdown.less +5 -0
  24. data/vendor/toolkit/fuelux/pillbox.less +1 -1
  25. data/vendor/toolkit/fuelux/radio.less +4 -2
  26. data/vendor/toolkit/fuelux/search.less +1 -1
  27. data/vendor/toolkit/fuelux/select.less +7 -7
  28. data/vendor/toolkit/fuelux/spinner.less +1 -1
  29. data/vendor/toolkit/fuelux/tree.less +5 -3
  30. data/vendor/toolkit/fuelux/wizard.less +21 -34
  31. metadata +29 -13
@@ -8,6 +8,8 @@
8
8
 
9
9
  !function ($) {
10
10
 
11
+
12
+
11
13
  // PILLBOX CONSTRUCTOR AND PROTOTYPE
12
14
 
13
15
  var Pillbox = function (element, options) {
@@ -17,25 +19,76 @@
17
19
  };
18
20
 
19
21
  Pillbox.prototype = {
20
- constructor: Pillbox,
22
+ constructor : Pillbox,
21
23
 
22
24
  items: function() {
23
25
  return this.$element.find('li').map(function() {
24
26
  var $this = $(this);
25
- return $.extend({ text: $this.text() }, $this.data());
27
+ return $.extend({
28
+ text : $this.text()
29
+ }, $this.data());
26
30
  }).get();
27
31
  },
28
32
 
29
- itemclicked: function (e) {
30
- $(e.currentTarget).remove();
33
+ itemclicked: function(e) {
34
+
35
+ var $li = $(e.currentTarget);
36
+ var data = $.extend({
37
+ text : $li.html()
38
+ }, $li.data());
39
+
40
+ $li.remove();
31
41
  e.preventDefault();
42
+
43
+ this.$element.trigger('removed', data);
44
+ },
45
+
46
+ itemCount: function() {
47
+
48
+ return this.$element.find('li').length;
49
+ },
50
+
51
+ addItem: function(text, value) {
52
+
53
+ value = value || text;
54
+
55
+ //<li data-value="foo">Item One</li>
56
+
57
+ var $li = $('<li data-value="' + value + '">' + text + '</li>');
58
+
59
+ this.$element.find('ul').append($li);
60
+
61
+ return $li;
62
+ },
63
+
64
+ removeBySelector: function(selector) {
65
+
66
+ this.$element.find('ul').find(selector).remove();
67
+ },
68
+
69
+ removeByValue: function(value) {
70
+
71
+ var selector = 'li[data-value="' + value + '"]';
72
+
73
+ this.removeBySelector(selector);
74
+ },
75
+
76
+ removeByText: function(text) {
77
+
78
+ var selector = 'li:contains("' + text + '")';
79
+
80
+ this.removeBySelector(selector);
81
+ },
82
+
83
+ clear: function() {
84
+
85
+ this.$element.find('ul').empty();
32
86
  }
33
87
  };
34
88
 
35
-
36
89
  // PILLBOX PLUGIN DEFINITION
37
90
 
38
- $.fn.pillbox = function (option) {
91
+ $.fn.pillbox = function (option, value1, value2) {
39
92
  var methodReturn;
40
93
 
41
94
  var $set = this.each(function () {
@@ -43,8 +96,8 @@
43
96
  var data = $this.data('pillbox');
44
97
  var options = typeof option === 'object' && option;
45
98
 
46
- if (!data) $this.data('pillbox', (data = new Pillbox(this, options)));
47
- if (typeof option === 'string') methodReturn = data[option]();
99
+ if (!data) $this.data('pillbox', ( data = new Pillbox(this, options)));
100
+ if ( typeof option === 'string') methodReturn = data[option](value1, value2);
48
101
  });
49
102
 
50
103
  return (methodReturn === undefined) ? $set : methodReturn;
@@ -54,15 +107,14 @@
54
107
 
55
108
  $.fn.pillbox.Constructor = Pillbox;
56
109
 
57
-
58
110
  // PILLBOX DATA-API
59
111
 
60
112
  $(function () {
61
- $('body').on('mousedown.pillbox.data-api', '.pillbox', function (e) {
113
+ $('body').on('mousedown.pillbox.data-api', '.pillbox', function () {
62
114
  var $this = $(this);
63
115
  if ($this.data('pillbox')) return;
64
116
  $this.pillbox($this.data());
65
117
  });
66
118
  });
67
-
68
- }(window.jQuery);
119
+ }(window.jQuery);
120
+
@@ -8,6 +8,9 @@
8
8
 
9
9
  !function ($) {
10
10
 
11
+
12
+
13
+
11
14
  // RADIO CONSTRUCTOR AND PROTOTYPE
12
15
 
13
16
  var Radio = function (element, options) {
@@ -31,9 +34,16 @@
31
34
 
32
35
  constructor: Radio,
33
36
 
34
- setState: function ($radio, resetGroupState) {
37
+ setState: function ($radio) {
38
+ $radio = $radio || this.$radio;
39
+
35
40
  var checked = $radio.is(':checked');
36
41
  var disabled = $radio.is(':disabled');
42
+
43
+ // reset classes
44
+ this.$icon.removeClass('checked').removeClass('disabled');
45
+
46
+ this.$icon.removeClass('checked disabled');
37
47
 
38
48
  // set state of radio
39
49
  if (checked === true) {
@@ -8,6 +8,9 @@
8
8
 
9
9
  !function ($) {
10
10
 
11
+
12
+
13
+
11
14
  // SEARCH CONSTRUCTOR AND PROTOTYPE
12
15
 
13
16
  var Search = function (element, options) {
@@ -119,4 +122,4 @@
119
122
  });
120
123
  });
121
124
 
122
- }(window.jQuery);
125
+ }(window.jQuery);
@@ -8,6 +8,9 @@
8
8
 
9
9
  !function ($) {
10
10
 
11
+
12
+
13
+
11
14
  // SELECT CONSTRUCTOR AND PROTOTYPE
12
15
 
13
16
  var Select = function (element, options) {
@@ -42,29 +45,23 @@
42
45
  },
43
46
 
44
47
  resize: function() {
45
- var el = $('#selectTextSize')[0];
46
-
47
- // create element if it doesn't exist
48
- // used to calculate the length of the longest string
49
- if(!el) {
50
- $('<div/>').attr({id:'selectTextSize'}).appendTo('body');
51
- }
52
-
53
- var width = 0;
54
48
  var newWidth = 0;
49
+ var sizer = $('<div/>').addClass('select-sizer');
50
+ var width = 0;
51
+
52
+ $('body').append(sizer);
55
53
 
56
54
  // iterate through each item to find longest string
57
55
  this.$element.find('a').each(function () {
58
- var $this = $(this);
59
- var txt = $this.text();
60
- var $txtSize = $('#selectTextSize');
61
- $txtSize.text(txt);
62
- newWidth = $txtSize.outerWidth();
56
+ sizer.text($(this).text());
57
+ newWidth = sizer.outerWidth();
63
58
  if(newWidth > width) {
64
59
  width = newWidth;
65
60
  }
66
61
  });
67
62
 
63
+ sizer.remove();
64
+
68
65
  this.$label.width(width);
69
66
  },
70
67
 
@@ -79,7 +76,7 @@
79
76
  },
80
77
 
81
78
  selectByValue: function(value) {
82
- var selector = 'li[data-value=' + value + ']';
79
+ var selector = 'li[data-value="' + value + '"]';
83
80
  this.selectBySelector(selector);
84
81
  },
85
82
 
@@ -156,7 +153,7 @@
156
153
  });
157
154
  });
158
155
 
159
- $('body').on('mousedown.select.data-api', '.select', function (e) {
156
+ $('body').on('mousedown.select.data-api', '.select', function () {
160
157
  var $this = $(this);
161
158
  if ($this.data('select')) return;
162
159
  $this.select($this.data());
@@ -6,7 +6,10 @@
6
6
  * Licensed under the MIT license.
7
7
  */
8
8
 
9
- !function ($) {
9
+ !function ($) {
10
+
11
+
12
+
10
13
 
11
14
  // SPINNER CONSTRUCTOR AND PROTOTYPE
12
15
 
@@ -52,8 +55,15 @@
52
55
  constructor: Spinner,
53
56
 
54
57
  render: function () {
55
- this.$input.val(this.options.value);
56
- this.$input.attr('maxlength',(this.options.max + '').split('').length);
58
+ var inputValue = this.$input.val();
59
+
60
+ if (inputValue) {
61
+ this.value(inputValue);
62
+ } else {
63
+ this.$input.val(this.options.value);
64
+ }
65
+
66
+ this.$input.attr('maxlength', (this.options.max + '').split('').length);
57
67
  },
58
68
 
59
69
  change: function () {
@@ -127,11 +137,15 @@
127
137
  } else {
128
138
  this.value(newVal);
129
139
  }
140
+ } else if (this.options.cycle) {
141
+ var cycleVal = dir ? this.options.min : this.options.max;
142
+ this.value(cycleVal);
130
143
  }
131
144
  },
132
145
 
133
146
  value: function (value) {
134
- if (typeof value !== 'undefined') {
147
+ if (!isNaN(parseFloat(value)) && isFinite(value)) {
148
+ value = parseFloat(value);
135
149
  this.options.value = value;
136
150
  this.$input.val(value);
137
151
  return this;
@@ -187,11 +201,11 @@
187
201
  // SPINNER DATA-API
188
202
 
189
203
  $(function () {
190
- $('body').on('mousedown.spinner.data-api', '.spinner', function (e) {
204
+ $('body').on('mousedown.spinner.data-api', '.spinner', function () {
191
205
  var $this = $(this);
192
206
  if ($this.data('spinner')) return;
193
207
  $this.spinner($this.data());
194
208
  });
195
209
  });
196
210
 
197
- }(window.jQuery);
211
+ }(window.jQuery);
@@ -6,7 +6,10 @@
6
6
  * Licensed under the MIT license.
7
7
  */
8
8
 
9
- !function ($) {
9
+ !function ($) {
10
+
11
+
12
+
10
13
 
11
14
  // TREE CONSTRUCTOR AND PROTOTYPE
12
15
 
@@ -29,7 +32,8 @@
29
32
 
30
33
  populate: function ($el) {
31
34
  var self = this;
32
- var loader = $el.parent().find('.tree-loader:eq(0)');
35
+ var $parent = $el.parent();
36
+ var loader = $parent.find('.tree-loader:eq(0)');
33
37
 
34
38
  loader.show();
35
39
  this.options.dataSource.data($el.data(), function (items) {
@@ -49,14 +53,47 @@
49
53
  $entity.data(value);
50
54
  }
51
55
 
56
+ // Decorate $entity with data making the element
57
+ // easily accessable with libraries like jQuery.
58
+ //
59
+ // Values are contained within the object returned
60
+ // for folders and items as dataAttributes:
61
+ //
62
+ // {
63
+ // name: "An Item",
64
+ // type: 'item',
65
+ // dataAttributes = {
66
+ // 'classes': 'required-item red-text',
67
+ // 'data-parent': parentId,
68
+ // 'guid': guid
69
+ // }
70
+ // };
71
+
72
+ var dataAttributes = value.dataAttributes || [];
73
+ $.each(dataAttributes, function(key, value) {
74
+ switch (key) {
75
+ case 'class':
76
+ case 'classes':
77
+ case 'className':
78
+ $entity.addClass(value);
79
+ break;
80
+
81
+ // id, style, data-*
82
+ default:
83
+ $entity.attr(key, value);
84
+ break;
85
+ }
86
+ });
87
+
52
88
  if($el.hasClass('tree-folder-header')) {
53
- $el.parent().find('.tree-folder-content:eq(0)').append($entity);
89
+ $parent.find('.tree-folder-content:eq(0)').append($entity);
54
90
  } else {
55
91
  $el.append($entity);
56
92
  }
57
93
  });
58
94
 
59
- self.$element.trigger('loaded');
95
+ // return newly populated folder
96
+ self.$element.trigger('loaded', $parent);
60
97
  });
61
98
  },
62
99
 
@@ -78,7 +115,9 @@
78
115
  data.push($el.data());
79
116
  }
80
117
 
118
+ var eventType = 'selected';
81
119
  if($el.hasClass('tree-selected')) {
120
+ eventType = 'unselected';
82
121
  $el.removeClass('tree-selected');
83
122
  $el.find('i').removeClass('icon-ok').addClass('tree-dot');
84
123
  } else {
@@ -93,37 +132,47 @@
93
132
  this.$element.trigger('selected', {info: data});
94
133
  }
95
134
 
135
+ // Return new list of selected items, the item
136
+ // clicked, and the type of event:
137
+ $el.trigger('updated', {
138
+ info: data,
139
+ item: $el,
140
+ eventType: eventType
141
+ });
96
142
  },
97
143
 
98
144
  selectFolder: function (el) {
99
145
  var $el = $(el);
100
- var $par = $el.parent();
101
-
102
- if($el.find('.icon-folder-close').length) {
103
- if ($par.find('.tree-folder-content').children().length) {
104
- $par.find('.tree-folder-content:eq(0)').show();
105
- } else {
106
- this.populate( $el );
146
+ var $parent = $el.parent();
147
+ var $treeFolderContent = $parent.find('.tree-folder-content');
148
+ var $treeFolderContentFirstChild = $treeFolderContent.eq(0);
149
+
150
+ var eventType, classToTarget, classToAdd;
151
+ if ($el.find('.icon-folder-close').length) {
152
+ eventType = 'opened';
153
+ classToTarget = '.icon-folder-close';
154
+ classToAdd = 'icon-folder-open';
155
+
156
+ $treeFolderContentFirstChild.show();
157
+ if (!$treeFolderContent.children().length) {
158
+ this.populate($el);
107
159
  }
108
-
109
- $par.find('.icon-folder-close:eq(0)')
110
- .removeClass('icon-folder-close')
111
- .addClass('icon-folder-open');
112
-
113
- this.$element.trigger('opened', $el.data());
114
160
  } else {
115
- if(this.options.cacheItems) {
116
- $par.find('.tree-folder-content:eq(0)').hide();
117
- } else {
118
- $par.find('.tree-folder-content:eq(0)').empty();
161
+ eventType = 'closed';
162
+ classToTarget = '.icon-folder-open';
163
+ classToAdd = 'icon-folder-close';
164
+
165
+ $treeFolderContentFirstChild.hide();
166
+ if (!this.options.cacheItems) {
167
+ $treeFolderContentFirstChild.empty();
119
168
  }
169
+ }
120
170
 
121
- $par.find('.icon-folder-open:eq(0)')
122
- .removeClass('icon-folder-open')
123
- .addClass('icon-folder-close');
171
+ $parent.find(classToTarget).eq(0)
172
+ .removeClass('icon-folder-close icon-folder-open')
173
+ .addClass(classToAdd);
124
174
 
125
- this.$element.trigger('closed', $el.data());
126
- }
175
+ this.$element.trigger(eventType, $el.data());
127
176
  },
128
177
 
129
178
  selectedItems: function () {
@@ -134,6 +183,28 @@
134
183
  data.push($(value).data());
135
184
  });
136
185
  return data;
186
+ },
187
+
188
+ // collapses open folders
189
+ collapse: function () {
190
+ var cacheItems = this.options.cacheItems;
191
+
192
+ // find open folders
193
+ this.$element.find('.icon-folder-open').each(function () {
194
+ // update icon class
195
+ var $this = $(this)
196
+ .removeClass('icon-folder-close icon-folder-open')
197
+ .addClass('icon-folder-close');
198
+
199
+ // "close" or empty folder contents
200
+ var $parent = $this.parent().parent();
201
+ var $folder = $parent.children('.tree-folder-content');
202
+
203
+ $folder.hide();
204
+ if (!cacheItems) {
205
+ $folder.empty();
206
+ }
207
+ });
137
208
  }
138
209
  };
139
210
 
@@ -163,4 +234,4 @@
163
234
 
164
235
  $.fn.tree.Constructor = Tree;
165
236
 
166
- }(window.jQuery);
237
+ }(window.jQuery);