mutiny-rails 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: