tao_on_rails 0.8.2 → 0.9.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.
- checksums.yaml +4 -4
- data/Rakefile +1 -0
- data/lib/assets/javascripts/tao/attribute_manager.coffee +94 -0
- data/lib/assets/javascripts/tao/component.coffee +19 -20
- data/lib/assets/javascripts/tao/index.coffee +1 -1
- data/lib/assets/javascripts/tao/module.coffee +4 -4
- data/lib/generators/tao/coffee/templates/coffee.erb +1 -1
- data/lib/tao_on_rails/action_view/helpers.rb +1 -1
- data/lib/tao_on_rails/components/base.rb +64 -13
- data/lib/tao_on_rails/components/page_component.rb +8 -8
- data/lib/tao_on_rails/version.rb +1 -1
- data/vendor/assets/javascripts/polyfills/custom-elements.js +7 -7
- data/vendor/assets/javascripts/polyfills/{polyfills.coffee → index.coffee} +0 -0
- data/vendor/assets/javascripts/polyfills/native-shim.coffee +12 -3
- metadata +23 -23
- data/lib/assets/javascripts/tao/attribute_parser.coffee +0 -110
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 593f883fe5535ca2c421021fa06c51df7ae7651f
|
4
|
+
data.tar.gz: d5b2ddb46cec54946270deaa71214a449ac83c00
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 83ab490a10967d6bbd5f5e6a7fa16ae99773fc02e9e2520bb4f3ca984c1e4cd18ab7e244a9e20e2d27bbb12096a049b38f4462e30cee7f908c50f0a6d8b66d02
|
7
|
+
data.tar.gz: 58e2422623a70bdba6c7ed854c02d51f2addbf2244e5b4bb9d6c08d9fd5de67cf4318c8ae8dacbd903d99b9b94be786f6c76ad6cdf5805c3c39fa8e25a7adf30
|
data/Rakefile
CHANGED
@@ -0,0 +1,94 @@
|
|
1
|
+
#= require ./module
|
2
|
+
|
3
|
+
manager = null
|
4
|
+
|
5
|
+
class TaoAttributeManager extends TaoModule
|
6
|
+
|
7
|
+
@defaultOptions =
|
8
|
+
type: 'string'
|
9
|
+
|
10
|
+
@getManager: ->
|
11
|
+
manager ||= new TaoAttributeManager()
|
12
|
+
|
13
|
+
@getAttribute: (element, name, options) ->
|
14
|
+
manager = @getManager()
|
15
|
+
options = _.extend {}, @defaultOptions, options
|
16
|
+
manager._attributes[_.camelCase(options.type)]?.get element, name, options
|
17
|
+
|
18
|
+
@setAttribute: (element, name, val, options) ->
|
19
|
+
manager = @getManager()
|
20
|
+
options = _.extend {}, @defaultOptions, options
|
21
|
+
manager._attributes[_.camelCase(options.type)]?.set element, name, val, options
|
22
|
+
|
23
|
+
_attributes: {}
|
24
|
+
|
25
|
+
@registerAttribute: (type, config) ->
|
26
|
+
if _.isString config
|
27
|
+
@::_attributes[type] = @::_attributes[config]
|
28
|
+
else
|
29
|
+
@::_attributes[type] = config
|
30
|
+
|
31
|
+
@registerAttribute 'string',
|
32
|
+
get: (element, name, options) ->
|
33
|
+
element.getAttribute(name) || options.default || ''
|
34
|
+
set: (element, name, val, options) ->
|
35
|
+
element.setAttribute(name, val.toString())
|
36
|
+
|
37
|
+
@registerAttribute 'number',
|
38
|
+
get: (element, name, options) ->
|
39
|
+
value = parseFloat element.getAttribute(name)
|
40
|
+
if _.isNaN value
|
41
|
+
options.default || null
|
42
|
+
else
|
43
|
+
value
|
44
|
+
set: (element, name, val, options) ->
|
45
|
+
element.setAttribute(name, val.toString())
|
46
|
+
|
47
|
+
@registerAttribute 'boolean',
|
48
|
+
get: (element, name, options) ->
|
49
|
+
element.hasAttribute(name)
|
50
|
+
set: (element, name, val, options) ->
|
51
|
+
if val
|
52
|
+
element.setAttribute name, ''
|
53
|
+
else
|
54
|
+
element.removeAttribute name
|
55
|
+
|
56
|
+
@registerAttribute 'bool', 'boolean'
|
57
|
+
|
58
|
+
@registerAttribute 'hash',
|
59
|
+
get: (element, name, options) ->
|
60
|
+
value = element.getAttribute name
|
61
|
+
if _.isString value
|
62
|
+
try
|
63
|
+
JSON.parse value
|
64
|
+
catch e
|
65
|
+
options.default || null
|
66
|
+
else
|
67
|
+
options.default || null
|
68
|
+
set: (element, name, val, options) ->
|
69
|
+
val = try
|
70
|
+
JSON.stringify val
|
71
|
+
catch e
|
72
|
+
'{}'
|
73
|
+
element.setAttribute name, val
|
74
|
+
|
75
|
+
@registerAttribute 'object', 'hash'
|
76
|
+
|
77
|
+
@registerAttribute 'array',
|
78
|
+
get: (element, name, options) ->
|
79
|
+
value = element.getAttribute name
|
80
|
+
if _.isString value
|
81
|
+
try
|
82
|
+
JSON.parse value
|
83
|
+
catch e
|
84
|
+
options.default || null
|
85
|
+
else
|
86
|
+
options.default || null
|
87
|
+
set: (element, name, val, options) ->
|
88
|
+
val = try
|
89
|
+
JSON.stringify val
|
90
|
+
catch e
|
91
|
+
'[]'
|
92
|
+
element.setAttribute name, val
|
93
|
+
|
94
|
+
Tao.AttributeManager = window.TaoAttributeManager = TaoAttributeManager
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#= require ./
|
1
|
+
#= require ./attribute_manager
|
2
2
|
|
3
3
|
components = {}
|
4
4
|
|
@@ -26,8 +26,8 @@ TaoComponentBasedOn = (superClassName = 'HTMLElement') ->
|
|
26
26
|
count = 0
|
27
27
|
|
28
28
|
@extend: (obj) ->
|
29
|
-
|
30
|
-
|
29
|
+
obj = obj.call(@) if _.isFunction obj
|
30
|
+
return unless obj and typeof obj == 'object'
|
31
31
|
|
32
32
|
for key, val of obj when key not in ['included', 'extended']
|
33
33
|
@[key] = val
|
@@ -36,8 +36,8 @@ TaoComponentBasedOn = (superClassName = 'HTMLElement') ->
|
|
36
36
|
@
|
37
37
|
|
38
38
|
@include: (obj) ->
|
39
|
-
|
40
|
-
|
39
|
+
obj = obj.call(@) if _.isFunction obj
|
40
|
+
return unless obj and typeof obj == 'object'
|
41
41
|
|
42
42
|
for key, val of obj when key not in ['included', 'extended']
|
43
43
|
@::[key] = val
|
@@ -64,18 +64,11 @@ TaoComponentBasedOn = (superClassName = 'HTMLElement') ->
|
|
64
64
|
attrName = _.kebabCase(name)
|
65
65
|
|
66
66
|
@get name, ->
|
67
|
-
|
68
|
-
@getAttribute(attrName)
|
69
|
-
else
|
70
|
-
null
|
71
|
-
TaoAttributeParser.parse val, options
|
67
|
+
Tao.AttributeManager.getAttribute @, attrName, options
|
72
68
|
|
73
69
|
@set name, (val) ->
|
74
|
-
|
75
|
-
|
76
|
-
@setAttribute attrName, val
|
77
|
-
else
|
78
|
-
@removeAttribute attrName
|
70
|
+
return if @_beforeAttributeChanged(attrName, val) == false
|
71
|
+
Tao.AttributeManager.setAttribute @, attrName, val, options
|
79
72
|
|
80
73
|
@observedAttributes.push(attrName) if options.observe
|
81
74
|
|
@@ -136,6 +129,9 @@ TaoComponentBasedOn = (superClassName = 'HTMLElement') ->
|
|
136
129
|
_disconnected: ->
|
137
130
|
# called when the element was disconnected from dom
|
138
131
|
|
132
|
+
_beforeAttributeChanged: (name, val) ->
|
133
|
+
@["_before#{_.upperFirst _.camelCase name}Changed"]?(val)
|
134
|
+
|
139
135
|
_attributeChanged: (name) ->
|
140
136
|
@["_#{_.camelCase name}Changed"]?()
|
141
137
|
|
@@ -149,17 +145,20 @@ TaoComponentBasedOn = (superClassName = 'HTMLElement') ->
|
|
149
145
|
findComponent: (selector, readyCallback) ->
|
150
146
|
component = @jq.find(selector).get(0)
|
151
147
|
if component.connected
|
152
|
-
|
148
|
+
# make sure element is returned before callback
|
149
|
+
setTimeout -> readyCallback? component
|
153
150
|
else
|
154
151
|
@one 'connected', selector, ->
|
155
152
|
readyCallback? component
|
156
153
|
component
|
157
154
|
|
158
|
-
on: (args...) ->
|
159
|
-
@
|
155
|
+
on: (name, args...) ->
|
156
|
+
name = "#{name}.#{@constructor._tag}-#{@taoId}" if name && name.indexOf('.') < 0
|
157
|
+
@jq.on name, args...
|
160
158
|
|
161
|
-
off: (args...) ->
|
162
|
-
@
|
159
|
+
off: (name = '', args...) ->
|
160
|
+
name = "#{name}.#{@constructor._tag}-#{@taoId}" if name.indexOf('.') < 0
|
161
|
+
@jq.off name, args...
|
163
162
|
|
164
163
|
trigger: (args...) ->
|
165
164
|
@jq.trigger(args...)
|
@@ -3,8 +3,8 @@ class TaoModule
|
|
3
3
|
id = 0
|
4
4
|
|
5
5
|
@extend: (obj) ->
|
6
|
-
|
7
|
-
|
6
|
+
obj = obj.call(@) if _.isFunction obj
|
7
|
+
return unless obj and typeof obj == 'object'
|
8
8
|
|
9
9
|
for key, val of obj when key not in ['included', 'extended']
|
10
10
|
@[key] = val
|
@@ -13,8 +13,8 @@ class TaoModule
|
|
13
13
|
@
|
14
14
|
|
15
15
|
@include: (obj) ->
|
16
|
-
|
17
|
-
|
16
|
+
obj = obj.call(@) if _.isFunction obj
|
17
|
+
return unless obj and typeof obj == 'object'
|
18
18
|
|
19
19
|
for key, val of obj when key not in ['included', 'extended']
|
20
20
|
@::[key] = val
|
@@ -2,37 +2,51 @@ module TaoOnRails
|
|
2
2
|
module Components
|
3
3
|
class Base
|
4
4
|
|
5
|
-
attr_reader :options, :
|
5
|
+
attr_reader :options, :view
|
6
|
+
|
7
|
+
delegate :tag_name, :component_name, :tag_prefix, :template_paths, :template_name, to: :class
|
6
8
|
|
7
9
|
def initialize view, options = {}
|
8
10
|
@view = view
|
9
|
-
@options = options
|
10
|
-
@
|
11
|
-
@template_paths = self.class.template_paths.dup
|
12
|
-
@template_paths.unshift(@options.delete(:template_path)) if @options[:template_path].present?
|
11
|
+
@options = merge_options default_options, options
|
12
|
+
template_paths.unshift(@options.delete(:template_path)) if @options[:template_path].present?
|
13
13
|
end
|
14
14
|
|
15
15
|
def render &block
|
16
16
|
if template = find_template
|
17
|
+
render_template template, &block
|
18
|
+
else
|
19
|
+
view.content_tag tag_name, nil, html_options, &block
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def render_template(template, &block)
|
24
|
+
if template.is_a?(String) || template.is_a?(Symbol)
|
25
|
+
template = find_template(template)
|
26
|
+
end
|
27
|
+
|
28
|
+
if template
|
17
29
|
if block_given?
|
18
30
|
block_content = view.capture(&block)
|
19
|
-
template.render(view, {component: self, block_given: true}) do
|
20
|
-
block_content
|
31
|
+
template.render(view, {component: self, block_given: true}) do |*name|
|
32
|
+
view._layout_for(*name) {block_content}
|
21
33
|
end
|
22
34
|
else
|
23
35
|
template.render(view, {component: self})
|
24
36
|
end
|
25
|
-
else
|
26
|
-
view.content_tag self.class.tag_name, nil, options, &block
|
27
37
|
end
|
28
38
|
end
|
29
39
|
|
30
|
-
def translate key
|
40
|
+
def translate key, options = {}
|
31
41
|
i18n_scope = self.class.name.underscore.split('/').join('.').gsub(/(.+)_component$/, '\1')
|
32
|
-
I18n.t(key, scope: i18n_scope).presence
|
42
|
+
I18n.t(key, options.merge!(scope: i18n_scope)).presence
|
33
43
|
end
|
34
44
|
alias_method :t, :translate
|
35
45
|
|
46
|
+
def html_options
|
47
|
+
@html_options ||= transform_html_options options
|
48
|
+
end
|
49
|
+
|
36
50
|
def self.tag_name
|
37
51
|
@tag_name ||= "#{self.tag_prefix}-#{self.component_name.to_s.dasherize}"
|
38
52
|
end
|
@@ -60,8 +74,45 @@ module TaoOnRails
|
|
60
74
|
|
61
75
|
private
|
62
76
|
|
63
|
-
def
|
64
|
-
|
77
|
+
def default_options
|
78
|
+
{}
|
79
|
+
end
|
80
|
+
|
81
|
+
def merge_options options, other_options
|
82
|
+
options.merge(other_options) { |key, old_val, new_val|
|
83
|
+
if key.to_s == 'class'
|
84
|
+
old_val = old_val.split(' ') if old_val.is_a? String
|
85
|
+
new_val = new_val.split(' ') if new_val.is_a? String
|
86
|
+
Array(old_val) + Array(new_val)
|
87
|
+
elsif old_val.is_a?(Hash) && old_val.is_a?(Hash)
|
88
|
+
old_val.merge! new_val
|
89
|
+
else
|
90
|
+
new_val
|
91
|
+
end
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
def transform_html_options options, other_options = nil
|
96
|
+
if other_options
|
97
|
+
options = merge_options options, other_options
|
98
|
+
end
|
99
|
+
|
100
|
+
options.transform_keys { |key|
|
101
|
+
key.to_s.dasherize.to_sym
|
102
|
+
}.transform_values { |value|
|
103
|
+
case value
|
104
|
+
when true
|
105
|
+
''
|
106
|
+
when false
|
107
|
+
nil
|
108
|
+
else
|
109
|
+
value
|
110
|
+
end
|
111
|
+
}
|
112
|
+
end
|
113
|
+
|
114
|
+
def find_template(name = template_name)
|
115
|
+
view.lookup_context.find_all(name, template_paths, true, template_keys).first
|
65
116
|
end
|
66
117
|
|
67
118
|
def template_keys
|
@@ -3,17 +3,11 @@ require 'tao_on_rails/components/base'
|
|
3
3
|
module TaoOnRails
|
4
4
|
module Components
|
5
5
|
class PageComponent < Base
|
6
|
+
attr_reader :page_id
|
6
7
|
|
7
8
|
def initialize view, options = {}
|
8
|
-
super
|
9
|
-
|
10
9
|
@page_id = view.page_id
|
11
|
-
|
12
|
-
if @options[:class].present?
|
13
|
-
@options[:class] += " tao-page #{@page_id}-page"
|
14
|
-
else
|
15
|
-
@options[:class] = "tao-page #{@page_id}-page"
|
16
|
-
end
|
10
|
+
super
|
17
11
|
end
|
18
12
|
|
19
13
|
def render &block
|
@@ -24,6 +18,12 @@ module TaoOnRails
|
|
24
18
|
:page
|
25
19
|
end
|
26
20
|
|
21
|
+
private
|
22
|
+
|
23
|
+
def default_options
|
24
|
+
{class: ['tao-page', "#{@page_id}-page"]}
|
25
|
+
end
|
26
|
+
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/tao_on_rails/version.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
(function(){
|
2
|
-
'use strict';var g={scope
|
2
|
+
'use strict';var g=g||{};g.scope={};g.defineProperty="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,f){if(f.get||f.set)throw new TypeError("ES3 does not support getters and setters.");a!=Array.prototype&&a!=Object.prototype&&(a[b]=f.value)};g.getGlobal=function(a){return"undefined"!=typeof window&&window===a?a:"undefined"!=typeof global&&null!=global?global:a};g.global=g.getGlobal(this);g.SYMBOL_PREFIX="jscomp_symbol_";
|
3
3
|
g.initSymbol=function(){g.initSymbol=function(){};g.global.Symbol||(g.global.Symbol=g.Symbol)};g.symbolCounter_=0;g.Symbol=function(a){return g.SYMBOL_PREFIX+(a||"")+g.symbolCounter_++};g.initSymbolIterator=function(){g.initSymbol();var a=g.global.Symbol.iterator;a||(a=g.global.Symbol.iterator=g.global.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&g.defineProperty(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return g.arrayIterator(this)}});g.initSymbolIterator=function(){}};
|
4
4
|
g.arrayIterator=function(a){var b=0;return g.iteratorPrototype(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})};g.iteratorPrototype=function(a){g.initSymbolIterator();a={next:a};a[g.global.Symbol.iterator]=function(){return this};return a};g.makeIterator=function(a){g.initSymbolIterator();var b=a[Symbol.iterator];return b?b.call(a):g.arrayIterator(a)};g.owns=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)};
|
5
5
|
g.polyfill=function(a,b){if(b){var f=g.global;a=a.split(".");for(var e=0;e<a.length-1;e++){var c=a[e];c in f||(f[c]={});f=f[c]}a=a[a.length-1];e=f[a];b=b(e);b!=e&&null!=b&&g.defineProperty(f,a,{configurable:!0,writable:!0,value:b})}};
|
6
6
|
g.polyfill("WeakMap",function(a){function b(a){this.id_=(d+=Math.random()+1).toString();if(a){g.initSymbol();g.initSymbolIterator();a=g.makeIterator(a);for(var b;!(b=a.next()).done;)b=b.value,this.set(b[0],b[1])}}function f(a){g.owns(a,c)||g.defineProperty(a,c,{value:{}})}function e(a){var b=Object[a];b&&(Object[a]=function(a){f(a);return b(a)})}if(function(){if(!a||!Object.seal)return!1;try{var b=Object.seal({}),d=Object.seal({}),c=new a([[b,2],[d,3]]);if(2!=c.get(b)||3!=c.get(d))return!1;c.delete(b);
|
7
7
|
c.set(d,4);return!c.has(b)&&4==c.get(d)}catch(v){return!1}}())return a;var c="$jscomp_hidden_"+Math.random().toString().substring(2);e("freeze");e("preventExtensions");e("seal");var d=0;b.prototype.set=function(a,b){f(a);if(!g.owns(a,c))throw Error("WeakMap key fail: "+a);a[c][this.id_]=b;return this};b.prototype.get=function(a){return g.owns(a,c)?a[c][this.id_]:void 0};b.prototype.has=function(a){return g.owns(a,c)&&g.owns(a[c],this.id_)};b.prototype.delete=function(a){return g.owns(a,c)&&g.owns(a[c],
|
8
|
-
this.id_)?delete a[c][this.id_]:!1};return b},"es6-impl","es3");g.ASSUME_NO_NATIVE_MAP=!1;
|
8
|
+
this.id_)?delete a[c][this.id_]:!1};return b},"es6-impl","es3");g.MapEntry=function(){};g.ASSUME_NO_NATIVE_MAP=!1;
|
9
9
|
g.polyfill("Map",function(a){function b(){var a={};return a.previous=a.next=a.head=a}function f(a,b){var d=a.head_;return g.iteratorPrototype(function(){if(d){for(;d.head!=a.head_;)d=d.previous;for(;d.next!=d.head;)return d=d.next,{done:!1,value:b(d)};d=null}return{done:!0,value:void 0}})}function e(a,b){var c;c=b&&typeof b;"object"==c||"function"==c?d.has(b)?c=d.get(b):(c=""+ ++m,d.set(b,c)):c="p_"+b;var f=a.data_[c];if(f&&g.owns(a.data_,c))for(a=0;a<f.length;a++){var e=f[a];if(b!==b&&e.key!==e.key||
|
10
10
|
b===e.key)return{id:c,list:f,index:a,entry:e}}return{id:c,list:f,index:-1,entry:void 0}}function c(a){this.data_={};this.head_=b();this.size=0;if(a){a=g.makeIterator(a);for(var d;!(d=a.next()).done;)d=d.value,this.set(d[0],d[1])}}if(!g.ASSUME_NO_NATIVE_MAP&&function(){if(!a||!a.prototype.entries||"function"!=typeof Object.seal)return!1;try{var b=Object.seal({x:4}),d=new a(g.makeIterator([[b,"s"]]));if("s"!=d.get(b)||1!=d.size||d.get({x:4})||d.set({x:4},"t")!=d||2!=d.size)return!1;var c=d.entries(),
|
11
|
-
f=c.next();if(f.done||f.value[0]!=b||"s"!=f.value[1])return!1;f=c.next();return f.done||4!=f.value[0].x||"t"!=f.value[1]||!c.next().done?!1:!0}catch(
|
11
|
+
f=c.next();if(f.done||f.value[0]!=b||"s"!=f.value[1])return!1;f=c.next();return f.done||4!=f.value[0].x||"t"!=f.value[1]||!c.next().done?!1:!0}catch(Q){return!1}}())return a;g.initSymbol();g.initSymbolIterator();var d=new WeakMap;c.prototype.set=function(a,b){var d=e(this,a);d.list||(d.list=this.data_[d.id]=[]);d.entry?d.entry.value=b:(d.entry={next:this.head_,previous:this.head_.previous,head:this.head_,key:a,value:b},d.list.push(d.entry),this.head_.previous.next=d.entry,this.head_.previous=d.entry,
|
12
12
|
this.size++);return this};c.prototype.delete=function(a){a=e(this,a);return a.entry&&a.list?(a.list.splice(a.index,1),a.list.length||delete this.data_[a.id],a.entry.previous.next=a.entry.next,a.entry.next.previous=a.entry.previous,a.entry.head=null,this.size--,!0):!1};c.prototype.clear=function(){this.data_={};this.head_=this.head_.previous=b();this.size=0};c.prototype.has=function(a){return!!e(this,a).entry};c.prototype.get=function(a){return(a=e(this,a).entry)&&a.value};c.prototype.entries=function(){return f(this,
|
13
13
|
function(a){return[a.key,a.value]})};c.prototype.keys=function(){return f(this,function(a){return a.key})};c.prototype.values=function(){return f(this,function(a){return a.value})};c.prototype.forEach=function(a,b){for(var d=this.entries(),c;!(c=d.next()).done;)c=c.value,a.call(b,c[1],c[0],this)};c.prototype[Symbol.iterator]=c.prototype.entries;var m=0;return c},"es6-impl","es3");g.ASSUME_NO_NATIVE_SET=!1;
|
14
14
|
g.polyfill("Set",function(a){function b(a){this.map_=new Map;if(a){a=g.makeIterator(a);for(var b;!(b=a.next()).done;)this.add(b.value)}this.size=this.map_.size}if(!g.ASSUME_NO_NATIVE_SET&&function(){if(!a||!a.prototype.entries||"function"!=typeof Object.seal)return!1;try{var b=Object.seal({x:4}),e=new a(g.makeIterator([b]));if(!e.has(b)||1!=e.size||e.add(b)!=e||1!=e.size||e.add({x:4})!=e||2!=e.size)return!1;var c=e.entries(),d=c.next();if(d.done||d.value[0]!=b||d.value[1]!=b)return!1;d=c.next();return d.done||
|
@@ -33,7 +33,7 @@ null!==c&&this.attributeChangedCallback(a,e,null,c,null)}n.isConnected(a)&&this.
|
|
33
33
|
x.prototype.attributeChangedCallback=function(a,b,f,e,c){var d=a.__CE_definition;d.attributeChangedCallback&&-1<d.observedAttributes.indexOf(b)&&d.attributeChangedCallback.call(a,b,f,e,c)};w.default=x;var y={};function z(a,b){this._internals=a;this._document=b;this._observer=void 0;this._internals.patchAndUpgradeTree(this._document);"loading"===this._document.readyState&&(this._observer=new MutationObserver(this._handleMutations.bind(this)),this._observer.observe(this._document,{childList:!0,subtree:!0}))}z.prototype.disconnect=function(){this._observer&&this._observer.disconnect()};
|
34
34
|
z.prototype._handleMutations=function(a){var b=this._document.readyState;"interactive"!==b&&"complete"!==b||this.disconnect();for(b=0;b<a.length;b++)for(var f=a[b].addedNodes,e=0;e<f.length;e++)this._internals.patchAndUpgradeTree(f[e])};y.default=z;var A={};function B(){var a=this;this._resolve=this._value=void 0;this._promise=new Promise(function(b){a._resolve=b;a._value&&b(a._value)})}B.prototype.resolve=function(a){if(this._value)throw Error("Already resolved.");this._value=a;this._resolve&&this._resolve(a)};B.prototype.toPromise=function(){return this._promise};A.default=B;var C={};function D(a){this._elementDefinitionIsRunning=!1;this._internals=a;this._whenDefinedDeferred=new Map;this._flushCallback=function(a){return a()};this._flushPending=!1;this._unflushedLocalNames=[];this._documentConstructionObserver=new y.default(a,document)}
|
35
35
|
D.prototype.define=function(a,b){var f=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!n.isValidCustomElementName(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this._internals.localNameToDefinition(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this._elementDefinitionIsRunning)throw Error("A custom element is already being defined.");this._elementDefinitionIsRunning=!0;var e,c,d,m,
|
36
|
-
l;try{var q=function(a){var b=v[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");return b},v=b.prototype;if(!(v instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");e=q("connectedCallback");c=q("disconnectedCallback");d=q("adoptedCallback");m=q("attributeChangedCallback");l=b.observedAttributes||[]}catch(
|
36
|
+
l;try{var q=function(a){var b=v[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");return b},v=b.prototype;if(!(v instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");e=q("connectedCallback");c=q("disconnectedCallback");d=q("adoptedCallback");m=q("attributeChangedCallback");l=b.observedAttributes||[]}catch(P){return}finally{this._elementDefinitionIsRunning=!1}this._internals.setDefinition(a,{localName:a,
|
37
37
|
constructor:b,connectedCallback:e,disconnectedCallback:c,adoptedCallback:d,attributeChangedCallback:m,observedAttributes:l,constructionStack:[]});this._unflushedLocalNames.push(a);this._flushPending||(this._flushPending=!0,this._flushCallback(function(){return f._flush()}))};
|
38
38
|
D.prototype._flush=function(){if(!1!==this._flushPending)for(this._flushPending=!1,this._internals.patchAndUpgradeTree(document);0<this._unflushedLocalNames.length;){var a=this._unflushedLocalNames.shift();(a=this._whenDefinedDeferred.get(a))&&a.resolve(void 0)}};D.prototype.get=function(a){if(a=this._internals.localNameToDefinition(a))return a.constructor};
|
39
39
|
D.prototype.whenDefined=function(a){if(!n.isValidCustomElementName(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this._whenDefinedDeferred.get(a);if(b)return b.toPromise();b=new A.default;this._whenDefinedDeferred.set(a,b);this._internals.localNameToDefinition(a)&&-1===this._unflushedLocalNames.indexOf(a)&&b.resolve(void 0);return b.toPromise()};
|
@@ -52,8 +52,8 @@ c);for(var e=0;e<d.length;e++)a.disconnectTree(d[e]);if(n.isConnected(this))for(
|
|
52
52
|
b.remove=function(){var b=n.isConnected(this);f.remove.call(this);b&&a.disconnectTree(this)}}};var M={default:function(a){function b(b,d){Object.defineProperty(b,"innerHTML",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){var c=this,e=void 0;n.isConnected(this)&&(e=[],n.walkDeepDescendantElements(this,function(a){a!==c&&e.push(a)}));d.set.call(this,b);if(e)for(var f=0;f<e.length;f++){var m=e[f];m.__CE_state===u.default.custom&&a.disconnectedCallback(m)}this.ownerDocument.__CE_hasRegistry?a.patchAndUpgradeTree(this):a.patchTree(this);return b}})}function f(b,d){n.setPropertyUnchecked(b,
|
53
53
|
"insertAdjacentElement",function(b,c){var e=n.isConnected(c);b=d.call(this,b,c);e&&a.disconnectTree(c);n.isConnected(b)&&a.connectTree(c);return b})}E.default.Element_attachShadow?n.setPropertyUnchecked(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=E.default.Element_attachShadow.call(this,a)}):console.warn("Custom Elements: `Element#attachShadow` was not patched.");if(E.default.Element_innerHTML&&E.default.Element_innerHTML.get)b(Element.prototype,E.default.Element_innerHTML);
|
54
54
|
else if(E.default.HTMLElement_innerHTML&&E.default.HTMLElement_innerHTML.get)b(HTMLElement.prototype,E.default.HTMLElement_innerHTML);else{var e=E.default.Document_createElement.call(document,"div");a.addPatch(function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return E.default.Node_cloneNode.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName?this.content:this;for(e.innerHTML=a;0<b.childNodes.length;)E.default.Node_removeChild.call(b,b.childNodes[0]);for(;0<e.childNodes.length;)E.default.Node_appendChild.call(b,
|
55
|
-
e.childNodes[0])}})})}n.setPropertyUnchecked(Element.prototype,"setAttribute",function(b,d){if(this.__CE_state!==u.default.custom)return E.default.Element_setAttribute.call(this,b,d);var c=E.default.Element_getAttribute.call(this,b);E.default.Element_setAttribute.call(this,b,d);d=E.default.Element_getAttribute.call(this,b);
|
56
|
-
b,d,e);var c=E.default.Element_getAttributeNS.call(this,b,d);E.default.Element_setAttributeNS.call(this,b,d,e);e=E.default.Element_getAttributeNS.call(this,b,d);
|
55
|
+
e.childNodes[0])}})})}n.setPropertyUnchecked(Element.prototype,"setAttribute",function(b,d){if(this.__CE_state!==u.default.custom)return E.default.Element_setAttribute.call(this,b,d);var c=E.default.Element_getAttribute.call(this,b);E.default.Element_setAttribute.call(this,b,d);d=E.default.Element_getAttribute.call(this,b);a.attributeChangedCallback(this,b,c,d,null)});n.setPropertyUnchecked(Element.prototype,"setAttributeNS",function(b,d,e){if(this.__CE_state!==u.default.custom)return E.default.Element_setAttributeNS.call(this,
|
56
|
+
b,d,e);var c=E.default.Element_getAttributeNS.call(this,b,d);E.default.Element_setAttributeNS.call(this,b,d,e);e=E.default.Element_getAttributeNS.call(this,b,d);a.attributeChangedCallback(this,d,c,e,b)});n.setPropertyUnchecked(Element.prototype,"removeAttribute",function(b){if(this.__CE_state!==u.default.custom)return E.default.Element_removeAttribute.call(this,b);var c=E.default.Element_getAttribute.call(this,b);E.default.Element_removeAttribute.call(this,b);null!==c&&a.attributeChangedCallback(this,
|
57
57
|
b,c,null,null)});n.setPropertyUnchecked(Element.prototype,"removeAttributeNS",function(b,d){if(this.__CE_state!==u.default.custom)return E.default.Element_removeAttributeNS.call(this,b,d);var c=E.default.Element_getAttributeNS.call(this,b,d);E.default.Element_removeAttributeNS.call(this,b,d);var e=E.default.Element_getAttributeNS.call(this,b,d);c!==e&&a.attributeChangedCallback(this,d,c,e,b)});E.default.HTMLElement_insertAdjacentElement?f(HTMLElement.prototype,E.default.HTMLElement_insertAdjacentElement):
|
58
58
|
E.default.Element_insertAdjacentElement?f(Element.prototype,E.default.Element_insertAdjacentElement):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");I.default(a,Element.prototype,{prepend:E.default.Element_prepend,append:E.default.Element_append});L.default(a,Element.prototype,{before:E.default.Element_before,after:E.default.Element_after,replaceWith:E.default.Element_replaceWith,remove:E.default.Element_remove})}};/*
|
59
59
|
|
@@ -64,5 +64,5 @@ E.default.Element_insertAdjacentElement?f(Element.prototype,E.default.Element_in
|
|
64
64
|
Code distributed by Google as part of the polymer project is also
|
65
65
|
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
|
66
66
|
*/
|
67
|
-
var N=window.customElements;if(
|
67
|
+
var N=window.customElements;if(!N||N.forcePolyfill||"function"!=typeof N.define||"function"!=typeof N.get){var O=new w.default;H.default(O);J.default(O);K.default(O);M.default(O);document.__CE_hasRegistry=!0;var customElements=new C.default(O);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};
|
68
68
|
}).call(self);
|
File without changes
|
@@ -68,7 +68,7 @@ if window.customElements
|
|
68
68
|
// ptototype chain of built-in elements.
|
69
69
|
window.HTMLElement.prototype = NativeHTMLElement.prototype;
|
70
70
|
|
71
|
-
|
71
|
+
const define = (tagname, elementClass) => {
|
72
72
|
const elementProto = elementClass.prototype;
|
73
73
|
const StandInElement = class extends NativeHTMLElement {
|
74
74
|
constructor() {
|
@@ -102,7 +102,16 @@ if window.customElements
|
|
102
102
|
nativeDefine.call(window.customElements, tagname, StandInElement);
|
103
103
|
};
|
104
104
|
|
105
|
-
|
105
|
+
const get = (tagname) => constructorByTagname.get(tagname);
|
106
|
+
|
107
|
+
// Workaround for Safari bug where patching customElements can be lost, likely
|
108
|
+
// due to native wrapper garbage collection issue
|
109
|
+
Object.defineProperty(window, 'customElements',
|
110
|
+
{value: window.customElements, configurable: true, writable: true});
|
111
|
+
Object.defineProperty(window.customElements, 'define',
|
112
|
+
{value: define, configurable: true, writable: true});
|
113
|
+
Object.defineProperty(window.customElements, 'get',
|
114
|
+
{value: get, configurable: true, writable: true});
|
106
115
|
|
107
116
|
})();
|
108
|
-
|
117
|
+
'''
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tao_on_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Siyuan Liu
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-06-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: turbolinks
|
@@ -17,70 +17,70 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 5.0.1
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 5.0.1
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: jquery-rails
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 4.3.1
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 4.3.1
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: lodash-rails
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 4.17.4
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 4.17.4
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rails
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 5.
|
62
|
+
version: 5.1.1
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 5.
|
69
|
+
version: 5.1.1
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: sqlite3
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- - "
|
74
|
+
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
76
|
+
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- - "
|
81
|
+
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
83
|
+
version: '0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: blade
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,28 +101,28 @@ dependencies:
|
|
101
101
|
requirements:
|
102
102
|
- - "~>"
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version: 0.
|
104
|
+
version: 0.7.0
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
109
|
- - "~>"
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version: 0.
|
111
|
+
version: 0.7.0
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
|
-
name:
|
113
|
+
name: mocha
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
116
|
- - "~>"
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
118
|
+
version: 1.2.1
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
125
|
+
version: 1.2.1
|
126
126
|
description: Ruby on Rails lacks a recommended way to structure your frontend code
|
127
127
|
for many years. Tao on Rails is the framework to fill the gap which will modularize
|
128
128
|
your page with the new Custom Elements v1 API.
|
@@ -137,7 +137,7 @@ files:
|
|
137
137
|
- README.md
|
138
138
|
- Rakefile
|
139
139
|
- lib/assets/javascripts/tao/application.coffee
|
140
|
-
- lib/assets/javascripts/tao/
|
140
|
+
- lib/assets/javascripts/tao/attribute_manager.coffee
|
141
141
|
- lib/assets/javascripts/tao/component.coffee
|
142
142
|
- lib/assets/javascripts/tao/helpers.coffee
|
143
143
|
- lib/assets/javascripts/tao/index.coffee
|
@@ -186,8 +186,8 @@ files:
|
|
186
186
|
- lib/tao_on_rails/engine.rb
|
187
187
|
- lib/tao_on_rails/version.rb
|
188
188
|
- vendor/assets/javascripts/polyfills/custom-elements.js
|
189
|
+
- vendor/assets/javascripts/polyfills/index.coffee
|
189
190
|
- vendor/assets/javascripts/polyfills/native-shim.coffee
|
190
|
-
- vendor/assets/javascripts/polyfills/polyfills.coffee
|
191
191
|
homepage: https://github.com/mycolorway/tao_on_rails
|
192
192
|
licenses:
|
193
193
|
- MIT
|
@@ -200,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
200
|
requirements:
|
201
201
|
- - ">="
|
202
202
|
- !ruby/object:Gem::Version
|
203
|
-
version:
|
203
|
+
version: 2.3.1
|
204
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - ">="
|
@@ -208,7 +208,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
208
208
|
version: '0'
|
209
209
|
requirements: []
|
210
210
|
rubyforge_project:
|
211
|
-
rubygems_version: 2.
|
211
|
+
rubygems_version: 2.6.11
|
212
212
|
signing_key:
|
213
213
|
specification_version: 4
|
214
214
|
summary: The missing frontend solution for Rails project
|
@@ -1,110 +0,0 @@
|
|
1
|
-
#= require ./module
|
2
|
-
|
3
|
-
parser = null
|
4
|
-
|
5
|
-
class TaoAttributeParser extends TaoModule
|
6
|
-
|
7
|
-
@defaultOptions =
|
8
|
-
type: 'string'
|
9
|
-
|
10
|
-
@getParser: ->
|
11
|
-
parser ||= new TaoAttributeParser()
|
12
|
-
|
13
|
-
@parse: (value, options = {}) ->
|
14
|
-
parser = @getParser()
|
15
|
-
options = _.extend {}, @defaultOptions, options
|
16
|
-
if parse = parser["_#{_.camelCase "parse_#{options.type}"}"]
|
17
|
-
parse.call parser, value, options
|
18
|
-
else
|
19
|
-
value
|
20
|
-
|
21
|
-
@stringify: (value, options = {}) ->
|
22
|
-
parser = @getParser()
|
23
|
-
options = _.extend {}, @defaultOptions, options
|
24
|
-
if stringify = parser["_#{_.camelCase "stringify_#{options.type}"}"]
|
25
|
-
stringify.call parser, value, options
|
26
|
-
else
|
27
|
-
value
|
28
|
-
|
29
|
-
_parseString: (value, options) ->
|
30
|
-
value || options.default || ''
|
31
|
-
|
32
|
-
_parseNumber: (value, options) ->
|
33
|
-
value = parseFloat value
|
34
|
-
if _.isNaN value
|
35
|
-
options.default || 0
|
36
|
-
else
|
37
|
-
value
|
38
|
-
|
39
|
-
_parseBoolean: (value, options) ->
|
40
|
-
if _.isNil value
|
41
|
-
options.default || false
|
42
|
-
else if value == 'true'
|
43
|
-
true
|
44
|
-
else if value == 'false'
|
45
|
-
false
|
46
|
-
else
|
47
|
-
!!value
|
48
|
-
|
49
|
-
@aliasMethod '_parseBool', '_parseBoolean'
|
50
|
-
|
51
|
-
_parseHash: (value, options) ->
|
52
|
-
if _.isString value
|
53
|
-
try
|
54
|
-
JSON.parse value
|
55
|
-
catch e
|
56
|
-
options.default || null
|
57
|
-
else
|
58
|
-
options.default || null
|
59
|
-
|
60
|
-
@aliasMethod '_parseObject', '_parseHash'
|
61
|
-
|
62
|
-
_parseArray: (value, options) ->
|
63
|
-
if _.isString value
|
64
|
-
try
|
65
|
-
JSON.parse value
|
66
|
-
catch e
|
67
|
-
options.default || null
|
68
|
-
else
|
69
|
-
options.default || null
|
70
|
-
|
71
|
-
_stringifyString: (value, options) ->
|
72
|
-
value.toString()
|
73
|
-
|
74
|
-
_stringifyNumber: (value, options) ->
|
75
|
-
value.toString()
|
76
|
-
|
77
|
-
_stringifyBoolean: (value, options) ->
|
78
|
-
unless _.isBoolean value
|
79
|
-
value = options.default || false
|
80
|
-
|
81
|
-
if value == true
|
82
|
-
'true'
|
83
|
-
else if value == false
|
84
|
-
'false'
|
85
|
-
else
|
86
|
-
null
|
87
|
-
|
88
|
-
@aliasMethod '_stringifyBool', '_stringifyBoolean'
|
89
|
-
|
90
|
-
_stringifyHash: (value, options) ->
|
91
|
-
unless _.isObject value
|
92
|
-
value = options.default || {}
|
93
|
-
|
94
|
-
try
|
95
|
-
JSON.stringify value
|
96
|
-
catch e
|
97
|
-
'{}'
|
98
|
-
|
99
|
-
@aliasMethod '_stringifyObject', '_stringifyHash'
|
100
|
-
|
101
|
-
_stringifyArray: (value, options) ->
|
102
|
-
unless _.isObject value
|
103
|
-
value = options.default || []
|
104
|
-
|
105
|
-
try
|
106
|
-
JSON.stringify value
|
107
|
-
catch e
|
108
|
-
'[]'
|
109
|
-
|
110
|
-
Tao.AttributeParser = window.TaoAttributeParser = TaoAttributeParser
|