ultimate-base 0.5.0.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (24) hide show
  1. data/app/assets/javascripts/ultimate/backbone/app.js.coffee +47 -5
  2. data/app/assets/javascripts/ultimate/backbone/base.js.coffee +9 -10
  3. data/app/assets/javascripts/ultimate/backbone/collection.js.coffee +0 -1
  4. data/app/assets/javascripts/ultimate/backbone/lib/backbone.js +765 -673
  5. data/app/assets/javascripts/ultimate/backbone/model.js.coffee +0 -1
  6. data/app/assets/javascripts/ultimate/backbone/router.js.coffee +0 -4
  7. data/app/assets/javascripts/ultimate/backbone/view-mixins/nodes.js.coffee +51 -0
  8. data/app/assets/javascripts/ultimate/backbone/view.js.coffee +18 -104
  9. data/app/assets/javascripts/ultimate/base.js.coffee +1 -11
  10. data/app/assets/javascripts/ultimate/jquery-plugin-adapter.js.coffee +0 -1
  11. data/app/assets/javascripts/ultimate/jquery-plugin-class.js.coffee +3 -25
  12. data/app/assets/javascripts/ultimate/jquery.base.js.coffee +0 -2
  13. data/app/assets/javascripts/ultimate/underscore/underscore.inflection.js +4 -3
  14. data/app/assets/javascripts/ultimate/underscore/underscore.js +103 -80
  15. data/app/assets/javascripts/ultimate/underscore/underscore.string.js +71 -27
  16. data/lib/ultimate/base.rb +0 -1
  17. data/lib/ultimate/base/version.rb +1 -1
  18. metadata +3 -8
  19. data/app/assets/javascripts/ultimate/backbone/extra/jquery-ext.js.coffee +0 -96
  20. data/app/assets/javascripts/ultimate/improves/datepicker.js.coffee +0 -34
  21. data/app/assets/javascripts/ultimate/improves/devise.js.coffee +0 -18
  22. data/app/assets/javascripts/ultimate/improves/form-errors.js.coffee +0 -146
  23. data/app/assets/javascripts/ultimate/improves/tablesorter.js +0 -59
  24. data/lib/ultimate/extensions/directive_processor.rb +0 -64
@@ -41,12 +41,13 @@
41
41
  lt: '<',
42
42
  gt: '>',
43
43
  quot: '"',
44
- apos: "'",
45
- amp: '&'
44
+ amp: '&',
45
+ apos: "'"
46
46
  };
47
47
 
48
48
  var reversedEscapeChars = {};
49
- for(var key in escapeChars){ reversedEscapeChars[escapeChars[key]] = key; }
49
+ for(var key in escapeChars) reversedEscapeChars[escapeChars[key]] = key;
50
+ reversedEscapeChars["'"] = '#39';
50
51
 
51
52
  // sprintf() for JavaScript 0.7-beta1
52
53
  // http://www.diveintojavascript.com/projects/javascript-sprintf
@@ -206,7 +207,22 @@
206
207
 
207
208
  count: function(str, substr){
208
209
  if (str == null || substr == null) return 0;
209
- return String(str).split(substr).length - 1;
210
+
211
+ str = String(str);
212
+ substr = String(substr);
213
+
214
+ var count = 0,
215
+ pos = 0,
216
+ length = substr.length;
217
+
218
+ while (true) {
219
+ pos = str.indexOf(substr, pos);
220
+ if (pos === -1) break;
221
+ count++;
222
+ pos += length;
223
+ }
224
+
225
+ return count;
210
226
  },
211
227
 
212
228
  chars: function(str) {
@@ -320,7 +336,7 @@
320
336
  },
321
337
 
322
338
  classify: function(str){
323
- return _s.titleize(String(str).replace(/_/g, ' ')).replace(/\s/g, '');
339
+ return _s.titleize(String(str).replace(/[\W_]/g, ' ')).replace(/\s/g, '');
324
340
  },
325
341
 
326
342
  humanize: function(str){
@@ -429,17 +445,17 @@
429
445
  },
430
446
 
