mutiny-rails 0.2.0 → 0.3.0

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.
@@ -1,5 +1,5 @@
1
1
  module Mutiny
2
2
  module Rails
3
- VERSION = '0.2.0'
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
@@ -1,63 +1,126 @@
1
- /*! Mutiny v0.2.0 - http://mutinyjs.com/ */
2
- (function(window, $, undefined) {
1
+ /*! Mutiny v0.3.0 - http://mutinyjs.com/ */
2
+ (function(window, undefined) {
3
3
  $(function(){
4
- Mutiny.init();
4
+ if(Mutiny.options.initOnReady) {
5
+ Mutiny.init();
6
+ }
5
7
  });
6
8
 
7
9
  var Mutiny = window.Mutiny = {
8
- init: function(el, namespace) {
9
- namespace = namespace || 'mutiny';
10
- el = el || $('*');
10
+ options: {
11
+ initOnReady: true
12
+ },
11
13
 
12
- var mutiny_call = function($instigator, widget, instance_options){
13
- if(Mutiny[widget] === undefined) {
14
- throw '"' + widget + '" not found';
15
- }
14
+ widgets: {},
16
15
 
17
- var options = $.extend({}, Mutiny[widget].defaults);
18
- if(isString(instance_options)) {
19
- options[Mutiny[widget].string_arg] = instance_options;
20
- } else {
21
- $.extend(options, instance_options);
22
- }
23
- Mutiny[widget].init($instigator, options);
24
- };
16
+ init: function($es, namespace) {
17
+ namespace = namespace || 'mutiny';
25
18
 
26
- el.each(function(i, e) {
19
+ /* Deprecated. data-mutiny="widget" should be data-mutiny-widget="" */
20
+ $find($es, format('[data-{0}]', namespace)).each(function(i, e) {
27
21
  var $e = $(e);
28
- var data = $e.data();
29
- if(namespace in data) {
30
- var directives = data[namespace];
31
- if(isString(directives)) {
32
- /* data-mutiny='slider' */
33
- mutiny_call($e, directives, {});
34
- } else if(typeof data === 'object') {
35
- /* data-mutiny='{"slider": {"some": "options"}}' */
36
- for(var directive in directives) {
37
- mutiny_call($e, directive, directives[directive]);
38
- }
39
- } else {
40
- throw 'Unsupported data';
22
+ var directives = $e.data(namespace);
23
+ if(isString(directives)) {
24
+ /* data-mutiny='slider' */
25
+ initWidget($e, directives, {});
26
+ } else if(typeof data === 'object') {
27
+ /* data-mutiny='{"slider": {"some": "options"}}' */
28
+ for(var directive in directives) {
29
+ initWidget($e, directive, directives[directive]);
41
30
  }
31
+ } else {
32
+ throw 'Unsupported data';
42
33
  }
34
+ });
43
35
 
44
- for(var key in data) {
45
- if(key.indexOf(namespace) === 0 && key != namespace) {
46
- var widget = key.replace(namespace, '').toLowerCase();
47
- var options = data[key];
48
- mutiny_call($e, widget, options || {});
36
+ var queries = [];
37
+ for(var name in Mutiny.widgets) {
38
+ queries.push(format('[data-{0}-{1}]', namespace, dasherize(name)));
39
+ }
40
+ var $needWidgets = $find($es, queries.join(','));
41
+ for(var i=0; i < $needWidgets.length; i++) {
42
+ var $e = $($needWidgets[i]);
43
+ for(name in Mutiny.widgets) {
44
+ var key = format('{0}-{1}', namespace, name);
45
+ var data = $e.data(key);
46
+ if(data !== undefined) {
47
+ var updatedOptions = initWidget($e, name, data);
48
+ if(updatedOptions) {
49
+ $e.data(key, updatedOptions);
50
+ }
49
51
  }
50
52
  }
51
- });
53
+ }
52
54
  }
53
55
  };
54
56
 
57
+ function $find($es, arg) {
58
+ return $es ? $es.filter(arg) : $(arg);
59
+ }
60
+
61
+ function initWidget($instigator, widgetName, instanceOptions) {
62
+ /* Deprecated: Mutiny.<widgetName> should be Mutiny.widgets.<widgetName> */
63
+ var widget = Mutiny.widgets[widgetName] || Mutiny[widgetName];
64
+ if(widget === undefined) {
65
+ throw format('"{0}" not found', widgetName);
66
+ }
67
+
68
+ instanceOptions = instanceOptions || {};
69
+ if(isString(instanceOptions)) {
70
+ var replacementOptions = {};
71
+ /* Deprecated: <widget>.string_arg should be <widget>.stringArg */
72
+ if(widget.string_arg) {
73
+ replacementOptions[widget.string_arg] = instanceOptions;
74
+ } else if(widget.stringArg) {
75
+ replacementOptions[widget.stringArg] = instanceOptions;
76
+ } else {
77
+ throw format('"{0}" cannot parse "{1}"', widgetName, instanceOptions);
78
+ }
79
+ instanceOptions = replacementOptions;
80
+ }
81
+
82
+ if(!instanceOptions.called) {
83
+ widget.init($instigator, $.extend({}, widget.defaults, instanceOptions));
84
+ instanceOptions.called = true;
85
+ return instanceOptions;
86
+ }
87
+ }
88
+
89
+ function dasherize(string) {
90
+ return $.map(string.split(/(?=[A-Z])/),
91
+ function(t){ return t.toLowerCase(); }).join('-');
92
+ }
93
+
94
+ function lowerCaseFirst(string) {
95
+ return string.charAt(0).toLowerCase() + string.slice(1);
96
+ }
97
+
98
+ function startsWith(string, match) {
99
+ return string.indexOf(match) === 0;
100
+ }
101
+
102
+ var format = function() {
103
+ var regexes = [];
104
+ for(var i=0; i < 10; i++) {
105
+ regexes[i] = new RegExp('\\{' + i + '\\}', 'gm');
106
+ }
107
+
108
+ return function() {
109
+ var s = arguments[0];
110
+ for(var i=1; i < arguments.length; i++) {
111
+ s = s.replace(regexes[i-1], arguments[i]);
112
+ }
113
+
114
+ return s;
115
+ };
116
+ }();
117
+
55
118
  function isString(obj) {
56
119
  return !!obj.substring;
57
120
  }
58
121
 
59
- Mutiny.accordion = {
60
- 'defaults': {'autoHeight': false, 'collapsible': true, 'active': false},
122
+ Mutiny.widgets.accordion = {
123
+ 'defaults': {},
61
124
  'init': function($instigator, options){
62
125
  var hash = window.location.hash;
63
126
  if(hash && $instigator.find(hash).length > 0) {
@@ -74,39 +137,35 @@ Mutiny.accordion = {
74
137
  }
75
138
  };
76
139
 
77
- Mutiny.datepicker = {
140
+ Mutiny.widgets.datepicker = {
78
141
  'init': function($instigator, options) {
79
142
  $instigator.datepicker(options);
80
143
  }
81
144
  };
82
145
 
83
- Mutiny.slider = {
146
+ function formatSpan(f, startValue, className) {
147
+ var inner = f.replace('%s', format('<span>{0}</span>', startValue || '&nbsp;'));
148
+ if(className) {
149
+ return format('<span class="{0}">{1}</span>', className, inner);
150
+ } else {
151
+ return format('<span>{0}</span>', inner);
152
+ }
153
+ }
154
+
155
+ Mutiny.widgets.slider = {
84
156
  'defaults': {'range': 'min'},
85
- '_createFormatSpan': function(format, value, className) {
86
- if(value === null || value === '') {
87
- /* If value does not exist, force a non-empty element draw. Starting with empty
88
- * element prevents correct drawing when it has been replace with real contents.
89
- */
90
- value = '&nbsp;';
91
- }
92
- var inner = format.replace('%s', '<span>' + value + '</span>');
93
- if(className) {
94
- return '<span class="' + className + '">' + inner + '</span>';
95
- } else {
96
- return '<span>' + inner + '</span>';
97
- }
98
- },
99
157
  'init': function($instigator, options){
100
158
  var $ui;
101
159
  if(options.target) {
102
160
  $ui = $(options.target);
103
161
  } else {
104
162
  var id = $instigator.attr('id');
105
- var extras = '';
106
163
  if(id) {
107
- extras = ' id="' + id + '-mutiny-slider"';
164
+ $ui = $(format('<div id="{0}-mutiny-slider"></div>', id));
165
+ } else {
166
+ $ui = $('<div></div>');
108
167
  }
109
- $ui = $('<div' + extras + '></div>').insertAfter($instigator);
168
+ $ui.insertAfter($instigator);
110
169
  }
111
170
 
112
171
  options.value = $instigator.val();
@@ -115,6 +174,7 @@ Mutiny.slider = {
115
174
  $instigator.val(slider.value).change();
116
175
  };
117
176
 
177
+ /* Deprecated. No more select sliders! */
118
178
  if ($instigator.is('select')) {
119
179
  var $options = $instigator.find('option');
120
180
  options.min = Number($options.first().val());
@@ -136,17 +196,17 @@ Mutiny.slider = {
136
196
  });
137
197
 
138
198
  if(options.minLabel) {
139
- $ui.append(this._createFormatSpan(options.minLabel, options.min, 'min-label'));
199
+ $ui.append(formatSpan(options.minLabel, options.min, 'min-label'));
140
200
  }
141
201
  if(options.maxLabel) {
142
- $ui.append(this._createFormatSpan(options.maxLabel, options.max, 'max-label'));
202
+ $ui.append(formatSpan(options.maxLabel, options.max, 'max-label'));
143
203
  }
144
204
 
145
205
  $ui.slider(options);
146
206
 
147
207
  /* Need to append the element to a DOM loaded slider so this occurs after the slider instantiation. */
148
208
  if(options.valueLabel) {
149
- var $valueLabel = $(this._createFormatSpan(options.valueLabel, options.value, 'value-label')).appendTo($ui.find('.ui-slider-handle'));
209
+ var $valueLabel = $(formatSpan(options.valueLabel, options.value, 'value-label')).appendTo($ui.find('.ui-slider-handle'));
150
210
  var $value = $valueLabel.find('span');
151
211
  $instigator.change(function() {
152
212
  $value.html($instigator.val());
@@ -155,41 +215,45 @@ Mutiny.slider = {
155
215
  }
156
216
  };
157
217
 
158
- Mutiny.toggler = {
159
- 'defaults': {'style': {'display': 'none'}, 'preventDefault': false, 'instigatorClass': 'active'},
160
- 'string_arg': 'target',
218
+ Mutiny.widgets.toggler = {
219
+ 'defaults': {'classes': 'inactive active', 'preventDefault': false},
220
+ 'stringArg': 'target',
161
221
  'init': function($instigator, options){
162
222
  var $target = $(options.target);
163
223
 
164
- var targetFunc;
165
- if(options['class']) {
166
- targetFunc = function(on) {
167
- $target.toggleClass(options['class'], on);
168
- };
169
- } else {
224
+ var toggleFunc;
225
+ if(options.style) {
170
226
  var noStyle = {};
171
227
  for(var key in options.style) {
172
- noStyle[key] = $target.css(key);
228
+ noStyle[key] = $instigator.css(key);
173
229
  }
174
230
 
175
- targetFunc = function(on) {
231
+ toggleFunc = function(on) {
232
+ $instigator.css(on ? options.style : noStyle);
176
233
  $target.css(on ? options.style : noStyle);
177
234
  };
235
+ } else {
236
+ var classes = options.classes.split(' ');
237
+ toggleFunc = function(on) {
238
+ $instigator.toggleClass(classes[0], !on);
239
+ $instigator.toggleClass(classes[1], on);
240
+ $target.toggleClass(classes[0], !on);
241
+ $target.toggleClass(classes[1], on);
242
+ };
178
243
  }
179
244
 
180
245
  if($instigator.is('input[type=radio]')) {
181
246
  var name = $instigator.attr("name");
182
- $('input[name="'+ name +'"]').change(function(event){
183
- var active = $instigator.is(':checked');
184
- $instigator.toggleClass(options.instigatorClass, active);
185
- targetFunc(active);
247
+ toggleFunc($instigator.is(':checked'));
248
+ $(format('input[name="{0}"]', name)).change(function(event){
249
+ toggleFunc($instigator.is(':checked'));
186
250
  });
187
251
  } else {
188
252
  var active = false;
253
+ toggleFunc(active);
189
254
  $instigator.click(function(event) {
190
255
  active = !active;
191
- $instigator.toggleClass(options.instigatorClass, active);
192
- targetFunc(active);
256
+ toggleFunc(active);
193
257
 
194
258
  if(options.preventDefault) {
195
259
  event.preventDefault();
@@ -199,4 +263,4 @@ Mutiny.toggler = {
199
263
  }
200
264
  };
201
265
 
202
- })(window, jQuery);
266
+ })(window);
@@ -1,2 +1,2 @@
1
- /*! Mutiny v0.2.0 - http://mutinyjs.com/ */
2
- (function(a,n,e){function t(a){return!!a.substring}n(function(){i.init()});var i=a.Mutiny={init:function(a,r){r=r||"mutiny",a=a||n("*");var l=function(a,r,l){if(i[r]===e)throw'"'+r+'" not found';var s=n.extend({},i[r].defaults);t(l)?s[i[r].string_arg]=l:n.extend(s,l),i[r].init(a,s)};a.each(function(a,e){var i=n(e),s=i.data();if(r in s){var o=s[r];if(t(o))l(i,o,{});else{if("object"!=typeof s)throw"Unsupported data";for(var c in o)l(i,c,o[c])}}for(var u in s)if(0===u.indexOf(r)&&u!=r){var f=u.replace(r,"").toLowerCase(),v=s[u];l(i,f,v||{})}})}};i.accordion={defaults:{autoHeight:!1,collapsible:!0,active:!1},init:function(e,t){var i=a.location.hash;i&&e.find(i).length>0&&(t.active=i),e.accordion(t),n(a).on("hashchange",function(){var n=a.location.hash;n&&e.find(n).length>0&&e.accordion("activate",n)})}},i.datepicker={init:function(a,n){a.datepicker(n)}},i.slider={defaults:{range:"min"},_createFormatSpan:function(a,n,e){(null===n||""===n)&&(n="&nbsp;");var t=a.replace("%s","<span>"+n+"</span>");return e?'<span class="'+e+'">'+t+"</span>":"<span>"+t+"</span>"},init:function(a,e){var t;if(e.target)t=n(e.target);else{var i=a.attr("id"),r="";i&&(r=' id="'+i+'-mutiny-slider"'),t=n("<div"+r+"></div>").insertAfter(a)}if(e.value=a.val(),e.slide=function(n,e){a.val(e.value).change()},a.is("select")){var l=a.find("option");e.min=Number(l.first().val()),e.max=Number(l.last().val()),e.step=(e.max-e.min)/(l.length-1)}else n.each(["min","max","step"],function(n,t){e[t]=Number(e[t]||a.attr(t)||a.data(t))});if(a.change(function(){var n=Number(a.val());n>e.max&&(n=e.max),e.min>n&&(n=e.min),isNaN(n)&&(n=e.value),a.val(n),t.slider("value",n)}),e.minLabel&&t.append(this._createFormatSpan(e.minLabel,e.min,"min-label")),e.maxLabel&&t.append(this._createFormatSpan(e.maxLabel,e.max,"max-label")),t.slider(e),e.valueLabel){var s=n(this._createFormatSpan(e.valueLabel,e.value,"value-label")).appendTo(t.find(".ui-slider-handle")),o=s.find("span");a.change(function(){o.html(a.val())})}}},i.toggler={defaults:{style:{display:"none"},preventDefault:!1,instigatorClass:"active"},string_arg:"target",init:function(a,e){var t,i=n(e.target);if(e["class"])t=function(a){i.toggleClass(e["class"],a)};else{var r={};for(var l in e.style)r[l]=i.css(l);t=function(a){i.css(a?e.style:r)}}if(a.is("input[type=radio]")){var s=a.attr("name");n('input[name="'+s+'"]').change(function(){var n=a.is(":checked");a.toggleClass(e.instigatorClass,n),t(n)})}else{var o=!1;a.click(function(n){o=!o,a.toggleClass(e.instigatorClass,o),t(o),e.preventDefault&&n.preventDefault()})}}}})(window,jQuery);
1
+ /*! Mutiny v0.3.0 - http://mutinyjs.com/ */
2
+ !function(a,b){function c(a,b){return a?a.filter(b):$(b)}function d(a,c,d){var e=h.widgets[c]||h[c];if(e===b)throw i('"{0}" not found',c);if(d=d||{},f(d)){var g={};if(e.string_arg)g[e.string_arg]=d;else{if(!e.stringArg)throw i('"{0}" cannot parse "{1}"',c,d);g[e.stringArg]=d}d=g}return d.called?void 0:(e.init(a,$.extend({},e.defaults,d)),d.called=!0,d)}function e(a){return $.map(a.split(/(?=[A-Z])/),function(a){return a.toLowerCase()}).join("-")}function f(a){return!!a.substring}function g(a,b,c){var d=a.replace("%s",i("<span>{0}</span>",b||"&nbsp;"));return c?i('<span class="{0}">{1}</span>',c,d):i("<span>{0}</span>",d)}$(function(){h.options.initOnReady&&h.init()});var h=a.Mutiny={options:{initOnReady:!0},widgets:{},init:function(a,g){g=g||"mutiny",c(a,i("[data-{0}]",g)).each(function(a,b){var c=$(b),e=c.data(g);if(f(e))d(c,e,{});else{if("object"!=typeof p)throw"Unsupported data";for(var h in e)d(c,h,e[h])}});var j=[];for(var k in h.widgets)j.push(i("[data-{0}-{1}]",g,e(k)));for(var l=c(a,j.join(",")),m=0;m<l.length;m++){var n=$(l[m]);for(k in h.widgets){var o=i("{0}-{1}",g,k),p=n.data(o);if(p!==b){var q=d(n,k,p);q&&n.data(o,q)}}}}},i=function(){for(var a=[],b=0;10>b;b++)a[b]=new RegExp("\\{"+b+"\\}","gm");return function(){for(var b=arguments[0],c=1;c<arguments.length;c++)b=b.replace(a[c-1],arguments[c]);return b}}();h.widgets.accordion={defaults:{},init:function(b,c){var d=a.location.hash;d&&b.find(d).length>0&&(c.active=d),b.accordion(c),$(a).on("hashchange",function(){var c=a.location.hash;c&&b.find(c).length>0&&b.accordion("activate",c)})}},h.widgets.datepicker={init:function(a,b){a.datepicker(b)}},h.widgets.slider={defaults:{range:"min"},init:function(a,b){var c;if(b.target)c=$(b.target);else{var d=a.attr("id");c=d?$(i('<div id="{0}-mutiny-slider"></div>',d)):$("<div></div>"),c.insertAfter(a)}if(b.value=a.val(),b.slide=function(b,c){a.val(c.value).change()},a.is("select")){var e=a.find("option");b.min=Number(e.first().val()),b.max=Number(e.last().val()),b.step=(b.max-b.min)/(e.length-1)}else $.each(["min","max","step"],function(c,d){b[d]=Number(b[d]||a.attr(d)||a.data(d))});if(a.change(function(){var d=Number(a.val());d>b.max&&(d=b.max),d<b.min&&(d=b.min),isNaN(d)&&(d=b.value),a.val(d),c.slider("value",d)}),b.minLabel&&c.append(g(b.minLabel,b.min,"min-label")),b.maxLabel&&c.append(g(b.maxLabel,b.max,"max-label")),c.slider(b),b.valueLabel){var f=$(g(b.valueLabel,b.value,"value-label")).appendTo(c.find(".ui-slider-handle")),h=f.find("span");a.change(function(){h.html(a.val())})}}},h.widgets.toggler={defaults:{classes:"inactive active",preventDefault:!1},stringArg:"target",init:function(a,b){var c,d=$(b.target);if(b.style){var e={};for(var f in b.style)e[f]=a.css(f);c=function(c){a.css(c?b.style:e),d.css(c?b.style:e)}}else{var g=b.classes.split(" ");c=function(b){a.toggleClass(g[0],!b),a.toggleClass(g[1],b),d.toggleClass(g[0],!b),d.toggleClass(g[1],b)}}if(a.is("input[type=radio]")){var h=a.attr("name");c(a.is(":checked")),$(i('input[name="{0}"]',h)).change(function(){c(a.is(":checked"))})}else{var j=!1;c(j),a.click(function(a){j=!j,c(j),b.preventDefault&&a.preventDefault()})}}}}(window);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mutiny-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-03 00:00:00.000000000 Z
12
+ date: 2013-12-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -62,6 +62,5 @@ rubyforge_project:
62
62
  rubygems_version: 1.8.23
63
63
  signing_key:
64
64
  specification_version: 3
65
- summary: Mutiny within Rails 3.1
65
+ summary: Mutiny within Rails 3.1+
66
66
  test_files: []
67
- has_rdoc: