netzke-basepack 0.5.13 → 0.5.14

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,18 @@
1
+ = v0.5.14 - 2010-09-08
2
+ * bug fix
3
+ * fields configurator wouldn't open in some cases
4
+ * icons location was hardcoded in search panel (credits to @pschyska)
5
+ * quick fix for datetimes not being displayed in the preferred timezone
6
+ * ext_config options :enable_edit_in_form and :enable_advanced_search now do have effect
7
+ * PropertyEditor fixed for Grid/FormPanel
8
+ * Grid/FormPanel again obeys persistent_config option when loading columns/fields
9
+
10
+ * enhancements
11
+ * numberfield is default in grids also for columns of type float
12
+ * more narrow exception rescuing in GridPanel code
13
+ * combobox options can now be searched ("type ahead") also in virtual columns (not efficient though, use at own risk!)
14
+ * overriding an already existing attribute with `netzke_attribute` now also has effect on association attributes, such as boss__name
15
+
1
16
  = v0.5.13 - 2010-08-11
2
17
  * regression
3
18
  * combobox options configuration again has effect
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  begin
2
2
  require 'jeweler'
3
3
  Jeweler::Tasks.new do |gemspec|
4
- gemspec.version = "0.5.13"
4
+ gemspec.version = "0.5.14"
5
5
  gemspec.name = "netzke-basepack"
6
6
  gemspec.summary = "Pre-built Rails + ExtJS widgets for your RIA"
7
7
  gemspec.description = "A set of full-featured extendible Netzke widgets (such as FormPanel, GridPanel, Window, BorderLayoutPanel, etc) which can be used as building block for your RIA"
@@ -9,7 +9,7 @@ begin
9
9
  gemspec.homepage = "http://github.com/skozlov/netzke-basepack"
10
10
  gemspec.rubyforge_project = "netzke-basepack"
11
11
  gemspec.authors = ["Sergei Kozlov"]
12
- gemspec.add_dependency("netzke-core", ">=0.5.4")
12
+ gemspec.add_dependency("netzke-core", ">=0.5.5")
13
13
  gemspec.add_dependency("searchlogic", ">=2.0.0")
14
14
  gemspec.add_dependency("will_paginate", ">=2.0.0")
15
15
  gemspec.add_dependency("acts_as_list", ">=0.1.2")
data/TODO.rdoc CHANGED
@@ -1,10 +1,10 @@
1
1
  == Priority
2
- * Add icons to buttons to actions (toolbars/menus)
2
+ * Solve the confusion about columns being stored in the persistent config
3
3
  * On grid refresh, reset the dirty fields, so that the "Apply" button doesn't do anything
4
4
  * GridPanel's read_only vs editable (doesn't work now) options
5
- * Solve the confusion about columns being stored in the persistent config
6
5
  * Inclusion of css in a stand-alone widget
