netzke-core 0.2.3 → 0.2.4
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.
- data/CHANGELOG +3 -0
- data/javascripts/core.js +97 -97
- data/lib/app/models/netzke_layout.rb +1 -1
- data/lib/app/models/netzke_preference.rb +14 -22
- data/lib/netzke/action_view_ext.rb +5 -5
- data/lib/netzke/base.rb +6 -6
- data/lib/netzke/js_class_builder.rb +13 -13
- data/netzke-core.gemspec +2 -2
- metadata +2 -2
data/CHANGELOG
CHANGED
data/javascripts/core.js
CHANGED
@@ -10,126 +10,126 @@ Ext.Ajax.extraParams = {
|
|
10
10
|
|
11
11
|
// helper method to do multiple Ext.apply's
|
12
12
|
Ext.chainApply = function(objectArray){
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
var res = {};
|
14
|
+
Ext.each(objectArray, function(obj){Ext.apply(res, obj)});
|
15
|
+
return res;
|
16
16
|
};
|
17
17
|
|
18
18
|
// implementation of totalProperty, successProperty and root configuration options for ArrayReader
|
19
19
|
Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
}
|
41
|
-
return {
|
42
|
-
records : records,
|
43
|
-
totalRecords : totalRecords,
|
44
|
-
success : success
|
45
|
-
};
|
20
|
+
readRecords : function(o){
|
21
|
+
var sid = this.meta ? this.meta.id : null;
|
22
|
+
var recordType = this.recordType, fields = recordType.prototype.fields;
|
23
|
+
var records = [];
|
24
|
+
// console.info(this.meta);
|
25
|
+
var root = o[this.meta.root] || o, totalRecords = o[this.meta.totalProperty], success = o[this.meta.successProperty];
|
26
|
+
for(var i = 0; i < root.length; i++){
|
27
|
+
var n = root[i];
|
28
|
+
var values = {};
|
29
|
+
var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
|
30
|
+
for(var j = 0, jlen = fields.length; j < jlen; j++){
|
31
|
+
var f = fields.items[j];
|
32
|
+
var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
|
33
|
+
var v = n[k] !== undefined ? n[k] : f.defaultValue;
|
34
|
+
v = f.convert(v, n);
|
35
|
+
values[f.name] = v;
|
36
|
+
}
|
37
|
+
var record = new recordType(values, id);
|
38
|
+
record.json = n;
|
39
|
+
records[records.length] = record;
|
46
40
|
}
|
41
|
+
return {
|
42
|
+
records : records,
|
43
|
+
totalRecords : totalRecords,
|
44
|
+
success : success
|
45
|
+
};
|
46
|
+
}
|
47
47
|
});
|
48
48
|
|
49
49
|
// Methods common to all widget classes
|
50
50
|
Ext.widgetMixIn = {
|
51
|
-
|
51
|
+
widgetInit:function(config){
|
52
52
|
this.app = Ext.getCmp('feedback_ghost');
|
53
53
|
// this.app = Ext.getCmp('application');
|
54
54
|
if (config.tools) Ext.each(config.tools, function(i){i.on.click = this[i.on.click].createDelegate(this)}, this);
|
55
55
|
if (config.actions) Ext.each(config.actions, function(i){i.handler = this[i.handler].createDelegate(this);}, this);
|
56
|
-
|
56
|
+
},
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
58
|
+
setEvents: function(){
|
59
|
+
this.on('beforedestroy', function(){
|
60
|
+
// clean-up menus
|
61
|
+
if (this.app && !!this.app.unhostMenus) {
|
62
|
+
// alert('beforedestroy');
|
63
|
+
this.app.unhostMenus(this)
|
64
|
+
}
|
65
|
+
}, this);
|
66
|
+
|
67
|
+
this.on('render', this.onWidgetLoad, this);
|
68
|
+
},
|
69
69
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
70
|
+
feedback:function(msg){
|
71
|
+
if (this.initialConfig.quiet) return false;
|
72
|
+
if (this.app && !!this.app.showFeedback) {
|
73
|
+
this.app.showFeedback(msg)
|
74
|
+
} else {
|
75
|
+
// there's no application to show the feedback - so, we do it ourselves
|
76
|
+
if (typeof msg == 'string'){
|
77
|
+
alert(msg)
|
78
|
+
} else {
|
79
|
+
var compoundResponse = ""
|
80
|
+
Ext.each(msg, function(m){
|
81
81
|
compoundResponse += m.msg + "\n"
|
82
82
|
})
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
83
|
+
if (compoundResponse != "") alert(compoundResponse);
|
84
|
+
}
|
85
|
+
};
|
86
|
+
},
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
88
|
+
addMenus:function(menus){
|
89
|
+
if (this.app && !!this.app.hostMenu) {
|
90
|
+
Ext.each(menus, function(menu){this.app.hostMenu(menu, this)}, this)
|
91
|
+
}
|
92
|
+
},
|
93
|
+
|
94
|
+
onWidgetLoad:Ext.emptyFn // gets overridden
|
95
95
|
};
|
96
96
|
|
97
97
|
// Make Panel with layout 'fit' capable to dynamically load widgets
|
98
98
|
Ext.override(Ext.Panel, {
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
99
|
+
getWidget: function(){
|
100
|
+
return this.items.get(0)
|
101
|
+
},
|
102
|
+
|
103
|
+
loadWidget: function(url, params){
|
104
|
+
if (!params) params = {}
|
105
|
+
|
106
|
+
this.remove(this.getWidget()); // first delete previous widget
|
107
|
+
|
108
|
+
if (!url) return false; // don't load any widget if the url is null
|
109
|
+
|
110
|
+
// we will let the server know which components we have cached
|
111
|
+
var cachedComponentNames = [];
|
112
|
+
for (name in Ext.componentCache) {
|
113
|
+
cachedComponentNames.push(name);
|
114
|
+
}
|
115
|
+
|
116
|
+
this.disable(); // to visually emphasize loading
|
117
|
+
|
118
|
+
Ext.Ajax.request(
|
119
|
+
{url:url, params:Ext.apply(params, {components_cache:Ext.encode(cachedComponentNames)}), script:false, callback:function(panel, success, response){
|
120
|
+
var response = Ext.decode(response.responseText);
|
121
|
+
if (response['classDefinition']) eval(response['classDefinition']); // evaluate widget's class if it was sent
|
122
122
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
123
|
+
response.config.parent = this // we might want to know the parent panel in advance (e.g. to know its size)
|
124
|
+
var instance = new Ext.componentCache[response.config.widgetClassName](response.config)
|
125
|
+
|
126
|
+
this.add(instance);
|
127
|
+
this.doLayout();
|
128
|
+
this.enable();
|
129
|
+
}, scope:this}
|
130
|
+
)
|
131
|
+
|
132
|
+
}
|
133
133
|
});
|
134
134
|
|
135
135
|
// Some Rubyish String extensions
|
@@ -24,7 +24,7 @@ class NetzkeLayout < ActiveRecord::Base
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def self.by_widget(widget_name)
|
27
|
-
self.find(:first, :conditions => {:widget_name => widget_name, :user_id => user_id})
|
27
|
+
self.find(:first, :conditions => {:widget_name => widget_name.to_s, :user_id => user_id})
|
28
28
|
end
|
29
29
|
|
30
30
|
def move_item(old_index, new_index)
|
@@ -30,17 +30,14 @@ class NetzkePreference < ActiveRecord::Base
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def normalized_value
|
33
|
-
klass
|
33
|
+
klass = read_attribute(:pref_type)
|
34
34
|
norm_value = read_attribute(:value)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
r = nil
|
42
|
-
elsif klass == 'Array' || klass == 'Hash'
|
43
|
-
r = JSON.parse(norm_value)
|
35
|
+
|
36
|
+
case klass
|
37
|
+
when nil then r = norm_value # do not cast
|
38
|
+
when 'Boolean' then r = norm_value == 'false' ? false : (norm_value == 'true' || norm_value)
|
39
|
+
when 'NilClass' then r = nil
|
40
|
+
when 'Array', 'Hash' then r = JSON.parse(norm_value)
|
44
41
|
else
|
45
42
|
r = norm_value.send(ELEMENTARY_CONVERTION_METHODS[klass])
|
46
43
|
end
|
@@ -48,30 +45,25 @@ class NetzkePreference < ActiveRecord::Base
|
|
48
45
|
end
|
49
46
|
|
50
47
|
def normalized_value=(new_value)
|
51
|
-
# norm_value = (new_value.to_s if new_value == true or new_value == false) || new_value
|
52
48
|
case new_value.class.name
|
53
|
-
when "Array"
|
54
|
-
|
55
|
-
|
56
|
-
write_attribute(:value, new_value.to_json)
|
57
|
-
else
|
58
|
-
write_attribute(:value, new_value.to_s)
|
49
|
+
when "Array" then write_attribute(:value, new_value.to_json)
|
50
|
+
when "Hash" then write_attribute(:value, new_value.to_json)
|
51
|
+
else write_attribute(:value, new_value.to_s)
|
59
52
|
end
|
60
53
|
write_attribute(:pref_type, [TrueClass, FalseClass].include?(new_value.class) ? 'Boolean' : new_value.class.to_s)
|
61
54
|
end
|
62
55
|
|
63
56
|
def self.[](pref_name)
|
64
|
-
pref_name
|
57
|
+
pref_name = pref_name.to_s
|
65
58
|
conditions = {:name => pref_name, :user_id => user_id, :widget_name => self.widget_name}
|
66
|
-
pref
|
67
|
-
# pref = @@user.nil? ? self.find_by_name(pref_name) : self.find_by_name_and_user_id(pref_name, @@user.id)
|
59
|
+
pref = self.find(:first, :conditions => conditions)
|
68
60
|
pref && pref.normalized_value
|
69
61
|
end
|
70
62
|
|
71
63
|
def self.[]=(pref_name, new_value)
|
72
|
-
pref_name
|
64
|
+
pref_name = pref_name.to_s
|
73
65
|
conditions = {:name => pref_name, :user_id => user_id, :widget_name => self.widget_name}
|
74
|
-
pref
|
66
|
+
pref = self.find(:first, :conditions => conditions)
|
75
67
|
|
76
68
|
# if assigning nil, simply delete the eventually found preference
|
77
69
|
if new_value.nil?
|
@@ -5,14 +5,14 @@ module Netzke
|
|
5
5
|
res = ""
|
6
6
|
|
7
7
|
if ENV['RAILS_ENV'] == 'development'
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
res << javascript_include_tag("/extjs/adapter/ext/ext-base.js", "/extjs/ext-all-debug.js")
|
9
|
+
else
|
10
|
+
res << javascript_include_tag("/extjs/adapter/ext/ext-base.js", "/extjs/ext-all.js")
|
11
11
|
end
|
12
12
|
res << javascript_tag( "Ext.authenticityToken = '#{form_authenticity_token}'") # forgery protection
|
13
|
-
|
13
|
+
res << javascript_include_tag("/netzke/netzke.js")
|
14
14
|
|
15
|
-
|
15
|
+
res
|
16
16
|
end
|
17
17
|
|
18
18
|
def netzke_css_include(theme_name = :default)
|
data/lib/netzke/base.rb
CHANGED
@@ -16,9 +16,9 @@ module Netzke
|
|
16
16
|
# Global Netzke::Base configuration
|
17
17
|
def config
|
18
18
|
set_default_config({
|
19
|
-
:javascripts
|
20
|
-
:css
|
21
|
-
:layout_manager
|
19
|
+
:javascripts => [],
|
20
|
+
:css => [],
|
21
|
+
:layout_manager => "NetzkeLayout",
|
22
22
|
:persistent_config_manager => "NetzkePreference"
|
23
23
|
})
|
24
24
|
end
|
@@ -97,8 +97,8 @@ module Netzke
|
|
97
97
|
attr_reader :pref
|
98
98
|
|
99
99
|
def initialize(config = {}, parent = nil)
|
100
|
-
@config
|
101
|
-
@parent
|
100
|
+
@config = initial_config.recursive_merge(config)
|
101
|
+
@parent = parent
|
102
102
|
@id_name = parent.nil? ? config[:name].to_s : "#{parent.id_name}__#{config[:name]}"
|
103
103
|
|
104
104
|
@flash = []
|
@@ -240,7 +240,7 @@ module Netzke
|
|
240
240
|
end
|
241
241
|
end
|
242
242
|
|
243
|
-
####
|
243
|
+
#### Interface
|
244
244
|
def get_widget(params = {})
|
245
245
|
# if browser does not have our component class cached (and all dependencies), send it to him
|
246
246
|
components_cache = (JSON.parse(params[:components_cache]) if params[:components_cache]) || []
|
@@ -33,10 +33,10 @@ module Netzke
|
|
33
33
|
res.merge!(:id => @id_name)
|
34
34
|
|
35
35
|
# include tools and actions
|
36
|
-
res.merge!(:tools
|
36
|
+
res.merge!(:tools => tools) if tools
|
37
37
|
res.merge!(:actions => actions) if actions
|
38
|
-
res.merge!(:bbar
|
39
|
-
res.merge!(:tbar
|
38
|
+
res.merge!(:bbar => tbar) if tbar
|
39
|
+
res.merge!(:tbar => bbar) if bbar
|
40
40
|
|
41
41
|
# include permissions
|
42
42
|
res.merge!(:permissions => permissions) unless available_permissions.empty?
|
@@ -123,17 +123,17 @@ module Netzke
|
|
123
123
|
# default config that is always passed into the constructor
|
124
124
|
def js_default_config
|
125
125
|
{
|
126
|
-
:title
|
126
|
+
:title => "config.id.humanize()".l,
|
127
127
|
:listeners => js_listeners,
|
128
|
-
:tools
|
129
|
-
:actions
|
130
|
-
:tbar
|
131
|
-
:bbar
|
132
|
-
# :items
|
133
|
-
# :items
|
134
|
-
:height
|
135
|
-
:width
|
136
|
-
:border
|
128
|
+
:tools => "config.tools".l,
|
129
|
+
:actions => "config.actions".l,
|
130
|
+
:tbar => "config.tbar".l,
|
131
|
+
:bbar => "config.bbar".l,
|
132
|
+
# :items => "config.items".l,
|
133
|
+
# :items => js_items,
|
134
|
+
:height => 400,
|
135
|
+
:width => 800,
|
136
|
+
:border => false
|
137
137
|
}
|
138
138
|
end
|
139
139
|
|
data/netzke-core.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{netzke-core}
|
5
|
-
s.version = "0.2.
|
5
|
+
s.version = "0.2.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Sergei Kozlov"]
|
9
|
-
s.date = %q{2009-01-
|
9
|
+
s.date = %q{2009-01-28}
|
10
10
|
s.description = %q{Build ExtJS/Rails widgets with minimum effort}
|
11
11
|
s.email = %q{sergei@writelesscode.com}
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "lib/app/controllers/netzke_controller.rb", "lib/app/models/netzke_layout.rb", "lib/app/models/netzke_preference.rb", "lib/netzke/action_view_ext.rb", "lib/netzke/base.rb", "lib/netzke/controller_extensions.rb", "lib/netzke/core_ext.rb", "lib/netzke/feedback_ghost.rb", "lib/netzke/js_class_builder.rb", "lib/netzke/routing.rb", "lib/netzke-core.rb", "lib/vendor/facets/hash/recursive_merge.rb", "LICENSE", "README.mdown", "tasks/netzke_core_tasks.rake"]
|
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.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergei Kozlov
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-01-
|
12
|
+
date: 2009-01-28 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|