431
447
  toNumber: function(str, decimals) {
432
- if (str == null || str == '') return 0;
433
- str = String(str);
434
- var num = parseNumber(parseNumber(str).toFixed(~~decimals));
435
- return num === 0 && !str.match(/^0+$/) ? Number.NaN : num;
448
+ if (!str) return 0;
449
+ str = _s.trim(str);
450
+ if (!str.match(/^-?\d+(?:\.\d+)?$/)) return NaN;
451
+ return parseNumber(parseNumber(str).toFixed(~~decimals));
436
452
  },
437
453
 
438
454
  numberFormat : function(number, dec, dsep, tsep) {
439
455
  if (isNaN(number) || number == null) return '';
440
456
 
441
457
  number = number.toFixed(~~dec);
442
- tsep = tsep || ',';
458
+ tsep = typeof tsep == 'string' ? tsep : ',';
443
459
 
444
460
  var parts = number.split('.'), fnums = parts[0],
445
461
  decimals = parts[1] ? (dsep || '.') + parts[1] : '';
@@ -494,8 +510,8 @@
494
510
  slugify: function(str) {
495
511
  if (str == null) return '';
496
512
 
497
- var from = "ąàáäâãåæćęèéëêìíïîłńòóöôõøùúüûñçżź",
498
- to = "aaaaaaaaceeeeeiiiilnoooooouuuunczz",
513
+ var from = "ąàáäâãåæćęèéëêìíïîłńòóöôõøśùúüûñçżź",
514
+ to = "aaaaaaaaceeeeeiiiilnoooooosuuuunczz",
499
515
  regex = new RegExp(defaultToWhiteSpace(from), 'g');
500
516
 
501
517
  str = String(str).toLowerCase().replace(regex, function(c){
@@ -538,6 +554,36 @@
538
554
  return repeat.join(separator);
539
555
  },
540
556
 
557
+ naturalCmp: function(str1, str2){
558
+ if (str1 == str2) return 0;
559
+ if (!str1) return -1;
560
+ if (!str2) return 1;
561
+
562
+ var cmpRegex = /(\.\d+)|(\d+)|(\D+)/g,
563
+ tokens1 = String(str1).toLowerCase().match(cmpRegex),
564
+ tokens2 = String(str2).toLowerCase().match(cmpRegex),
565
+ count = Math.min(tokens1.length, tokens2.length);
566
+
567
+ for(var i = 0; i < count; i++) {
568
+ var a = tokens1[i], b = tokens2[i];
569
+
570
+ if (a !== b){
571
+ var num1 = parseInt(a, 10);
572
+ if (!isNaN(num1)){
573
+ var num2 = parseInt(b, 10);
574
+ if (!isNaN(num2) && num1 - num2)
575
+ return num1 - num2;
576
+ }
577
+ return a < b ? -1 : 1;
578
+ }
579
+ }
580
+
581
+ if (tokens1.length === tokens2.length)
582
+ return tokens1.length - tokens2.length;
583
+
584
+ return str1 < str2 ? -1 : 1;
585
+ },
586
+
541
587
  levenshtein: function(str1, str2) {
542
588
  if (str1 == null && str2 == null) return 0;
543
589
  if (str1 == null) return String(str2).length;
@@ -576,25 +622,23 @@
576
622
  _s.contains = _s.include;
577
623
  _s.q = _s.quote;
578
624
 
625
+ // Exporting
626
+
579
627
  // CommonJS module is defined
580
628
  if (typeof exports !== 'undefined') {
581
- if (typeof module !== 'undefined' && module.exports) {
582
- // Export module
629
+ if (typeof module !== 'undefined' && module.exports)
583
630
  module.exports = _s;
584
- }
585
- exports._s = _s;
586
631
 
587
- } else if (typeof define === 'function' && define.amd) {
588
- // Register as a named module with AMD.
589
- define('underscore.string', [], function() {
590
- return _s;
591
- });
592
-
593
- } else {
594
- // Integrate with Underscore.js if defined
595
- // or create our own underscore object.
596
- root._ = root._ || {};
597
- root._.string = root._.str = _s;
632
+ exports._s = _s;
598
633
  }
599
634
 
635
+ // Register as a named module with AMD.
636
+ if (typeof define === 'function' && define.amd)
637
+ define('underscore.string', [], function(){ return _s; });
638
+
639
+
640
+ // Integrate with Underscore.js if defined
641
+ // or create our own underscore object.
642
+ root._ = root._ || {};
643
+ root._.string = root._.str = _s;
600
644
  }(this, String);
@@ -1,6 +1,5 @@
1
1
  require "ultimate/base/version"
2
2
  require "ultimate/base/engine"
3
- require "ultimate/extensions/directive_processor"
4
3
 
5
4
  module Ultimate
6
5
  module Base
@@ -1,5 +1,5 @@
1
1
  module Ultimate
2
2
  module Base
3
- VERSION = '0.5.0.0'
3
+ VERSION = '0.6.0'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ultimate-base
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0.0
4
+ version: 0.6.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-03-31 00:00:00.000000000 Z
12
+ date: 2013-05-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -75,10 +75,10 @@ files:
75
75
  - app/assets/javascripts/ultimate/backbone/app.js.coffee
76
76
  - app/assets/javascripts/ultimate/backbone/base.js.coffee
77
77
  - app/assets/javascripts/ultimate/backbone/collection.js.coffee
78
- - app/assets/javascripts/ultimate/backbone/extra/jquery-ext.js.coffee
79
78
  - app/assets/javascripts/ultimate/backbone/lib/backbone.js
80
79
  - app/assets/javascripts/ultimate/backbone/model.js.coffee
81
80
  - app/assets/javascripts/ultimate/backbone/router.js.coffee
81
+ - app/assets/javascripts/ultimate/backbone/view-mixins/nodes.js.coffee
82
82
  - app/assets/javascripts/ultimate/backbone/view.js.coffee
83
83
  - app/assets/javascripts/ultimate/backbone/views/slider.js.coffee
84
84
  - app/assets/javascripts/ultimate/backbone/views/typed-fields.js.coffee
@@ -87,13 +87,9 @@ files:
87
87
  - app/assets/javascripts/ultimate/experimental/_inflections/plur.js
88
88
  - app/assets/javascripts/ultimate/experimental/fuzzy-json-generator.js.coffee
89
89
  - app/assets/javascripts/ultimate/helpers.js.coffee
90
- - app/assets/javascripts/ultimate/improves/datepicker.js.coffee
91
- - app/assets/javascripts/ultimate/improves/devise.js.coffee
92
- - app/assets/javascripts/ultimate/improves/form-errors.js.coffee
93
90
  - app/assets/javascripts/ultimate/improves/form.js.coffee
94
91
  - app/assets/javascripts/ultimate/improves/i18n-lite.js.coffee
95
92
  - app/assets/javascripts/ultimate/improves/magic-radios.js.coffee
96
- - app/assets/javascripts/ultimate/improves/tablesorter.js
97
93
  - app/assets/javascripts/ultimate/improves/typed-fields.js.coffee
98
94
  - app/assets/javascripts/ultimate/jquery-plugin-adapter.js.coffee
99
95
  - app/assets/javascripts/ultimate/jquery-plugin-class.js.coffee
@@ -106,7 +102,6 @@ files:
106
102
  - lib/ultimate/base.rb
107
103
  - lib/ultimate/base/engine.rb
108
104
  - lib/ultimate/base/version.rb
109
- - lib/ultimate/extensions/directive_processor.rb
110
105
  - scripts/rails
111
106
  - test/dummy/Rakefile
112
107
  - test/dummy/_emfile
@@ -1,96 +0,0 @@
1
- #= require ../base
2
-
3
- do ($ = jQuery) ->
4
-
5
- # TODO arguments
6
- $.fn.getViews = (viewClass = null, inheritance = false, domDeep = false) ->
7
- if not @length
8
- return []
9
- else if @length is 1
10
- views = @data("views") or []
11
- else
12
- # TODO check work and perf tests
13
- views = _.flatten($(o).data("views") or [] for o in @, true)
14
- #2: @map -> $(@).data("views") or []
15
- #3: _.flatten ( @map -> $(@).data("views") or [] ), true
16
- if viewClass?
17
- _.filter views, if inheritance then (w) -> w instanceof viewClass else (w) -> w.costructor is viewClass
18
- else
19
- views
20
-
21
- $.fn.getView = (viewClass, inheritance = false) ->
22
- if _.isString(viewClass)
23
- deprecate "getView() with viewClass as string", "viewClass as Backbone.View inheritor"
24
- # for o in @
25
- # views = $(o).data("views") or []
26
- # for view in views
27
- # return view if view.constructor.className is viewClass
28
- else if Ultimate.Backbone.isViewClass(viewClass)
29
- for o in @
30
- views = $(o).data("views") or []
31
- if inheritance
32
- for view in views
33
- return view if view instanceof viewClass
34
- else
35
- for view in views
36
- return view if view.constructor is viewClass
37
- false
38
-
39
- $.fn.hasView = (viewClass) ->
40
- if _.isString(viewClass)
41
- deprecate "hasView() with viewClass as string", "viewClass as Backbone.View inheritor"
42
- # for o in @
43
- # return true if _.any $(o).data("views") or [], (w) -> w.constructor.className is viewClass
44
- else if Ultimate.Backbone.isViewClass(viewClass)
45
- for o in @
46
- return true if _.any $(o).data("views") or [], (w) -> w.constructor is viewClass
47
- false
48
-
49
- # $.fn.bindOneView = (viewClass, options = {}) ->
50
- # Ultimate.gcViews()
51
- # bindedView = null
52
- # if @length
53
- # selector = "#{viewClass.selector}:not(.prevent-binding)"
54
- # jContainer = if @is(selector) then @filter(selector) else @find(selector)
55
- # if (l = jContainer.length)
56
- # if l is 1
57
- # bindedView = Ultimate.createView viewClass, jContainer, options
58
- # else
59
- # warning "$.fn.bindOneView() found #{l} elements by #{selector}, when need only 1"
60
- # else
61
- # warning "$.fn.bindOneView() not found elements by #{selector}"
62
- # else
63
- # warning "$.fn.bindOneView() call from empty jQuery()"
64
- # bindedView
65
- #
66
- # $.fn.bindView = (viewClass, options = {}) ->
67
- # Ultimate.gcViews()
68
- # bindedViews = []
69
- # if @length
70
- # ( if @is(viewClass.selector) then @ else @find(viewClass.selector) ).filter(":not(.prevent-binding)").each ->
71
- # if viewClass.canCreateInstance()
72
- # jContainer = $ @
73
- # if view = Ultimate.createView viewClass, jContainer, options
74
- # bindedViews.push view
75
- # else
76
- # false
77
- # bindedViews
78
- #
79
- # $.fn.bindViews = (viewClasses = Ultimate.LazyViews, options = {}) ->
80
- # cout "info", "bindViews begin"
81
- # bindedViews = []
82
- # if @length
83
- # bindedViews = for viewName, viewClass of viewClasses when viewClass.canCreateInstance()
84
- # viewClass.constructor.className ||= viewName
85
- # @bindView viewClass, options
86
- # _.flatten bindedViews, true
87
-
88
-
89
-
90
- # # TODO filtering by viewClass
91
- # # TODO enother algorithm with enother projection
92
- # $.fn.closestViews = (viewClass = null) ->
93
- # views = []
94
- # jTry = @
95
- # jTry = jTry.parent() while jTry.length and not (views = jTry.getViews()).length
96
- # views
@@ -1,34 +0,0 @@
1
-
2
- @unlazy_datepickers = (jRoot) ->
3
- jRoot.find('input.datepicker.lazy').removeClass('lazy').length
4
-
5
- @bind_datepickers = (jRoot) ->
6
- jRoot.find('input.datepicker:not(.lazy, .hasDatepicker)').each( ->
7
- jThis = $ @
8
- opts =
9
- 'showAnim' : ''
10
- 'showOn' : 'both'
11
- 'buttonImage' : '/images/forms/datepicker__icon.png' # TODO forwarding assets path
12
- 'buttonImageOnly': true
13
- 'changeMonth' : true
14
- 'changeYear' : true
15
- 'onClose' : (dateText, inst) -> $(inst.input).change().focusout()
16
- opts[_.camelize(k)] = d for k, d of jThis.data()
17
- jThis.datepicker opts
18
- ).length
19
-
20
- $.fn.orig_datepicker = $.fn.datepicker
21
-
22
- $.fn.datepicker = ->
23
- return @ unless @length
24
- @data('changed', true) if arguments.length and arguments[0] is 'setDate'
25
- $.fn.orig_datepicker.apply @, arguments
26
-
27
-
28
-
29
- $ ->
30
-
31
- $('body').on 'keyup keydown', 'input.datepicker.hasDatepicker', ->
32
- $(@).datepicker 'hide'
33
-
34
- bind_datepickers $('body')
@@ -1,18 +0,0 @@
1
- $ ->
2
-
3
- jBody = $ 'body'
4
-
5
- # fixes on sessions/new form, because devise don't return errors on fields
6
- jBody.on 'ajax:error', 'form.sessions-new', ->
7
- $(@).find(':input:visible').filter(-> not @value).closestEdge().setErrors()
8
- false
9
-
10
- # if devise form success, then open root path
11
- jBody.on 'ajax:success', 'form.user[data-remote="true"]', (event, data, textStatus, jqXHR) ->
12
- jForm = $ @
13
- if jForm.hasClass('users-new')
14
- getWidget('AccountPanel').showConfirmationInfo(jForm, data)
15
- else if jForm.hasClass('password-recovery')
16
- getWidget('AccountPanel').showConfirmationInfo(jForm, data)
17
- else unless jForm.hasClass('status')
18
- window.location = jqXHR.getResponseHeader('Location') or '/'
@@ -1,146 +0,0 @@
1
- # TODO this is part of custom forms
2
- # TODO registrable
3
- # TODO may be, replace "clear immune" technique with something more effective, ex. additional class
4
-
5
- ( ( $ ) ->
6
-
7
- $.errorableFields = {}
8
- $.errorableFieldsSelector = ''
9
-
10
- $.registerErrorableField = (selector, events, errorCleaner) ->
11
- $.errorableFields[selector.split(/\s+/)[0]] = arguments
12
- $.errorableFieldsSelector = _.keys($.errorableFields).join(', ')
13
- true
14
-
15
- $.fieldWithErrorsWrapperClass = 'field_with_errors'
16
- $.fieldWithClearImmuneWrapperClass = 'immune'
17
- $.labelForFieldWithErrorClass = 'with-error'
18
-
19
- # [ selector: String = '.g-select, .g-text-field, .g-text-area' ]
20
- # [ [, ]errors: Array = [] ]
21
- # [ [, ]clearImmune: Boolean = false ]
22
- $.fn.setFormErrors = ->
23
- # dafault parameters
24
- selector = $.errorableFieldsSelector # '.g-select, .g-text-field, .g-text-area'
25
- errors = []
26
- clearImmune = false
27
- # parsing arguments
28
- # TODO liquid arguments parser ( by arguments info, ex: {selector: String, errors: Array, clearImmune: Boolean} )
29
- a = args arguments
30
- if a.length
31
- first = a.shift()
32
- if _.isString first
33
- selector = first
34
- if a.length
35
- first = a.shift()
36
- if _.isString first
37
- first = [first]
38
- if _.isArray first
39
- errors = _.uniq first
40
- if a.length
41
- first = a.shift()
42
- if _.isBoolean first
43
- clearImmune = first
44
- # ui process
45
- @clearFormErrors selector, clearImmune
46
- wrapperSelector = ".#{$.fieldWithErrorsWrapperClass}"
47
- if clearImmune
48
- wrapperSelector += ".#{$.fieldWithClearImmuneWrapperClass}"
49
- jErrorWrappers = @find(selector).wrap(selectorToHtml wrapperSelector).parent()
50
- jErrorWrappers.append (for err in errors then content_tag('div', err, class: 'error')).join("\n")
51
- jErrorWrappers.closestLabel().addClass($.labelForFieldWithErrorClass)
52
-
53
- $.fn.setErrors = ->
54
- deprecate('jQ.setErrors(...)', 'jQ.setFormErrors(...)')
55
- @setFormErrors.apply(@, arguments)
56
-
57
- # [selector]
58
- # [clearImmune]
59
- $.fn.clearFormErrors = ->
60
- selector = $.errorableFieldsSelector # '.g-select, .g-text-field, .g-text-area'
61
- clearImmune = false
62
- # parsing arguments
63
- # TODO liquid arguments parser ( by arguments info, ex: {selector: String, clearImmune: Boolean} )
64
- a = args arguments
65
- if a.length
66
- first = a.shift()
67
- if _.isString first
68
- selector = first
69
- if a.length
70
- first = a.shift()
71
- if _.isBoolean(first)
72
- clearImmune = first
73
- wrapperSelector = ".#{$.fieldWithErrorsWrapperClass}"
74
- if clearImmune
75
- wrapperSelector += ".#{$.fieldWithClearImmuneWrapperClass}"
76
- else
77
- wrapperSelector += ":not(.#{$.fieldWithClearImmuneWrapperClass})"
78
- fullSelector = "#{wrapperSelector}:has(#{selector})"
79
- jErrorWrappers = @find fullSelector
80
- jErrorWrappers = @closest fullSelector unless jErrorWrappers.length
81
- if jErrorWrappers.length
82
- jErrorWrappers.closestLabel().removeClass($.labelForFieldWithErrorClass)
83
- jErrorWrappers.children('.error').remove()
84
- jErrorWrappers.children(selector).unwrap()
85
- @
86
-
87
- $.fn.clearFromErrors = ->
88
- deprecate('jQ.clearFromErrors(...)', 'jQ.clearFormErrors(...)')
89
- @clearFormErrors.apply(@, arguments)
90
-
91
- $.ujsAjaxError = (event, jqXHR) ->
92
- jForm = $(@).clearFormErrors()
93
- try
94
- responseJSON = $.parseJSON jqXHR.responseText
95
- errors = responseJSON['errors'] or responseJSON
96
- if errors
97
- jFields = jForm.find '[name*="["]:input:visible' # TODO research without :visible, because has custom elements
98
- if jFields.length
99
- for fieldErrors, fieldName of errors
100
- jField = jFields.filter "[name$=\"[#{fieldName}]\"]"
101
- if jField.length
102
- jField.closestEdge().setErrors fieldErrors
103
- catch e
104
- # nop
105
- true
106
-
107
-
108
- $.fn.customErrorsHandler = (suspend = true, eventName = 'ajax:error', selector = 'form[data-remote="true"]') ->
109
- if @length
110
- if @is 'form'
111
- jForms = @filter selector
112
- jForms.off eventName, $.ujsAjaxError
113
- jForms.on eventName, $.ujsAjaxError if suspend
114
- else
115
- @off eventName, selector, $.ujsAjaxError
116
- @on eventName, selector, $.ujsAjaxError if suspend
117
- @
118
-
119
-
120
-
121
-
122
- $.fn.errorCleaners = (suspend = true) ->
123
- if @length
124
- jDocks = if @is ':input' then @closestEdge() else @
125
- for fieldWrapperSelector, [selector, events, errorCleaner] of $.errorableFields
126
- fullSelector = ".#{$.fieldWithErrorsWrapperClass} > #{selector}"
127
- jDocks.off events, fullSelector
128
- jDocks.on events, fullSelector, errorCleaner if suspend
129
- @
130
-
131
-
132
-
133
- $.registerErrorableField '.g-text-field input:visible', 'change keyup', ->
134
- # text-fields error cleaner
135
- jTextField = $ @
136
- unless jTextField.val() is '' # TODO may be use isEmptyString()
137
- jTextField.clearFormErrors('.g-text-field').clearFormErrors('.g-text-field', true)
138
- jTextField.change().focus() # unwraping break change, and there changing continue
139
-
140
- $.registerErrorableField '.g-select select', 'change', ->
141
- # selects error cleaner
142
- jSelect = $ @
143
- unless jSelect.val() is '' # TODO may be use isEmptyString()
144
- jSelect.clearFormErrors('.g-select').clearFormErrors('.g-select', true)
145
-
146
- )( jQuery )