fuelux-rails 2.3.2 → 2.4.0.rc1

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 (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);