ultimate-base 0.5.0.0 → 0.6.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.
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 )