netzke-basepack 0.4.2 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +1 -0
- data/.gitignore +6 -0
- data/{CHANGELOG → CHANGELOG.rdoc} +26 -0
- data/README.rdoc +11 -11
- data/Rakefile +37 -11
- data/TODO.rdoc +8 -0
- data/VERSION +1 -0
- data/javascripts/basepack.js +71 -28
- data/lib/app/models/netzke_auto_column.rb +56 -0
- data/lib/netzke-basepack.rb +5 -3
- data/lib/netzke/accordion_panel.rb +69 -67
- data/lib/netzke/active_record/basepack.rb +104 -0
- data/lib/netzke/active_record/data_accessor.rb +33 -0
- data/lib/netzke/basic_app.rb +233 -124
- data/lib/netzke/border_layout_panel.rb +97 -98
- data/lib/netzke/configuration_panel.rb +24 -0
- data/lib/netzke/data_accessor.rb +71 -0
- data/lib/netzke/ext.rb +6 -0
- data/lib/netzke/field_model.rb +1 -1
- data/lib/netzke/fields_configurator.rb +62 -37
- data/lib/netzke/form_panel.rb +161 -51
- data/lib/netzke/form_panel_api.rb +74 -0
- data/lib/netzke/form_panel_js.rb +129 -0
- data/lib/netzke/grid_panel.rb +385 -80
- data/lib/netzke/grid_panel_api.rb +352 -0
- data/lib/netzke/grid_panel_extras/javascripts/rows-dd.js +280 -0
- data/lib/netzke/grid_panel_js.rb +721 -0
- data/lib/netzke/masquerade_selector.rb +53 -0
- data/lib/netzke/panel.rb +9 -0
- data/lib/netzke/plugins/configuration_tool.rb +121 -0
- data/lib/netzke/property_editor.rb +95 -7
- data/lib/netzke/property_editor_extras/helper_model.rb +55 -34
- data/lib/netzke/search_panel.rb +62 -0
- data/lib/netzke/tab_panel.rb +97 -37
- data/lib/netzke/table_editor.rb +49 -44
- data/lib/netzke/tree_panel.rb +15 -16
- data/lib/netzke/wrapper.rb +29 -5
- data/netzke-basepack.gemspec +151 -19
- data/stylesheets/basepack.css +5 -0
- data/test/app_root/app/models/book.rb +1 -1
- data/test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb +1 -1
- data/test/unit/accordion_panel_test.rb +1 -2
- data/test/unit/active_record_basepack_test.rb +54 -0
- data/test/unit/grid_panel_test.rb +8 -12
- data/test/unit/helper_model_test.rb +30 -0
- metadata +69 -78
- data/Manifest +0 -86
- data/TODO +0 -3
- data/lib/app/models/netzke_hash_record.rb +0 -180
- data/lib/app/models/netzke_layout_item.rb +0 -11
- data/lib/netzke/ar_ext.rb +0 -269
- data/lib/netzke/configuration_tool.rb +0 -80
- data/lib/netzke/container.rb +0 -77
- data/lib/netzke/db_fields.rb +0 -44
- data/lib/netzke/fields_configurator_old.rb +0 -62
- data/lib/netzke/form_panel_extras/interface.rb +0 -56
- data/lib/netzke/form_panel_extras/js_builder.rb +0 -134
- data/lib/netzke/grid_panel_extras/interface.rb +0 -206
- data/lib/netzke/grid_panel_extras/js_builder.rb +0 -352
- data/test/unit/ar_ext_test.rb +0 -53
- data/test/unit/netzke_hash_record_test.rb +0 -52
- data/test/unit/netzke_layout_item_test.rb +0 -28
data/Manifest
DELETED
@@ -1,86 +0,0 @@
|
|
1
|
-
autotest/discover.rb
|
2
|
-
CHANGELOG
|
3
|
-
init.rb
|
4
|
-
install.rb
|
5
|
-
javascripts/basepack.js
|
6
|
-
lib/app/models/netzke_hash_record.rb
|
7
|
-
lib/app/models/netzke_layout_item.rb
|
8
|
-
lib/netzke/accordion_panel.rb
|
9
|
-
lib/netzke/ar_ext.rb
|
10
|
-
lib/netzke/basic_app.rb
|
11
|
-
lib/netzke/border_layout_panel.rb
|
12
|
-
lib/netzke/configuration_tool.rb
|
13
|
-
lib/netzke/container.rb
|
14
|
-
lib/netzke/db_fields.rb
|
15
|
-
lib/netzke/field_model.rb
|
16
|
-
lib/netzke/fields_configurator.rb
|
17
|
-
lib/netzke/fields_configurator_old.rb
|
18
|
-
lib/netzke/form_panel.rb
|
19
|
-
lib/netzke/form_panel_extras/interface.rb
|
20
|
-
lib/netzke/form_panel_extras/javascripts/xcheckbox.js
|
21
|
-
lib/netzke/form_panel_extras/js_builder.rb
|
22
|
-
lib/netzke/grid_panel.rb
|
23
|
-
lib/netzke/grid_panel_extras/interface.rb
|
24
|
-
lib/netzke/grid_panel_extras/javascripts/check-column.js
|
25
|
-
lib/netzke/grid_panel_extras/javascripts/filters.js
|
26
|
-
lib/netzke/grid_panel_extras/js_builder.rb
|
27
|
-
lib/netzke/panel.rb
|
28
|
-
lib/netzke/property_editor.rb
|
29
|
-
lib/netzke/property_editor_extras/helper_model.rb
|
30
|
-
lib/netzke/tab_panel.rb
|
31
|
-
lib/netzke/table_editor.rb
|
32
|
-
lib/netzke/tree_panel.rb
|
33
|
-
lib/netzke/wrapper.rb
|
34
|
-
lib/netzke-basepack.rb
|
35
|
-
LICENSE
|
36
|
-
Manifest
|
37
|
-
Rakefile
|
38
|
-
README.rdoc
|
39
|
-
stylesheets/basepack.css
|
40
|
-
tasks/netzke_basepack_tasks.rake
|
41
|
-
test/app_root/app/controllers/application.rb
|
42
|
-
test/app_root/app/models/book.rb
|
43
|
-
test/app_root/app/models/category.rb
|
44
|
-
test/app_root/app/models/city.rb
|
45
|
-
test/app_root/app/models/continent.rb
|
46
|
-
test/app_root/app/models/country.rb
|
47
|
-
test/app_root/app/models/genre.rb
|
48
|
-
test/app_root/config/boot.rb
|
49
|
-
test/app_root/config/database.yml
|
50
|
-
test/app_root/config/environment.rb
|
51
|
-
test/app_root/config/environments/in_memory.rb
|
52
|
-
test/app_root/config/environments/mysql.rb
|
53
|
-
test/app_root/config/environments/postgresql.rb
|
54
|
-
test/app_root/config/environments/sqlite.rb
|
55
|
-
test/app_root/config/environments/sqlite3.rb
|
56
|
-
test/app_root/config/routes.rb
|
57
|
-
test/app_root/db/migrate/20081222033343_create_books.rb
|
58
|
-
test/app_root/db/migrate/20081222033440_create_genres.rb
|
59
|
-
test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb
|
60
|
-
test/app_root/db/migrate/20081223024935_create_categories.rb
|
61
|
-
test/app_root/db/migrate/20081223025635_create_countries.rb
|
62
|
-
test/app_root/db/migrate/20081223025653_create_continents.rb
|
63
|
-
test/app_root/db/migrate/20081223025732_create_cities.rb
|
64
|
-
test/app_root/db/migrate/20090102223630_create_netzke_layouts.rb
|
65
|
-
test/app_root/script/console
|
66
|
-
test/app_root/vendor/plugins/acts_as_list/init.rb
|
67
|
-
test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb
|
68
|
-
test/app_root/vendor/plugins/acts_as_list/README
|
69
|
-
test/console_with_fixtures.rb
|
70
|
-
test/fixtures/books.yml
|
71
|
-
test/fixtures/categories.yml
|
72
|
-
test/fixtures/cities.yml
|
73
|
-
test/fixtures/continents.yml
|
74
|
-
test/fixtures/countries.yml
|
75
|
-
test/fixtures/genres.yml
|
76
|
-
test/schema.rb
|
77
|
-
test/test_helper.rb
|
78
|
-
test/unit/accordion_panel_test.rb
|
79
|
-
test/unit/ar_ext_test.rb
|
80
|
-
test/unit/grid_panel_test.rb
|
81
|
-
test/unit/netzke_basepack_test.rb
|
82
|
-
test/unit/netzke_hash_record_test.rb
|
83
|
-
test/unit/netzke_layout_item_test.rb
|
84
|
-
test/unit/tab_panel_test.rb
|
85
|
-
TODO
|
86
|
-
uninstall.rb
|
data/TODO
DELETED
@@ -1,3 +0,0 @@
|
|
1
|
-
* GridPanel. Reordering of grid columns may lead to unpredictable results when data from an "outdated" table (e.g. open in another browser) gets submitted. A mechanism is needed to submit updated data along with the field names - as hash (as done is FormPanel), *not* as array.
|
2
|
-
|
3
|
-
* Add status bar to BasicApp
|
@@ -1,180 +0,0 @@
|
|
1
|
-
class NetzkeHashRecord < Hash
|
2
|
-
include Netzke::ActiveRecordExtensions
|
3
|
-
#
|
4
|
-
# Class methods
|
5
|
-
#
|
6
|
-
def self.widget=(w)
|
7
|
-
@@widget = w
|
8
|
-
reload
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.widget
|
12
|
-
@@widget ||= nil
|
13
|
-
raise "No widget specified for NetzkeHashRecord" if @@widget.nil?
|
14
|
-
@@widget
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.data=(data)
|
18
|
-
@@records = data
|
19
|
-
save
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.raw_data=(data)
|
23
|
-
persistent_config.for_widget(widget) {|p| p[:layout__columns] = data}
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.columns_hash
|
27
|
-
@@columns_hash ||= build_columns_hash
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.push(instance)
|
31
|
-
records << instance
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.reload
|
35
|
-
@@records = build_records
|
36
|
-
end
|
37
|
-
|
38
|
-
# standard AR operations
|
39
|
-
def self.all(params = {})
|
40
|
-
records
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.count(params = {})
|
44
|
-
records.size
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.find(*args)
|
48
|
-
if args.size == 1
|
49
|
-
records[args.first.to_i - 1]
|
50
|
-
else
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.first
|
55
|
-
records.first
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.last
|
59
|
-
records.last
|
60
|
-
end
|
61
|
-
|
62
|
-
def self.delete(ids)
|
63
|
-
ids.each do |id|
|
64
|
-
records.delete_if{|r| r.id == id.to_i}
|
65
|
-
end
|
66
|
-
recalculate_ids
|
67
|
-
save
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.delete_all
|
71
|
-
records.clear
|
72
|
-
save
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.save
|
76
|
-
records_without_ids = records.map{ |r| r.reject{ |k,v| k == :id } }
|
77
|
-
persistent_config.for_widget(widget) {|p| p[:layout__columns] = records_without_ids}
|
78
|
-
true
|
79
|
-
end
|
80
|
-
|
81
|
-
def self.column_names
|
82
|
-
columns_hash.keys.sort{ |x,y| x == "id" ? -1 : 0} # "id"-column should always come first (required by the GridPanel)
|
83
|
-
end
|
84
|
-
|
85
|
-
def self.reflect_on_all_associations
|
86
|
-
[]
|
87
|
-
end
|
88
|
-
|
89
|
-
#
|
90
|
-
# Instance methods
|
91
|
-
#
|
92
|
-
def initialize(params = {})
|
93
|
-
self.replace(params)
|
94
|
-
end
|
95
|
-
|
96
|
-
def id
|
97
|
-
self[:id] || self["id"]
|
98
|
-
end
|
99
|
-
|
100
|
-
def id=(id)
|
101
|
-
self[:id] = id
|
102
|
-
end
|
103
|
-
|
104
|
-
def save
|
105
|
-
if self.id.nil?
|
106
|
-
self.id = self.class.records.size + 1
|
107
|
-
self.class.push(self)
|
108
|
-
else
|
109
|
-
# nothing to do
|
110
|
-
end
|
111
|
-
|
112
|
-
self.class.save
|
113
|
-
end
|
114
|
-
|
115
|
-
def errors
|
116
|
-
[]
|
117
|
-
end
|
118
|
-
|
119
|
-
private
|
120
|
-
|
121
|
-
def self.persistent_config
|
122
|
-
@@persistent_config ||= Netzke::Base.persistent_config
|
123
|
-
end
|
124
|
-
|
125
|
-
def self.records
|
126
|
-
@@records ||= build_records
|
127
|
-
end
|
128
|
-
|
129
|
-
def self.build_records
|
130
|
-
raw_records = persistent_config.for_widget(widget){|p| p[:layout__columns]} || []
|
131
|
-
records = []
|
132
|
-
raw_records.each_with_index do |r,i|
|
133
|
-
own_instance = self.new(r.convert_keys{|k| k.to_sym})
|
134
|
-
own_instance.merge!(:id => i + 1) # merging with the id
|
135
|
-
records << own_instance
|
136
|
-
end
|
137
|
-
records
|
138
|
-
end
|
139
|
-
|
140
|
-
def self.recalculate_ids
|
141
|
-
records.each_with_index { |r, i| r.id = i + 1}
|
142
|
-
end
|
143
|
-
|
144
|
-
def self.build_columns_hash
|
145
|
-
res = {}
|
146
|
-
records.each do |record|
|
147
|
-
record.keys.each do |k|
|
148
|
-
|
149
|
-
if res[k.to_s].nil?
|
150
|
-
|
151
|
-
# calculate column type
|
152
|
-
column_type = case record[k].class.to_s
|
153
|
-
when "TrueClass"
|
154
|
-
:boolean
|
155
|
-
when "FalseClass"
|
156
|
-
:boolean
|
157
|
-
when "String"
|
158
|
-
:string
|
159
|
-
when "Fixnum"
|
160
|
-
:integer
|
161
|
-
else
|
162
|
-
:string
|
163
|
-
end
|
164
|
-
|
165
|
-
column = {:type => column_type}
|
166
|
-
|
167
|
-
# workaround for the "type" method
|
168
|
-
class << column
|
169
|
-
def type
|
170
|
-
self[:type]
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
res[k.to_s] = column
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
res
|
179
|
-
end
|
180
|
-
end
|
data/lib/netzke/ar_ext.rb
DELETED
@@ -1,269 +0,0 @@
|
|
1
|
-
module Netzke
|
2
|
-
module ActiveRecordExtensions
|
3
|
-
def self.included(base)
|
4
|
-
base.extend ActiveRecordClassMethods
|
5
|
-
end
|
6
|
-
|
7
|
-
#
|
8
|
-
# Allow nested association access (assocs separated by "." or "__"), e.g.: proxy_service.asset__gui_folder__name
|
9
|
-
# Example:
|
10
|
-
# b = Book.first
|
11
|
-
# b.genre__name = 'Fantasy' => b.genre = Genre.find_by_name('Fantasy')
|
12
|
-
# NOT IMPLEMENTED (any real use?): b.genre__catalog__name = 'Best sellers' => b.genre_id = b.genre.find_by_catalog_id(Catalog.find_by_name('Best sellers')).id
|
13
|
-
#
|
14
|
-
|
15
|
-
def method_missing(method, *args, &block)
|
16
|
-
# if refering to a column, just pass it to the original method_missing
|
17
|
-
return super if self.class.column_names.include?(method.to_s)
|
18
|
-
|
19
|
-
split = method.to_s.split(/\.|__/)
|
20
|
-
if split.size > 1
|
21
|
-
if split.last =~ /=$/
|
22
|
-
if split.size == 2
|
23
|
-
# search for association and assign it to self
|
24
|
-
assoc = self.class.reflect_on_association(split.first.to_sym)
|
25
|
-
assoc_method = split.last.chop
|
26
|
-
if assoc
|
27
|
-
assoc_instance = assoc.klass.send("find_by_#{assoc_method}", *args)
|
28
|
-
raise ArgumentError, "Couldn't find association #{split.first} by #{assoc_method} '#{args.first}'" unless assoc_instance
|
29
|
-
self.send("#{split.first}=", assoc_instance)
|
30
|
-
else
|
31
|
-
super
|
32
|
-
end
|
33
|
-
else
|
34
|
-
super
|
35
|
-
end
|
36
|
-
else
|
37
|
-
res = self
|
38
|
-
split.each do |m|
|
39
|
-
if res.respond_to?(m)
|
40
|
-
res = res.send(m) unless res.nil?
|
41
|
-
else
|
42
|
-
res.nil? ? nil : super
|
43
|
-
end
|
44
|
-
end
|
45
|
-
res
|
46
|
-
end
|
47
|
-
else
|
48
|
-
super
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def to_array(columns)
|
53
|
-
res = []
|
54
|
-
for c in columns
|
55
|
-
method = c.is_a?(Symbol) ? c : c[:name]
|
56
|
-
res << send(method)
|
57
|
-
end
|
58
|
-
res
|
59
|
-
end
|
60
|
-
|
61
|
-
module ActiveRecordClassMethods
|
62
|
-
# next and previous to id records
|
63
|
-
def next(id)
|
64
|
-
find(:first, :conditions => ["#{primary_key} > ?", id])
|
65
|
-
end
|
66
|
-
def previous(id)
|
67
|
-
find(:first, :conditions => ["#{primary_key} < ?", id], :order => "#{primary_key} DESC")
|
68
|
-
end
|
69
|
-
|
70
|
-
# Returns all unique values for a column, filtered by the query
|
71
|
-
def choices_for(column, query = nil)
|
72
|
-
if respond_to?("#{column}_choices", query)
|
73
|
-
# AR class provides the choices itself
|
74
|
-
send("#{column}_choices")
|
75
|
-
else
|
76
|
-
if (assoc_name, *assoc_method = column.split('__')).size > 1
|
77
|
-
# column is an association column
|
78
|
-
assoc_method = assoc_method.join('__') # in case we get something like country__continent__name
|
79
|
-
association = reflect_on_association(assoc_name.to_sym) || raise(NameError, "Association #{assoc_name} not known for class #{name}")
|
80
|
-
association.klass.choices_for(assoc_method, query)
|
81
|
-
else
|
82
|
-
column = assoc_name
|
83
|
-
if self.column_names.include?(column)
|
84
|
-
# it's just a column
|
85
|
-
records = query.nil? ? find_by_sql("select distinct #{column} from #{table_name}") : find_by_sql("select distinct #{column} from #{table_name} where #{column} like '#{query}%'")
|
86
|
-
records.map{|r| r.send(column)}
|
87
|
-
else
|
88
|
-
# it's a "virtual" column - the least effective search
|
89
|
-
records = self.find(:all).map{|r| r.send(column)}.uniq
|
90
|
-
query.nil? ? records : records.select{|r| r.index(/^#{query}/)}
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
# which columns are to be picked up by grids and forms
|
97
|
-
def expose_columns(*column_configs)
|
98
|
-
if column_configs.first == :all
|
99
|
-
write_inheritable_attribute(:exposed_columns, self.column_names.map(&:to_sym))
|
100
|
-
else
|
101
|
-
write_inheritable_attribute(:exposed_columns, column_configs)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def exposed_columns
|
106
|
-
read_inheritable_attribute(:exposed_columns) || write_inheritable_attribute(:exposed_columns, expose_columns(:all) + virtual_columns)
|
107
|
-
end
|
108
|
-
|
109
|
-
# virtual "columns" that simply correspond to instance methods of an ActiveRecord class
|
110
|
-
def virtual_column(config)
|
111
|
-
if config.is_a?(Symbol)
|
112
|
-
config = {:name => config}
|
113
|
-
else
|
114
|
-
config = {:name => config.keys.first}.merge(config.values.first)
|
115
|
-
end
|
116
|
-
write_inheritable_attribute(:virtual_columns, (read_inheritable_attribute(:virtual_columns) || []) << config)
|
117
|
-
end
|
118
|
-
|
119
|
-
def virtual_columns
|
120
|
-
read_inheritable_attribute(:virtual_columns) || []
|
121
|
-
end
|
122
|
-
|
123
|
-
def is_virtual_column?(column)
|
124
|
-
read_inheritable_attribute(:virtual_columns).keys.include?(column)
|
125
|
-
end
|
126
|
-
|
127
|
-
def default_dbfield_config(config, mode = :grid)
|
128
|
-
config = config.is_a?(Symbol) ? {:name => config} : config.dup
|
129
|
-
|
130
|
-
# detect ActiveRecord column type (if the column is "real") or fall back to :virtual
|
131
|
-
type = (columns_hash[config[:name].to_s] && columns_hash[config[:name].to_s].type) || :virtual
|
132
|
-
|
133
|
-
res = {
|
134
|
-
:name => config[:name].to_s || "unnamed",
|
135
|
-
:label => config[:label] || config[:name].to_s.gsub('__', '_').humanize,
|
136
|
-
:read_only => config[:name] == :id, # make "id" column read-only by default
|
137
|
-
:hidden => config[:name] == :id, # hide "id" column by default
|
138
|
-
:width => mode == :grid ? DEFAULT_COLUMN_WIDTH : DEFAULT_FIELD_WIDTH,
|
139
|
-
:editor => ext_editor(type)
|
140
|
-
}
|
141
|
-
|
142
|
-
# for forms fields also set up the height
|
143
|
-
res.merge!(:height => DEFAULT_FIELD_HEIGHT) if mode == :form
|
144
|
-
|
145
|
-
# detect :assoc__method
|
146
|
-
if config[:name].to_s.index('__')
|
147
|
-
assoc_name, method = config[:name].to_s.split('__').map(&:to_sym)
|
148
|
-
if assoc = reflect_on_association(assoc_name)
|
149
|
-
assoc_column = assoc.klass.columns_hash[method.to_s]
|
150
|
-
assoc_method_type = assoc_column.try(:type)
|
151
|
-
if assoc_method_type
|
152
|
-
res[:editor] = ext_editor(assoc_method_type) == :checkbox ? :checkbox : :combobox
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
# detect association column (e.g. :category_id)
|
158
|
-
if assoc = reflect_on_all_associations.detect{|a| a.primary_key_name.to_sym == config[:name]}
|
159
|
-
res[:editor] = :combobox
|
160
|
-
assoc_method = %w{name title label}.detect{|m| (assoc.klass.instance_methods + assoc.klass.column_names).include?(m) } || assoc.klass.primary_key
|
161
|
-
res[:name] = "#{assoc.name}__#{assoc_method}"
|
162
|
-
end
|
163
|
-
|
164
|
-
res[:width] = 50 if res[:editor] == :checkbox # more narrow column for checkboxes
|
165
|
-
|
166
|
-
# merge with the given confg, which has the priority
|
167
|
-
config.delete(:name) # because we might have changed the name
|
168
|
-
res.merge(config)
|
169
|
-
end
|
170
|
-
|
171
|
-
#
|
172
|
-
# Used by Netzke::GridPanel
|
173
|
-
#
|
174
|
-
|
175
|
-
DEFAULT_COLUMN_WIDTH = 100
|
176
|
-
|
177
|
-
# identify Ext editor (xtype) for the data type
|
178
|
-
TYPE_EDITOR_MAP = {
|
179
|
-
:integer => :numberfield,
|
180
|
-
:boolean => :checkbox,
|
181
|
-
:date => :datefield,
|
182
|
-
:datetime => :xdatetime,
|
183
|
-
:string => :textfield
|
184
|
-
}
|
185
|
-
|
186
|
-
# Returns default column config understood by Netzke::GridPanel
|
187
|
-
# Argument: column name (as Symbol) or column config
|
188
|
-
def default_column_config(config)
|
189
|
-
default_dbfield_config(config, :grid)
|
190
|
-
end
|
191
|
-
|
192
|
-
#
|
193
|
-
# Used by Netzke::FormPanel
|
194
|
-
#
|
195
|
-
|
196
|
-
# default configuration as a function of ActivRecord's column type
|
197
|
-
# DEFAULTS_FOR_FIELD = {
|
198
|
-
# :integer => {
|
199
|
-
# :xtype => :numberfield
|
200
|
-
# },
|
201
|
-
# :boolean => {
|
202
|
-
# :xtype => :numberfield
|
203
|
-
# },
|
204
|
-
# :date => {
|
205
|
-
# :xtype => :datefield
|
206
|
-
# },
|
207
|
-
# :datetime => {
|
208
|
-
# :xtype => :xdatetime
|
209
|
-
# # :date_format => "Y-m-d",
|
210
|
-
# # :time_format => "H:i",
|
211
|
-
# # :time_width => 60
|
212
|
-
# },
|
213
|
-
# :string => {
|
214
|
-
# :xtype => :textfield
|
215
|
-
# }
|
216
|
-
# }
|
217
|
-
|
218
|
-
XTYPE_MAP = {
|
219
|
-
:integer => :numberfield,
|
220
|
-
:boolean => :xcheckbox,
|
221
|
-
:date => :datefield,
|
222
|
-
:datetime => :xdatetime,
|
223
|
-
:string => :textfield
|
224
|
-
}
|
225
|
-
|
226
|
-
def default_field_config(config)
|
227
|
-
# default_dbfield_config(config, :form)
|
228
|
-
config = config.is_a?(Symbol) ? {:name => config} : config.dup
|
229
|
-
|
230
|
-
# detect ActiveRecord column type (if the column is "real") or fall back to :virtual
|
231
|
-
type = (columns_hash[config[:name].to_s] && columns_hash[config[:name].to_s].type) || :virtual
|
232
|
-
|
233
|
-
common = {
|
234
|
-
:field_label => config[:name].to_s.gsub('__', '_').humanize,
|
235
|
-
:hidden => config[:name] == :id,
|
236
|
-
:xtype => XTYPE_MAP[type] || XTYPE_MAP[:string]
|
237
|
-
}
|
238
|
-
|
239
|
-
# detect :assoc__method
|
240
|
-
if config[:name].to_s.index('__')
|
241
|
-
assoc_name, method = config[:name].to_s.split('__').map(&:to_sym)
|
242
|
-
if assoc = reflect_on_association(assoc_name)
|
243
|
-
assoc_column = assoc.klass.columns_hash[method.to_s]
|
244
|
-
assoc_method_type = assoc_column.try(:type)
|
245
|
-
if assoc_method_type
|
246
|
-
common[:xtype] = ext_editor(assoc_method_type) == :checkbox ? :checkbox : :combobox
|
247
|
-
end
|
248
|
-
end
|
249
|
-
end
|
250
|
-
|
251
|
-
common.merge(config)
|
252
|
-
|
253
|
-
# default = DEFAULTS_FOR_FIELD[type] || DEFAULTS_FOR_FIELD[:string] # fallback to plain textfield
|
254
|
-
|
255
|
-
# res = default.merge(common).merge(config)
|
256
|
-
end
|
257
|
-
|
258
|
-
private
|
259
|
-
def ext_editor(type)
|
260
|
-
TYPE_EDITOR_MAP[type] || :textfield # fall back to :text_field
|
261
|
-
end
|
262
|
-
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
ActiveRecord::Base.class_eval do
|
268
|
-
include Netzke::ActiveRecordExtensions
|
269
|
-
end
|