7
- * Rename the "l" method to something else
6
+ * Find a way to print the grid nicely (along with the column and rows that don't fit on the screen)
7
+ * Auto-include the ID column into GridPanel by default
8
8
 
9
9
  == Foolproof
10
10
  * Should not be possible delete the "ID" field from grids/forms
@@ -69,16 +69,30 @@ module Netzke::ActiveRecord::Attributes
69
69
  end
70
70
  end
71
71
 
72
+ # Returns netzke attributes in the order of columns in the table, followed by extra declared attributes
73
+ # Detects one-to-many association columns and replaces the name of the column with association column name (Netzke style), e.g.:
74
+ #
75
+ # role_id => role__name
72
76
  def netzke_attrs_in_natural_order
73
77
  (
74
78
  declared_attrs = netzke_declared_attributes
75
79
  column_names.map do |name|
76
80
  c = {:name => name, :attr_type => columns_hash[name].type}
81
+
82
+ # If it's named as foreign key of some association, then it's an association column
83
+ assoc = reflect_on_all_associations.detect{|a| a.primary_key_name == c[:name]}
84
+
85
+ if assoc && !assoc.options[:polymorphic]
86
+ assoc_method = %w{name title label id}.detect{|m| (assoc.klass.instance_methods + assoc.klass.column_names).include?(m) } || assoc.klass.primary_key
87
+ c[:name] = "#{assoc.name}__#{assoc_method}"
88
+ c[:attr_type] = assoc.klass.columns_hash[assoc_method].type
89
+ end
90
+
77
91
  # auto set up the default value from the column settings
78
92
  c.merge!(:default_value => columns_hash[name].default) if columns_hash[name].default
79
93
 
80
94
  # if there's a declared attr with the same name, simply merge it with what's taken from the model's columns
81
- if declared = declared_attrs.detect{ |va| va[:name] == name }
95
+ if declared = declared_attrs.detect{ |va| va[:name] == c[:name] }
82
96
  c.merge!(declared)
83
97
  declared_attrs.delete(declared)
84
98
  end
@@ -8,8 +8,12 @@ module Netzke::ActiveRecord
8
8
  res = []
9
9
  for c in columns
10
10
  begin
11
- res << send(c[:name]) unless c[:included] == false
12
- rescue
11
+ next if c[:included] == false
12
+ v = send(c[:name])
13
+ # a work-around for to_json not taking the current timezone into account when serializing ActiveSupport::TimeWithZone
14
+ v = v.to_datetime.to_s(:db) if v.is_a?(ActiveSupport::TimeWithZone)
15
+ res << v
16
+ rescue NoMethodError
13
17
  # So that we don't crash at a badly configured column
14
18
  res << "UNDEF"
15
19
  end
@@ -36,10 +36,14 @@ module Netzke
36
36
  end
37
37
  end
38
38
 
39
- # apply query
40
- search.send("#{assoc_method}_like", "#{method_options[:query]}%") if method_options[:query]
39
+ if assoc.klass.column_names.include?(assoc_method)
40
+ # apply query
41
+ search.send("#{assoc_method}_like", "#{method_options[:query]}%") if method_options[:query]
42
+ search.all.map{ |r| [r.send(assoc_method)] }
43
+ else
44
+ search.all.map{ |r| r.send(assoc_method) }.select{ |value| value =~ /^#{method_options[:query]}/ }.map{ |v| [v] }
45
+ end
41
46
 
42
- search.all.map{ |r| [r.send(assoc_method)] }
43
47
  else
44
48
  # Options for a non-association attribute
45
49
  data_class.options_for(column[:name], method_options[:query]).map{|s| [s]}
@@ -125,9 +125,9 @@ module Netzke
125
125
 
126
126
  def self.property_fields
127
127
  res = [
128
- {:name => "ext_config__title", :type => :string},
129
- {:name => "ext_config__header", :type => :boolean, :default => true},
130
- # {:name => "ext_config__bbar", :type => :json}
128
+ {:name => "ext_config__title", :attr_type => :string},
129
+ {:name => "ext_config__header", :attr_type => :boolean, :default => true},
130
+ # {:name => "ext_config__bbar", :attr_type => :json}
131
131
  ]
132
132
 
133
133
  res
@@ -91,7 +91,7 @@ module Netzke
91
91
  end
92
92
 
93
93
  def load_model_level_attrs
94
- NetzkeModelAttrList.read_list(data_class.name) if data_class
94
+ NetzkeModelAttrList.read_list(data_class.name) if persistent_config_enabled? && data_class
95
95
  end
96
96
 
97
97
  def set_default_field_label(c)
@@ -133,7 +133,7 @@ module Netzke
133
133
 
134
134
  # Receives 2 arrays of columns. Merges the missing config from the +source+ into +dest+, matching columns by name
135
135
  def reverse_merge_equally_named_fields(dest, source)
136
- dest.each{ |dc| dc.reverse_merge!(source.detect{ |sc| sc[:name] == dc[:name] }) }
136
+ dest.each{ |dc| dc.reverse_merge!(source.detect{ |sc| sc[:name] == dc[:name] } || {}) }
137
137
  end
138
138
 
139
139
 
@@ -206,37 +206,28 @@ module Netzke
206
206
  # Fields to be displayed in the "General" tab of the configuration panel
207
207
  def self.property_fields
208
208
  [
209
- {:name => :ext_config__title, :type => :string},
210
- {:name => :ext_config__header, :type => :boolean, :default => true},
211
- {:name => :ext_config__enable_context_menu, :type => :boolean, :default => true},
212
- {:name => :ext_config__enable_pagination, :type => :boolean, :default => true},
213
- {:name => :ext_config__rows_per_page, :type => :integer},
214
- {:name => :ext_config__prohibit_create, :type => :boolean},
215
- {:name => :ext_config__prohibit_update, :type => :boolean},
216
- {:name => :ext_config__prohibit_delete, :type => :boolean},
217
- {:name => :ext_config__prohibit_read, :type => :boolean}
209
+ {:name => :ext_config__title, :attr_type => :string},
210
+ {:name => :ext_config__header, :attr_type => :boolean, :default => true},
211
+ {:name => :ext_config__enable_context_menu, :attr_type => :boolean, :default => true},
212
+ {:name => :ext_config__enable_pagination, :attr_type => :boolean, :default => true},
213
+ {:name => :ext_config__rows_per_page, :attr_type => :integer},
214
+ {:name => :ext_config__prohibit_create, :attr_type => :boolean},
215
+ {:name => :ext_config__prohibit_update, :attr_type => :boolean},
216
+ {:name => :ext_config__prohibit_delete, :attr_type => :boolean},
217
+ {:name => :ext_config__prohibit_read, :attr_type => :boolean}
218
218
  ]
219
219
  end
220
220
 
221
- def default_config
222
- res = super
223
-
224
- res[:ext_config][:bbar] = default_bbar
225
- res[:ext_config][:context_menu] = default_context_menu
226
-
227
- res
228
- end
229
-
230
221
  def default_bbar
231
222
  res = %w{ add edit apply del }
232
- res << "-" << "add_in_form" << "edit_in_form" if self.class.config[:edit_in_form_available]
233
- res << "-" << "search" if self.class.config[:extended_search_available]
223
+ res << "-" << "add_in_form" << "edit_in_form" if ext_config[:enable_edit_in_form]
224
+ res << "-" << "search" if ext_config[:enable_extended_search]
234
225
  res
235
226
  end
236
227
 
237
228
  def default_context_menu
238
229
  res = %w{ edit del }
239
- res << "-" << "edit_in_form" if self.class.config[:edit_in_form_available]
230
+ res << "-" << "edit_in_form" if ext_config[:enable_edit_in_form]
240
231
  res
241
232
  end
242
233
 
@@ -112,7 +112,7 @@ module Netzke
112
112
 
113
113
  # Stores modified columns in persistent storage
114
114
  def save_columns!
115
- NetzkeFieldList.update_list_for_current_authority(global_id, columns(false), original_data_class.name)
115
+ NetzkeFieldList.update_list_for_current_authority(global_id, columns(false), original_data_class.name) if persistent_config_enabled?
116
116
  end
117
117
 
118
118
  def load_columns
@@ -120,7 +120,7 @@ module Netzke
120
120
  end
121
121
 
122
122
  def load_model_level_attrs
123
- NetzkeModelAttrList.read_list(data_class.name)
123
+ NetzkeModelAttrList.read_list(data_class.name) if persistent_config_enabled?
124
124
  end
125
125
 
126
126
  # whether a column is bound to the primary_key
@@ -181,31 +181,19 @@ module Netzke
181
181
  end
182
182
 
183
183
  # Detects an association column and sets up the proper editor.
184
- # If a column is a foreign key (e.g. "category_id"), also renames the column into "normalized" association column, e.g.:
185
- # category__name
186
- # If association doesn't respond to methods "name", "title" or "label", falls back to "id", e.g.:
187
- # category__id
188
184
  def detect_association(c)
189
- # named as foreign key of some association?
190
- assoc = data_class.reflect_on_all_associations.detect{|a| a.primary_key_name == c[:name]}
191
-
192
- if assoc && !assoc.options[:polymorphic]
193
- assoc_method = %w{name title label id}.detect{|m| (assoc.klass.instance_methods + assoc.klass.column_names).include?(m) } || assoc.klass.primary_key
194
- c[:name] = "#{assoc.name}__#{assoc_method}"
195
- end
196
-
197
- # named with an double-underscore notation? surely an association column then
198
- if !assoc && c[:name].index('__')
185
+ # double-underscore notation? surely an association column
186
+ if c[:name].index('__')
199
187
  assoc_name, assoc_method = c[:name].split('__')
200
188
  assoc = data_class.reflect_on_association(assoc_name.to_sym)
201
- end
202
189
 
203
- if assoc && assoc_method
204
- assoc_column = assoc.klass.columns_hash[assoc_method]
205
- assoc_method_type = assoc_column.try(:type)
190
+ if assoc && assoc_method
191
+ assoc_column = assoc.klass.columns_hash[assoc_method]
192
+ assoc_method_type = assoc_column.try(:type)
206
193
 
207
- # if association column is boolean, display a checkbox (or alike), otherwise - a combobox (or alike)
208
- c[:editor] ||= assoc_method_type == :boolean ? editor_for_attr_type(:boolean) : editor_for_association
194
+ # if association column is boolean, display a checkbox (or alike), otherwise - a combobox (or alike)
195
+ c[:editor] ||= assoc_method_type == :boolean ? editor_for_attr_type(:boolean) : editor_for_association
196
+ end
209
197
  end
210
198
  end
211
199
 
@@ -233,7 +221,7 @@ module Netzke
233
221
 
234
222
  # Receives 2 arrays of columns. Merges the missing config from the +source+ into +dest+, matching columns by name
235
223
  def reverse_merge_equally_named_columns(dest, source)
236
- dest.each{ |dc| dc.reverse_merge!(source.detect{ |sc| sc[:name] == dc[:name] }) }
224
+ dest.each{ |dc| dc.reverse_merge!(source.detect{ |sc| sc[:name] == dc[:name] } || {}) }
237
225
  end
238
226
 
239
227
  def self.included(receiver)
@@ -8,6 +8,8 @@ module Netzke
8
8
  # to the JavaScript side.
9
9
  def js_config
10
10
  super.merge(
11
+ :bbar => ext_config.has_key?(:bbar) ? ext_config[:bbar] : default_bbar,
12
+ :context_menu => ext_config.has_key?(:context_menu) ? ext_config[:context_menu] : default_context_menu,
11
13
  :clmns => columns, # columns
12
14
  :model => config[:model], # the model name
13
15
  :inline_data => (get_data if ext_config[:load_inline_data]), # inline data (loaded along with the grid panel)
@@ -249,6 +249,7 @@ Netzke.pre.GridPanel = Ext.extend(Ext.grid.EditorGridPanel, {
249
249
 
250
250
  attrTypeEditorMap: {
251
251
  integer : "numberfield",
252
+ "float" : "numberfield",
252
253
  "boolean": "checkbox",
253
254
  decimal : "numberfield",
254
255
  datetime : "xdatetime",
@@ -34,8 +34,8 @@ module Netzke
34
34
 
35
35
  def actions
36
36
  super.merge(
37
- :save => {:text => "Save", :icon => "/images/icons/disk.png"},
38
- :del => {:text => "Delete", :icon => "/images/icons/delete.png"}
37
+ :save => {:text => "Save", :icon => Netzke::Base.config[:with_icons] && (Netzke::Base.config[:icons_uri] + "disk.png")},
38
+ :del => {:text => "Delete", :icon => Netzke::Base.config[:with_icons] && (Netzke::Base.config[:icons_uri] + "delete.png")}
39
39
  )
40
40
  end
41
41
 
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netzke-basepack
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 5
9
- - 13
10
- version: 0.5.13
8
+ - 14
9
+ version: 0.5.14
11
10
  platform: ruby
12
11
  authors:
13
12
  - Sergei Kozlov
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-08-11 00:00:00 +02:00
17
+ date: 2010-09-08 00:00:00 +02:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,12 +25,11 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 3
30
28
  segments:
31
29
  - 0
32
30
  - 5
33
- - 4
34
- version: 0.5.4
31
+ - 5
32
+ version: 0.5.5
35
33
  type: :runtime
36
34
  version_requirements: *id001
37
35
  - !ruby/object:Gem::Dependency
@@ -42,7 +40,6 @@ dependencies:
42
40
  requirements:
43
41
  - - ">="
44
42
  - !ruby/object:Gem::Version
45
- hash: 15
46
43
  segments:
47
44
  - 2
48
45
  - 0
@@ -58,7 +55,6 @@ dependencies:
58
55
  requirements:
59
56
  - - ">="
60
57
  - !ruby/object:Gem::Version
61
- hash: 15
62
58
  segments:
63
59
  - 2
64
60
  - 0
@@ -74,7 +70,6 @@ dependencies:
74
70
  requirements:
75
71
  - - ">="
76
72
  - !ruby/object:Gem::Version
77
- hash: 31
78
73
  segments:
79
74
  - 0
80
75
  - 1
@@ -208,21 +203,9 @@ has_rdoc: true
208
203
  homepage: http://github.com/skozlov/netzke-basepack
209
204
  licenses: []
210
205
 
211
- post_install_message: |+
212
-
213
- ========================================================================
214
-
215
- Thanks for installing Netzke Basepack!
216
-
217
- Don't forget to run "./script/generate netzke_basepack" for each
218
- Rails app that will be using this gem.
219
-
220
- Netzke home page: http://netzke.org
221
- Netzke Google Groups: http://groups.google.com/group/netzke
222
- Netzke tutorials: http://blog.writelesscode.com
223
-
224
- ========================================================================
225
-
206
+ post_install_message: "\n\
207
+ ========================================================================\n\n Thanks for installing Netzke Basepack!\n \n Don't forget to run \"./script/generate netzke_basepack\" for each \n Rails app that will be using this gem.\n\n Netzke home page: http://netzke.org\n Netzke Google Groups: http://groups.google.com/group/netzke\n Netzke tutorials: http://blog.writelesscode.com\n\n\
208
+ ========================================================================\n\n"
226
209
  rdoc_options:
227
210
  - --charset=UTF-8
228
211
  require_paths:
@@ -232,7 +215,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
232
215
  requirements:
233
216
  - - ">="
234
217
  - !ruby/object:Gem::Version
235
- hash: 3
236
218
  segments:
237
219
  - 0
238
220
  version: "0"
@@ -241,7 +223,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
241
223
  requirements:
242
224
  - - ">="
243
225
  - !ruby/object:Gem::Version
244
- hash: 3
245
226
  segments:
246
227
  - 0
247
228
  version: "0"