netzke-core 0.12.2 → 0.12.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +7 -0
- data/Gemfile +1 -1
- data/javascripts/ext.js +1 -1
- data/lib/netzke/base.rb +2 -0
- data/lib/netzke/core/actions.rb +17 -1
- data/lib/netzke/core/client_class.rb +1 -1
- data/lib/netzke/core/component_config.rb +1 -1
- data/lib/netzke/core/composition.rb +40 -17
- data/lib/netzke/core/configuration.rb +3 -17
- data/lib/netzke/core/dynamic_assets.rb +9 -3
- data/lib/netzke/core/javascript.rb +1 -1
- data/lib/netzke/core/railz/action_view_ext.rb +57 -29
- data/lib/netzke/core/ruby_ext/array.rb +12 -0
- data/lib/netzke/core/ruby_ext/hash.rb +27 -1
- data/lib/netzke/core/services.rb +1 -1
- data/lib/netzke/core/version.rb +1 -1
- metadata +2 -3
- data/lib/netzke/core/railz/action_view_ext/ext.rb +0 -49
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# v0.12.3 - 2015-08-09
|
2
|
+
* Get rid of Ext's viewport warning
|
3
|
+
* Uglify components' JS when not in the test/development env
|
4
|
+
* Fix stack overflow issue in certain cases
|
5
|
+
* Implement inline nesting of components
|
6
|
+
* xtype of Netzke components receives additional "netzke" prefix (may potentially break things if you explicitely refer to xtypes)
|
7
|
+
|
1
8
|
# v0.12.2 - 2015-06-06
|
2
9
|
* Fix loading multi-instance components
|
3
10
|
|
data/Gemfile
CHANGED
data/javascripts/ext.js
CHANGED
@@ -204,7 +204,7 @@ Ext.define(null, {
|
|
204
204
|
var parent = this;
|
205
205
|
while (parent) {
|
206
206
|
var cfg = Ext.clone(parent.netzkeClientConfig);
|
207
|
-
cfg.
|
207
|
+
cfg.component_id = parent.id;
|
208
208
|
this._parentClientConfig.unshift(cfg);
|
209
209
|
parent = parent.netzkeGetParentComponent();
|
210
210
|
}
|
data/lib/netzke/base.rb
CHANGED
data/lib/netzke/core/actions.rb
CHANGED
@@ -118,10 +118,26 @@ module Netzke::Core
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def extend_item(item)
|
121
|
-
super
|
121
|
+
super detect_and_normalize_action(item)
|
122
122
|
end
|
123
123
|
|
124
124
|
private
|
125
|
+
|
126
|
+
def detect_and_normalize_action(item)
|
127
|
+
item = {action: item} if item.is_a?(Symbol) && actions[item]
|
128
|
+
if item.is_a?(Hash) && action_name = item[:action]
|
129
|
+
cfg = actions[action_name]
|
130
|
+
cfg.merge!(item)
|
131
|
+
if cfg[:excluded]
|
132
|
+
{excluded: true}
|
133
|
+
else
|
134
|
+
item.merge(netzke_action: cfg[:action])
|
135
|
+
end
|
136
|
+
else
|
137
|
+
item
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
125
141
|
def uri_to_icon(icon)
|
126
142
|
self.class.uri_to_icon(icon)
|
127
143
|
end
|
@@ -153,7 +153,7 @@ module Netzke
|
|
153
153
|
# Builds this component's xtype
|
154
154
|
# E.g.: netzkebasepackwindow, netzkebasepackgridpanel
|
155
155
|
def xtype
|
156
|
-
@klass.name.gsub("::", "").downcase
|
156
|
+
"netzke" + @klass.name.gsub("::", "").downcase
|
157
157
|
end
|
158
158
|
|
159
159
|
# Component's JavaScript class declaration.
|
@@ -83,6 +83,8 @@ module Netzke::Core
|
|
83
83
|
# Declares Base.component, for declaring child componets, and Base#components, which returns a [Hash] of all component configs by name
|
84
84
|
declare_dsl_for :components, config_class: Netzke::Core::ComponentConfig
|
85
85
|
|
86
|
+
attr_accessor :components_in_config
|
87
|
+
|
86
88
|
# Loads a component on browser's request. Every Netzke component gets this endpoint.
|
87
89
|
# +params+ should contain:
|
88
90
|
# [cache] an array of component classes cached at the browser
|
@@ -116,29 +118,29 @@ module Netzke::Core
|
|
116
118
|
@eagerly_loaded_components ||= components.select{|k,v| components_in_config.include?(k) || v[:eager_loading]}
|
117
119
|
end
|
118
120
|
|
119
|
-
# @return [Array<Symbol>] components (by name) referred in config (and thus, required to be instantiated)
|
120
|
-
def components_in_config
|
121
|
-
@components_in_config || (normalize_config || true) && @components_in_config
|
122
|
-
end
|
123
|
-
|
124
121
|
# Instantiates a child component by its name.
|
125
122
|
# +params+ can contain:
|
126
123
|
# [client_config] a config hash passed from the client class
|
127
124
|
# [item_id] overridden item_id (used in case of multi-instance loading)
|
128
125
|
def component_instance(name, options = {})
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
126
|
+
if respond_to?(:"#{name}_component")
|
127
|
+
cfg = ComponentConfig.new(name, self)
|
128
|
+
cfg.client_config = options[:client_config] || {}
|
129
|
+
cfg.item_id = options[:item_id]
|
130
|
+
cfg.js_id = options[:js_id]
|
131
|
+
send("#{name}_component", cfg)
|
132
|
+
cfg.set_defaults!
|
133
|
+
else
|
134
|
+
cfg = ComponentConfig.new(name, self)
|
135
|
+
cfg.merge!(components[name.to_sym])
|
136
|
+
end
|
137
|
+
|
138
|
+
component_instance_from_config(cfg) if cfg
|
138
139
|
end
|
139
140
|
|
140
141
|
def component_instance_from_config(c)
|
141
|
-
c.klass.
|
142
|
+
klass = c.klass || c.class_name.constantize
|
143
|
+
klass.new(c, self)
|
142
144
|
end
|
143
145
|
|
144
146
|
# @return [Array<Class>] All component classes that we depend on (used to render all necessary javascripts and stylesheets)
|
@@ -154,8 +156,8 @@ module Netzke::Core
|
|
154
156
|
end
|
155
157
|
|
156
158
|
def extend_item(item)
|
157
|
-
item =
|
158
|
-
|
159
|
+
item = detect_and_normalize_component(item)
|
160
|
+
components_in_config << item[:netzke_component] if include_component?(item)
|
159
161
|
super item
|
160
162
|
end
|
161
163
|
|
@@ -167,5 +169,26 @@ module Netzke::Core
|
|
167
169
|
cmp_config[:eager_loading] != false &&
|
168
170
|
!cmp_config[:excluded]
|
169
171
|
end
|
172
|
+
|
173
|
+
def detect_and_normalize_component(item)
|
174
|
+
item = {component: item} if item.is_a?(Symbol) && components[item]
|
175
|
+
if item.is_a?(Hash) && component_name = item[:component]
|
176
|
+
cfg = components[component_name]
|
177
|
+
cfg.merge!(item)
|
178
|
+
if cfg[:excluded]
|
179
|
+
{excluded: true}
|
180
|
+
else
|
181
|
+
# cfg.merge(item).merge(netzke_component: item.delete(:component))
|
182
|
+
item.merge(netzke_component: cfg[:component]) # TODO: TEST THIS
|
183
|
+
end
|
184
|
+
elsif item.is_a?(Hash) && (item[:klass] || item[:class_name])
|
185
|
+
# declare component on the fly
|
186
|
+
component_name = :"component_#{@implicit_component_index += 1}"
|
187
|
+
components[component_name] = item.merge(eager_loading: true) unless item[:excluded]
|
188
|
+
{netzke_component: component_name}
|
189
|
+
else
|
190
|
+
item
|
191
|
+
end
|
192
|
+
end
|
170
193
|
end
|
171
194
|
end
|
@@ -102,33 +102,19 @@ module Netzke::Core
|
|
102
102
|
item.is_a?(Hash) && item[:excluded] ? nil : item
|
103
103
|
end
|
104
104
|
|
105
|
-
# Used for detecting actions and components referred by symbols. For example, say, action +do_something+ is
|
106
|
-
# declared. Then:
|
107
|
-
#
|
108
|
-
# item #=> :do_something
|
109
|
-
# item = detect_and_normalize :action, item
|
110
|
-
# item #=> {netzke_action: :do_something, text: 'Do it'} # uses action declaration
|
111
|
-
def detect_and_normalize(thing, item)
|
112
|
-
if item.is_a?(Symbol) && thing_config = send(thing.to_s.pluralize)[item]
|
113
|
-
item = {:"netzke_#{thing}" => item, excluded: thing_config[:excluded]}
|
114
|
-
elsif item.is_a?(Hash)
|
115
|
-
# replace `action` key with `netzke_action`, which will be looked for at the JS side
|
116
|
-
item[:"netzke_#{thing}"] = item.delete(thing) if item[thing]
|
117
|
-
end
|
118
|
-
item
|
119
|
-
end
|
120
|
-
|
121
105
|
# We'll build a couple of useful instance variables here:
|
122
106
|
#
|
123
107
|
# +components_in_config+ - an array of components (by name) referred in items
|
124
108
|
# +normalized_config+ - a config that has all the config extensions applied
|
125
109
|
def normalize_config
|
110
|
+
# @actions = @components = {} # in v1.0 this should replace DSL definition
|
126
111
|
@components_in_config = []
|
112
|
+
@implicit_component_index = 0
|
127
113
|
c = config.dup
|
128
114
|
config.each_pair do |k, v|
|
129
115
|
c.delete(k) if self.class.server_side_config_options.include?(k.to_sym)
|
130
116
|
if v.is_a?(Array)
|
131
|
-
c[k] = v.
|
117
|
+
c[k] = v.netzke_deep_replace{|el| extend_item(el)}
|
132
118
|
end
|
133
119
|
end
|
134
120
|
@normalized_config = c
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'uglifier'
|
2
|
+
|
1
3
|
module Netzke
|
2
4
|
module Core
|
3
5
|
module DynamicAssets
|
@@ -16,7 +18,7 @@ module Netzke
|
|
16
18
|
res << f.read
|
17
19
|
end
|
18
20
|
|
19
|
-
|
21
|
+
minify_js(res)
|
20
22
|
end
|
21
23
|
|
22
24
|
def ext_css
|
@@ -31,8 +33,12 @@ module Netzke
|
|
31
33
|
res
|
32
34
|
end
|
33
35
|
|
34
|
-
def
|
35
|
-
|
36
|
+
def minify_js(js_string)
|
37
|
+
if ::Rails.env.test? || ::Rails.env.development?
|
38
|
+
js_string
|
39
|
+
else
|
40
|
+
Uglifier.compile(js_string)
|
41
|
+
end
|
36
42
|
end
|
37
43
|
|
38
44
|
private
|
@@ -106,7 +106,7 @@ module Netzke::Core
|
|
106
106
|
code = dependency_classes.inject("") do |r,k|
|
107
107
|
cached.include?(k.js_config.xtype) ? r : r + k.js_config.code_with_dependencies
|
108
108
|
end
|
109
|
-
code.blank? ? nil : Netzke::Core::DynamicAssets.
|
109
|
+
code.blank? ? nil : Netzke::Core::DynamicAssets.minify_js(code)
|
110
110
|
end
|
111
111
|
|
112
112
|
private
|
@@ -1,9 +1,6 @@
|
|
1
|
-
require 'netzke/core/railz/action_view_ext/ext'
|
2
1
|
module Netzke
|
3
2
|
module Railz
|
4
3
|
module ActionViewExt
|
5
|
-
include Ext
|
6
|
-
|
7
4
|
# A helper to load Netzke and Ext JS files. Usually used in the layout.
|
8
5
|
#
|
9
6
|
# Params:
|
@@ -23,11 +20,10 @@ module Netzke
|
|
23
20
|
# Whether to include minified JS and styleshetes. By default is +false+ for Rails development env,
|
24
21
|
# +true+ otherwise
|
25
22
|
def load_netzke(params = {})
|
26
|
-
Netzke::Core.platform = params[:platform] || :ext
|
27
23
|
params[:minified] = !Rails.env.development? if params[:minified].nil?
|
28
24
|
params[:theme] ||= "crisp"
|
29
25
|
|
30
|
-
raw([netzke_css_include(params), netzke_css(params), netzke_js_include(params), netzke_js(params)].join("\n"))
|
26
|
+
raw([netzke_html, netzke_css_include(params), netzke_css(params), netzke_js_include(params), netzke_js(params)].join("\n"))
|
31
27
|
end
|
32
28
|
|
33
29
|
# Use this helper in your views to embed Netzke components. E.g.:
|
@@ -64,30 +60,62 @@ module Netzke
|
|
64
60
|
raw(cmp.js_component_html)
|
65
61
|
end
|
66
62
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
63
|
+
private
|
64
|
+
|
65
|
+
def netzke_html
|
66
|
+
%{
|
67
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
# Link tags for all the required stylsheets
|
72
|
+
def netzke_css_include(params)
|
73
|
+
# ExtJS base
|
74
|
+
res = ["#{Netzke::Core.ext_uri}/packages/ext-theme-#{params[:theme]}/build/resources/ext-theme-#{params[:theme]}-all.css"]
|
75
|
+
|
76
|
+
# Netzke-related dynamic css
|
77
|
+
res << netzke_ext_path
|
78
|
+
|
79
|
+
res += Netzke::Core.external_ext_css
|
80
|
+
|
81
|
+
stylesheet_link_tag(*res)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Inline CSS specific for the page
|
85
|
+
def netzke_css(params)
|
86
|
+
%{
|
87
|
+
<style type="text/css" media="screen">
|
88
|
+
#{content_for(:netzke_css)}
|
89
|
+
</style>} if content_for(:netzke_css).present?
|
90
|
+
end
|
91
|
+
|
92
|
+
# Script tags for all the required JavaScript
|
93
|
+
def netzke_js_include(params)
|
94
|
+
res = []
|
95
|
+
|
96
|
+
# ExtJS
|
97
|
+
res << (params[:minified] ? "#{Netzke::Core.ext_uri}/build/ext-all.js" : "#{Netzke::Core.ext_uri}/build/ext-all-debug.js")
|
98
|
+
|
99
|
+
# Ext I18n
|
100
|
+
res << "#{Netzke::Core.ext_uri}/packages/ext-locale/build/ext-locale-#{I18n.locale}" if I18n.locale != :en
|
101
|
+
|
102
|
+
# Netzke-related dynamic JavaScript
|
103
|
+
res << netzke_ext_path
|
104
|
+
|
105
|
+
javascript_include_tag(*res)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Inline JavaScript for all Netzke classes on the page, as well as Ext.onReady, which renders Netzke components in this view after the page is loaded
|
109
|
+
def netzke_js(params = {})
|
110
|
+
res = []
|
111
|
+
res << content_for(:netzke_js_classes)
|
112
|
+
|
113
|
+
res << "Ext.onReady(function(){"
|
114
|
+
res << content_for(:netzke_on_ready)
|
115
|
+
res << "});"
|
116
|
+
|
117
|
+
javascript_tag(res.join("\n"))
|
118
|
+
end
|
91
119
|
|
92
120
|
end
|
93
121
|
|
@@ -3,6 +3,18 @@ class Array
|
|
3
3
|
self.map{ |el| el.respond_to?(:netzke_deep_map) ? block.call(el.netzke_deep_map(&block)) : block.call(el) }.compact
|
4
4
|
end
|
5
5
|
|
6
|
+
def netzke_deep_replace(&block)
|
7
|
+
self.map do |el|
|
8
|
+
res = yield(el)
|
9
|
+
if res == el
|
10
|
+
el.respond_to?(:netzke_deep_replace) ? el.netzke_deep_replace(&block) : el
|
11
|
+
# el.respond_to?(:netzke_deep_replace) ? block.call(el.netzke_deep_replace(&block)) : block.call(el)
|
12
|
+
else
|
13
|
+
res
|
14
|
+
end
|
15
|
+
end.compact
|
16
|
+
end
|
17
|
+
|
6
18
|
def netzke_jsonify
|
7
19
|
self.map{ |el| el.is_a?(Array) || el.is_a?(Hash) ? el.netzke_jsonify : el }
|
8
20
|
end
|
@@ -7,6 +7,25 @@ class Hash
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
+
def netzke_deep_replace(&block)
|
11
|
+
self.dup.tap do |h|
|
12
|
+
h.each_pair do |k,v|
|
13
|
+
if v.is_a?(Hash)
|
14
|
+
res = yield(v)
|
15
|
+
if res == v # no changes, need to go further down
|
16
|
+
h[k] = v.netzke_deep_replace(&block) if v.respond_to?('netzke_deep_replace')
|
17
|
+
else
|
18
|
+
h[k] = res
|
19
|
+
end
|
20
|
+
else
|
21
|
+
if v.is_a?(Array)
|
22
|
+
h[k] = v.netzke_deep_replace(&block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
10
29
|
def netzke_jsonify
|
11
30
|
self.inject({}) do |h,(k,v)|
|
12
31
|
new_key = if k.is_a?(Netzke::Core::JsonLiteral)
|
@@ -19,7 +38,14 @@ class Hash
|
|
19
38
|
k
|
20
39
|
end
|
21
40
|
|
22
|
-
new_value =
|
41
|
+
new_value = case v
|
42
|
+
when Array, Hash
|
43
|
+
v.netzke_jsonify
|
44
|
+
when Class, Proc
|
45
|
+
v.to_s
|
46
|
+
else
|
47
|
+
v
|
48
|
+
end
|
23
49
|
|
24
50
|
h.merge(new_key => new_value)
|
25
51
|
end
|
data/lib/netzke/core/services.rb
CHANGED
@@ -119,7 +119,7 @@ module Netzke::Core
|
|
119
119
|
|
120
120
|
if components[child_component]
|
121
121
|
client_config = configs.shift || {}
|
122
|
-
js_id = client_config.delete("
|
122
|
+
js_id = client_config.delete("component_id")
|
123
123
|
cmp_strong_config = {client_config: client_config, js_id: js_id}
|
124
124
|
component_instance(child_component, cmp_strong_config).invoke_endpoint(action, params, configs)
|
125
125
|
else
|
data/lib/netzke/core/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netzke-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.3
|
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: 2015-
|
12
|
+
date: 2015-08-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: uglifier
|
@@ -72,7 +72,6 @@ files:
|
|
72
72
|
- lib/netzke/core/json_literal.rb
|
73
73
|
- lib/netzke/core/panel.rb
|
74
74
|
- lib/netzke/core/plugins.rb
|
75
|
-
- lib/netzke/core/railz/action_view_ext/ext.rb
|
76
75
|
- lib/netzke/core/railz/action_view_ext.rb
|
77
76
|
- lib/netzke/core/railz/controller_extensions.rb
|
78
77
|
- lib/netzke/core/railz/engine.rb
|
@@ -1,49 +0,0 @@
|
|
1
|
-
module Netzke
|
2
|
-
module Railz
|
3
|
-
module ActionViewExt
|
4
|
-
# Implementation of Ext-specific Netzke helpers
|
5
|
-
module Ext
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
def netzke_ext_css_include(params)
|
10
|
-
# ExtJS base
|
11
|
-
res = ["#{Netzke::Core.ext_uri}/packages/ext-theme-#{params[:theme]}/build/resources/ext-theme-#{params[:theme]}-all.css"]
|
12
|
-
|
13
|
-
# Netzke-related dynamic css
|
14
|
-
res << netzke_ext_path
|
15
|
-
|
16
|
-
res += Netzke::Core.external_ext_css
|
17
|
-
|
18
|
-
stylesheet_link_tag(*res)
|
19
|
-
end
|
20
|
-
|
21
|
-
def netzke_ext_js_include(params)
|
22
|
-
res = []
|
23
|
-
|
24
|
-
# ExtJS
|
25
|
-
res << (params[:minified] ? "#{Netzke::Core.ext_uri}/build/ext-all.js" : "#{Netzke::Core.ext_uri}/build/ext-all-debug.js")
|
26
|
-
|
27
|
-
# Ext I18n
|
28
|
-
res << "#{Netzke::Core.ext_uri}/packages/ext-locale/build/ext-locale-#{I18n.locale}" if I18n.locale != :en
|
29
|
-
|
30
|
-
# Netzke-related dynamic JavaScript
|
31
|
-
res << netzke_ext_path
|
32
|
-
|
33
|
-
javascript_include_tag(*res)
|
34
|
-
end
|
35
|
-
|
36
|
-
def netzke_ext_js(params)
|
37
|
-
res = []
|
38
|
-
res << content_for(:netzke_js_classes)
|
39
|
-
|
40
|
-
res << "Ext.onReady(function(){"
|
41
|
-
res << content_for(:netzke_on_ready)
|
42
|
-
res << "});"
|
43
|
-
|
44
|
-
javascript_tag(res.join("\n"))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|