netzke-basepack 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +9 -1
- data/README.md +5 -8
- data/Rakefile +0 -1
- data/lib/netzke/active_record/attributes.rb +13 -5
- data/lib/netzke/basepack.rb +0 -1
- data/lib/netzke/basepack/data_accessor.rb +76 -17
- data/lib/netzke/basepack/form_panel.rb +23 -34
- data/lib/netzke/basepack/form_panel/fields.rb +7 -0
- data/lib/netzke/basepack/form_panel/services.rb +6 -3
- data/lib/netzke/basepack/grid_panel/services.rb +2 -49
- data/lib/netzke/basepack/version.rb +1 -1
- data/netzke-basepack.gemspec +158 -154
- data/test/{rails_app → basepack_test_app}/.gitignore +2 -1
- data/test/basepack_test_app/.rvmrc +1 -0
- data/test/{rails_app → basepack_test_app}/Gemfile +2 -3
- data/test/{rails_app → basepack_test_app}/Gemfile.lock +80 -70
- data/test/{rails_app → basepack_test_app}/README +0 -0
- data/test/{rails_app → basepack_test_app}/Rakefile +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/author_form.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/author_grid.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_form.rb +3 -2
- data/test/{rails_app → basepack_test_app}/app/components/book_form_with_custom_fields.rb +0 -0
- data/test/basepack_test_app/app/components/book_form_with_defaults.rb +8 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_form_with_nested_attributes.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_loader.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_custom_columns.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_default_values.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_extra_feedback.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_extra_filters.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_nested_attributes.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_paging.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_persistence.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_scoped_authors.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_grid_with_virtual_attributes.rb +1 -1
- data/test/{rails_app → basepack_test_app}/app/components/book_paging_form_panel.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_query_builder.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_search_panel.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_search_panel/javascripts/i18n_de.js +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/book_with_custom_primary_key_grid.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/books_bound_to_author.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/double_book_grid.rb +0 -0
- data/test/basepack_test_app/app/components/extras/book_presentation.rb +20 -0
- data/test/{rails_app → basepack_test_app}/app/components/form_without_model.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/generic_user_form.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/lockable_book_form.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/lockable_user_form.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/paging_form_with_search.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/simple_accordion.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/simple_panel.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/simple_tab_panel.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/simple_window.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/simple_wrapper.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/some_accordion_panel.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/some_auth_app.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/some_border_layout.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/some_simple_app.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/some_tab_panel.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/user_form.rb +1 -1
- data/test/{rails_app → basepack_test_app}/app/components/user_form_with_default_fields.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/user_grid.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/user_grid_with_customized_form_fields.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/components/window_component_loader.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/controllers/application_controller.rb +0 -0
- data/test/basepack_test_app/app/controllers/components_controller.rb +10 -0
- data/test/basepack_test_app/app/controllers/welcome_controller.rb +9 -0
- data/test/basepack_test_app/app/helpers/application_helper.rb +8 -0
- data/test/{rails_app → basepack_test_app}/app/helpers/embedded_components_helper.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/models/address.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/models/author.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/models/book.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/models/book_with_custom_primary_key.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/models/role.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/models/user.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/presenters/forms/generic_user.rb +0 -0
- data/test/{rails_app → basepack_test_app}/app/views/components/loadable_window.html.erb +0 -0
- data/test/{rails_app → basepack_test_app}/app/views/components/simple_panel.html.erb +0 -0
- data/test/basepack_test_app/app/views/layouts/application.html.erb +12 -0
- data/test/{rails_app/app/views/layouts/application.html.erb → basepack_test_app/app/views/layouts/components.html.erb} +0 -0
- data/test/{rails_app → basepack_test_app}/app/views/layouts/nested.html.erb +0 -0
- data/test/basepack_test_app/app/views/welcome/index.html.erb +10 -0
- data/test/{rails_app → basepack_test_app}/config.ru +0 -0
- data/test/{rails_app → basepack_test_app}/config/application.rb +7 -0
- data/test/{rails_app → basepack_test_app}/config/boot.rb +0 -0
- data/test/{rails_app → basepack_test_app}/config/cucumber.yml +0 -0
- data/test/{rails_app → basepack_test_app}/config/database.yml.sample +0 -0
- data/test/{rails_app → basepack_test_app}/config/environment.rb +0 -0
- data/test/{rails_app → basepack_test_app}/config/environments/development.rb +1 -1
- data/test/{rails_app → basepack_test_app}/config/environments/production.rb +0 -0
- data/test/{rails_app → basepack_test_app}/config/environments/test.rb +0 -0
- data/test/{rails_app → basepack_test_app}/config/initializers/backtrace_silencers.rb +0 -1
- data/test/{rails_app → basepack_test_app}/config/initializers/inflections.rb +0 -0
- data/test/{rails_app → basepack_test_app}/config/initializers/mime_types.rb +0 -0
- data/test/{rails_app → basepack_test_app}/config/initializers/netzke.rb +1 -1
- data/test/{rails_app → basepack_test_app}/config/initializers/secret_token.rb +0 -0
- data/test/{rails_app → basepack_test_app}/config/initializers/session_store.rb +1 -1
- data/test/{rails_app → basepack_test_app}/config/locales/de.yml +0 -0
- data/test/{rails_app → basepack_test_app}/config/locales/es.yml +0 -0
- data/test/{rails_app → basepack_test_app}/config/routes.rb +0 -0
- data/test/basepack_test_app/db/development_structure.sql +88 -0
- data/test/{rails_app → basepack_test_app}/db/migrate/20100914104207_create_users.rb +0 -0
- data/test/{rails_app → basepack_test_app}/db/migrate/20100914104236_create_roles.rb +0 -0
- data/test/{rails_app → basepack_test_app}/db/migrate/20101026185816_create_authors.rb +0 -0
- data/test/{rails_app → basepack_test_app}/db/migrate/20101026190021_create_books.rb +0 -0
- data/test/{rails_app → basepack_test_app}/db/migrate/20110101143818_create_addresses.rb +0 -0
- data/test/{rails_app → basepack_test_app}/db/migrate/20110213213050_create_netzke_component_states.rb +0 -0
- data/test/{rails_app → basepack_test_app}/db/migrate/20110701070052_create_book_with_custom_primary_keys.rb +0 -0
- data/test/basepack_test_app/db/migrate/20110901114016_add_last_read_at_to_books.rb +9 -0
- data/test/{rails_app → basepack_test_app}/db/schema.rb +4 -2
- data/test/{rails_app → basepack_test_app}/db/seeds.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/accordion_panel.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/components_in_view.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/form_panel.feature +15 -0
- data/test/{rails_app → basepack_test_app}/features/grid_panel.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/grid_panel_with_custom_primary_key.feature +0 -0
- data/test/basepack_test_app/features/grid_sorting.feature +39 -0
- data/test/{rails_app → basepack_test_app}/features/i18n.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/nested_attributes.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/paging_form_panel.feature +0 -1
- data/test/{rails_app → basepack_test_app}/features/search_in_grid.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/simple_app.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/simple_panel.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/step_definitions/accordion_steps.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/step_definitions/ext_steps.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/step_definitions/form_panel_steps.rb +4 -7
- data/test/{rails_app → basepack_test_app}/features/step_definitions/generic_steps.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/step_definitions/grid_panel_steps.rb +28 -5
- data/test/{rails_app → basepack_test_app}/features/step_definitions/pickle_steps.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/step_definitions/web_steps.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/support/env.rb +2 -5
- data/test/{rails_app → basepack_test_app}/features/support/paths.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/support/pickle.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/support/selectors.rb +0 -0
- data/test/{rails_app → basepack_test_app}/features/tab_panel.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/validations_in_grid.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/virtual_attributes.feature +0 -0
- data/test/{rails_app → basepack_test_app}/features/window.feature +0 -0
- data/test/{rails_app → basepack_test_app}/lib/tasks/.gitkeep +0 -0
- data/test/{rails_app → basepack_test_app}/lib/tasks/cucumber.rake +0 -0
- data/test/{rails_app → basepack_test_app}/public/404.html +0 -0
- data/test/{rails_app → basepack_test_app}/public/422.html +0 -0
- data/test/{rails_app → basepack_test_app}/public/500.html +0 -0
- data/test/{rails_app → basepack_test_app}/public/favicon.ico +0 -0
- data/test/{rails_app → basepack_test_app}/public/images/header-deco.gif +0 -0
- data/test/{rails_app → basepack_test_app}/public/images/rails.png +0 -0
- data/test/{rails_app → basepack_test_app}/public/javascripts/application.js +0 -0
- data/test/{rails_app → basepack_test_app}/public/javascripts/controls.js +0 -0
- data/test/{rails_app → basepack_test_app}/public/javascripts/dragdrop.js +0 -0
- data/test/{rails_app → basepack_test_app}/public/javascripts/effects.js +0 -0
- data/test/{rails_app → basepack_test_app}/public/javascripts/prototype.js +0 -0
- data/test/{rails_app → basepack_test_app}/public/javascripts/rails.js +0 -0
- data/test/{rails_app → basepack_test_app}/public/robots.txt +0 -0
- data/test/{rails_app → basepack_test_app}/public/stylesheets/.gitkeep +0 -0
- data/test/{rails_app → basepack_test_app}/script/cucumber +0 -0
- data/test/{rails_app → basepack_test_app}/script/rails +0 -0
- data/test/{rails_app → basepack_test_app}/spec/active_record/attributes_spec.rb +0 -0
- data/test/{rails_app → basepack_test_app}/spec/active_record/relation_extensions_spec.rb +0 -0
- data/test/{rails_app → basepack_test_app}/spec/components/form_panel_spec.rb +0 -0
- data/test/{rails_app → basepack_test_app}/spec/components/grid_panel_spec.rb +0 -0
- data/test/{rails_app → basepack_test_app}/spec/factories.rb +0 -0
- data/test/{rails_app → basepack_test_app}/spec/spec_helper.rb +0 -0
- data/test/{rails_app → basepack_test_app}/test/performance/browsing_test.rb +0 -0
- data/test/{rails_app → basepack_test_app}/test/test_helper.rb +0 -0
- data/test/{rails_app → basepack_test_app}/vendor/plugins/.gitkeep +0 -0
- metadata +198 -207
- data/test/rails_app/app/components/book_presentation.rb +0 -18
- data/test/rails_app/app/controllers/components_controller.rb +0 -6
- data/test/rails_app/app/controllers/welcome_controller.rb +0 -5
- data/test/rails_app/app/helpers/application_helper.rb +0 -2
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
= 0.7.1 - 2011-09-04
|
2
|
+
* bug fix
|
3
|
+
* fixing the netzke_load endpoint when association fields are present
|
4
|
+
* dates were not displayed in date fields, and submitting a form with date fields might result in erasing those fields
|
5
|
+
|
6
|
+
* Rails 3.1 compatibility
|
7
|
+
* no meta_where dependencies (searching and filtering done with Arel)
|
8
|
+
|
1
9
|
= 0.7.0 - 2011-08-09
|
2
10
|
* Core 0.7.0 and Ext 4 compatibility
|
3
11
|
* API changes
|
@@ -6,7 +14,7 @@
|
|
6
14
|
= v0.6.5 - to be released
|
7
15
|
* enhancements
|
8
16
|
* When columns states are saved in the persistent storage, adding/removing columns (e.g. in the code) will reset the saved states
|
9
|
-
* Moved features and specs to test/
|
17
|
+
* Moved features and specs to test/basepack_test_app
|
10
18
|
* bug fix
|
11
19
|
* FormPanel with multiple association fields wouldn't submit data correctly
|
12
20
|
* GridPanel's forms take over the +text+ configuration option for columns as +fieldLabel+ for default fields
|
data/README.md
CHANGED
@@ -24,7 +24,7 @@ Embed a basepack component into a view as any other Netzke component, e.g.:
|
|
24
24
|
|
25
25
|
<%= netzke :books, :class_name => 'Netzke::Basepack::GridPanel', :model => 'Book' %>
|
26
26
|
|
27
|
-
For more examples, see http://demo.netzke.com, and look into test/
|
27
|
+
For more examples, see http://demo.netzke.com, and look into test/basepack_test_app.
|
28
28
|
|
29
29
|
## Testing and playing with Netzke Basepack
|
30
30
|
|
@@ -32,13 +32,9 @@ Netzke Basepack is bundled with Cucumber and RSpec tests. If you would like to c
|
|
32
32
|
|
33
33
|
Besides, the bundled test application is a convenient [playground](https://github.com/skozlov/netzke-core/wiki/Playground) for those who search to experiment with the framework.
|
34
34
|
|
35
|
-
After
|
35
|
+
After starting up the test app, you can see the list of functional test components on the index page (along with links to the source code):
|
36
36
|
|
37
|
-
http://localhost:3000/
|
38
|
-
|
39
|
-
e.g.:
|
40
|
-
|
41
|
-
http://localhost:3000/components/UserGrid
|
37
|
+
http://localhost:3000/
|
42
38
|
|
43
39
|
## Icons support
|
44
40
|
Netzke Basepack can make use of FamFamFam Silk icon set (http://www.famfamfam.com/archive/silk-icons-thats-your-lot/). To enable this, download the icons and put the "icons" folder into your app's public/images folder. Then restart your application.
|
@@ -55,9 +51,10 @@ Official project site: http://netzke.org
|
|
55
51
|
Twitter:
|
56
52
|
|
57
53
|
* latest news about Netzke: http://twitter.com/netzke
|
58
|
-
* author's
|
54
|
+
* author's tweets on osx, productivity and what not: http://twitter.com/nomadcoder
|
59
55
|
|
60
56
|
Many (if a bit outdated) tutorials: http://blog.writelesscode.com
|
61
57
|
|
62
58
|
---
|
63
59
|
Copyright (c) 2008-2011 NomadCoder, released under the MIT license
|
60
|
+
Note, that Ext JS itself is licensed [differently](http://www.sencha.com/products/extjs/license/)
|
data/Rakefile
CHANGED
@@ -10,7 +10,6 @@ begin
|
|
10
10
|
gemspec.homepage = "http://netzke.org"
|
11
11
|
gemspec.authors = ["Sergei Kozlov"]
|
12
12
|
gemspec.add_dependency("netzke-core", "~>0.7.0")
|
13
|
-
gemspec.add_dependency("meta_where", "~>1.0.0")
|
14
13
|
gemspec.add_dependency("will_paginate", "~>3.0.0")
|
15
14
|
gemspec.add_dependency("acts_as_list", "~>0.1.4")
|
16
15
|
gemspec.post_install_message = <<-MESSAGE
|
@@ -104,10 +104,10 @@ module Netzke
|
|
104
104
|
c = {:name => name, :attr_type => columns_hash[name].type}
|
105
105
|
|
106
106
|
# If it's named as foreign key of some association, then it's an association column
|
107
|
-
assoc = reflect_on_all_associations.detect{|a| a
|
107
|
+
assoc = reflect_on_all_associations.detect { |a| foreign_key_for_assoc(a) == c[:name] }
|
108
108
|
|
109
109
|
if assoc && !assoc.options[:polymorphic]
|
110
|
-
candidates = %w{name title label} << assoc
|
110
|
+
candidates = %w{name title label} << foreign_key_for_assoc(assoc)
|
111
111
|
assoc_method = candidates.detect{|m| (assoc.klass.instance_methods.map(&:to_s) + assoc.klass.column_names).include?(m) }
|
112
112
|
c[:name] = "#{assoc.name}__#{assoc_method}"
|
113
113
|
c[:attr_type] = assoc.klass.columns_hash[assoc_method].try(:type) || :string # when it's an instance method rather than a column, fall back to :string
|
@@ -127,6 +127,11 @@ module Netzke
|
|
127
127
|
).reject { |attr| netzke_excluded_attributes.include?(attr[:name]) }
|
128
128
|
end
|
129
129
|
|
130
|
+
# Returns foreign key for given association (Rails >= 3.0)
|
131
|
+
def foreign_key_for_assoc(assoc)
|
132
|
+
assoc.respond_to?(:foreign_key) ? assoc.foreign_key : assoc.primary_key_name
|
133
|
+
end
|
134
|
+
|
130
135
|
def association_attr?(attr_name)
|
131
136
|
!!attr_name.index("__") # probably we can't do much better than this, as we don't know at this moment if the associated model has a specific attribute, and we don't really want to find it out
|
132
137
|
end
|
@@ -169,7 +174,7 @@ module Netzke
|
|
169
174
|
if r.respond_to?(m)
|
170
175
|
r.send(m)
|
171
176
|
else
|
172
|
-
logger.debug "
|
177
|
+
logger.debug "Netzke::Basepack: Wrong attribute name: #{a[:name]}" unless r.nil?
|
173
178
|
nil
|
174
179
|
end
|
175
180
|
end
|
@@ -180,11 +185,14 @@ module Netzke
|
|
180
185
|
|
181
186
|
# a work-around for to_json not taking the current timezone into account when serializing ActiveSupport::TimeWithZone
|
182
187
|
v = v.to_datetime.to_s(:db) if v.is_a?(ActiveSupport::TimeWithZone)
|
188
|
+
|
183
189
|
v
|
184
190
|
end
|
185
191
|
|
186
192
|
# Assigns new value to an (association) attribute
|
187
193
|
def set_value_for_attribute(a, v)
|
194
|
+
v = v.to_time_in_current_zone if v.is_a?(Date) # convert Date to Time
|
195
|
+
|
188
196
|
if a[:setter]
|
189
197
|
a[:setter].call(self, v)
|
190
198
|
elsif respond_to?("#{a[:name]}=")
|
@@ -215,10 +223,10 @@ module Netzke
|
|
215
223
|
self.send("#{assoc.options[:foreign_key] || assoc.name.to_s.foreign_key}=", v)
|
216
224
|
end
|
217
225
|
else
|
218
|
-
logger.debug "
|
226
|
+
logger.debug "Netzke::Basepack: Association #{assoc} is not known for class #{self.class.name}"
|
219
227
|
end
|
220
228
|
else
|
221
|
-
logger.debug "
|
229
|
+
logger.debug "Netzke::Basepack: Wrong attribute name: #{a[:name]}"
|
222
230
|
end
|
223
231
|
end
|
224
232
|
end
|
data/lib/netzke/basepack.rb
CHANGED
@@ -108,57 +108,116 @@ module Netzke
|
|
108
108
|
end
|
109
109
|
|
110
110
|
# An ActiveRecord::Relation instance encapsulating all the necessary conditions.
|
111
|
-
# Using the meta_where magic.
|
112
111
|
def get_relation(params = {})
|
113
|
-
|
114
|
-
conditions = params[:filter] && convert_filters(params[:filter]) || {}
|
112
|
+
@arel = data_class.arel_table
|
115
113
|
|
116
|
-
relation = data_class.
|
114
|
+
relation = data_class.scoped
|
115
|
+
|
116
|
+
relation = apply_column_filters(relation, params[:filter]) if params[:filter]
|
117
117
|
|
118
118
|
if params[:extra_conditions]
|
119
119
|
extra_conditions = normalize_extra_conditions(ActiveSupport::JSON.decode(params[:extra_conditions]))
|
120
120
|
relation = relation.extend_with_netzke_conditions(extra_conditions) if params[:extra_conditions]
|
121
121
|
end
|
122
122
|
|
123
|
-
|
123
|
+
query = params[:query] && ActiveSupport::JSON.decode(params[:query])
|
124
|
+
|
125
|
+
if query.present?
|
124
126
|
# array of arrays of conditions that should be joined by OR
|
125
|
-
|
126
|
-
|
127
|
-
normalize_and_conditions(conditions)
|
127
|
+
and_predicates = query.map do |conditions|
|
128
|
+
predicates_for_and_conditions(conditions)
|
128
129
|
end
|
129
130
|
|
130
131
|
# join them by OR
|
131
|
-
|
132
|
+
predicates = and_predicates[1..-1].inject(and_predicates.first){ |r,c| r.or(c) }
|
132
133
|
end
|
133
134
|
|
134
|
-
relation = relation.where(
|
135
|
+
relation = relation.where(predicates)
|
135
136
|
|
136
137
|
relation = relation.extend_with(config[:scope]) if config[:scope]
|
137
138
|
|
138
139
|
relation
|
139
140
|
end
|
140
141
|
|
142
|
+
# Parses and applies grid column filters, calling consequent "where" methods on the passed relation.
|
143
|
+
# Returns the updated relation.
|
144
|
+
#
|
145
|
+
# Example column grid data:
|
146
|
+
#
|
147
|
+
# {"0" => {
|
148
|
+
# "data" => {
|
149
|
+
# "type" => "numeric",
|
150
|
+
# "comparison" => "gt",
|
151
|
+
# "value" => 10 },
|
152
|
+
# "field" => "id"
|
153
|
+
# },
|
154
|
+
# "1" => {
|
155
|
+
# "data" => {
|
156
|
+
# "type" => "string",
|
157
|
+
# "value" => "pizza"
|
158
|
+
# },
|
159
|
+
# "field" => "food_name"
|
160
|
+
# }}
|
161
|
+
#
|
162
|
+
# This will result in:
|
163
|
+
#
|
164
|
+
# relation.where(["id > ?", 10]).where(["food_name like ?", "%pizza%"])
|
165
|
+
def apply_column_filters(relation, column_filter)
|
166
|
+
res = relation
|
167
|
+
operator_map = {"lt" => "<", "gt" => ">"}
|
168
|
+
|
169
|
+
# these are still JSON-encoded due to the migration to Ext.direct
|
170
|
+
column_filter=JSON.parse(column_filter)
|
171
|
+
column_filter.each do |v|
|
172
|
+
assoc, method = v["field"].split('__')
|
173
|
+
if method
|
174
|
+
assoc = data_class.reflect_on_association(assoc.to_sym)
|
175
|
+
field = [assoc.klass.table_name, method].join('.').to_sym
|
176
|
+
else
|
177
|
+
field = assoc.to_sym
|
178
|
+
end
|
179
|
+
|
180
|
+
value = v["value"]
|
181
|
+
|
182
|
+
op = operator_map[v['comparison']]
|
183
|
+
|
184
|
+
case v["type"]
|
185
|
+
when "string"
|
186
|
+
res = res.where(["#{field} like ?", "%#{value}%"])
|
187
|
+
when "numeric", "date"
|
188
|
+
res = res.where(["#{field} #{op} ?", value])
|
189
|
+
else
|
190
|
+
res = res.where(["#{field} = ?", value])
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
res
|
195
|
+
end
|
196
|
+
|
197
|
+
|
141
198
|
protected
|
142
199
|
|
143
|
-
def
|
144
|
-
|
200
|
+
def predicates_for_and_conditions(conditions)
|
201
|
+
return nil if conditions.empty?
|
202
|
+
|
203
|
+
predicates = conditions.map do |q|
|
145
204
|
value = q["value"]
|
146
205
|
case q["operator"]
|
147
206
|
when "contains"
|
148
|
-
q["attr"].
|
207
|
+
@arel[q["attr"]].matches "%#{value}%"
|
149
208
|
else
|
150
209
|
if value == false || value == true
|
151
|
-
q["attr"].
|
210
|
+
@arel[q["attr"]].eq(value ? 1 : 0)
|
152
211
|
else
|
153
|
-
q["attr"].
|
212
|
+
@arel[q["attr"]].send(q["operator"], value)
|
154
213
|
end
|
155
214
|
end
|
156
215
|
end
|
157
216
|
|
158
217
|
# join them by AND
|
159
|
-
|
218
|
+
predicates[1..-1].inject(predicates.first){ |r,p| r.and(p) }
|
160
219
|
end
|
161
220
|
|
162
221
|
end
|
163
222
|
end
|
164
|
-
end
|
223
|
+
end
|
@@ -6,7 +6,8 @@ module Netzke
|
|
6
6
|
module Basepack
|
7
7
|
# Ext.form.Panel-based component
|
8
8
|
#
|
9
|
-
# ==
|
9
|
+
# == Netzke-specific config options
|
10
|
+
#
|
10
11
|
# * +model+ - name of the ActiveRecord model that provides data to this GridPanel.
|
11
12
|
# * +record+ - record to be displayd in the form. Takes precedence over +:record_id+
|
12
13
|
# * +record_id+ - id of the record to be displayd in the form. Also see +:record+
|
@@ -14,10 +15,20 @@ module Netzke
|
|
14
15
|
# * +mode+ - render mode, accepted options:
|
15
16
|
# * +lockable+ - makes the form panel load initially in "display mode", then lets "unlock" it, change the values, and "lock" it again, while updating the values on the server
|
16
17
|
# * +updateMask+ - +Ext.LoadMask+ config options for the mask shown while the form is submitting its values
|
17
|
-
# Besides, FormPanel can accept any meaninful :
|
18
18
|
#
|
19
19
|
# === Layout configuration
|
20
|
+
#
|
20
21
|
# The layout of the form is configured by supplying the +item+ config option, same way it would be configured in Ext (thus allowing for complex form layouts). FormPanel will expand fields by looking at their names (unless +no_binding+ set to +true+ is specified for a specific field).
|
22
|
+
#
|
23
|
+
# == Endpoints
|
24
|
+
# FormPanel implements the following endpoints:
|
25
|
+
#
|
26
|
+
# * +netzke_load+ - loads a record with a given id from the server, e.g.:
|
27
|
+
#
|
28
|
+
# someFormPanel.netzkeLoad({id: 100});
|
29
|
+
#
|
30
|
+
# * +netzke_submit+ - gets called when the form gets submitted (e.g. by pressing the Apply button, or by calling onApply)
|
31
|
+
# * +get_combobox_options+ - gets called when a 'remote' combobox field gets expanded
|
21
32
|
class FormPanel < Netzke::Base
|
22
33
|
|
23
34
|
js_base_class "Ext.form.Panel"
|
@@ -94,44 +105,22 @@ module Netzke
|
|
94
105
|
|
95
106
|
# A hash of record data including the meta field
|
96
107
|
def js_record_data
|
97
|
-
record.to_hash(fields).merge(:_meta => meta_field).literalize_keys
|
108
|
+
hsh = record.to_hash(fields).merge(:_meta => meta_field).literalize_keys
|
109
|
+
|
110
|
+
# HACK: a dirty hack cutting off the time part from the datetime string to please the form's datefield - until we have a real datetimefield
|
111
|
+
hsh.each_pair do |k,v|
|
112
|
+
if v && [:datetime, :date].include?(fields[k.to_sym].try(:fetch, :attr_type, nil))
|
113
|
+
hsh[k] = v.split.first
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
hsh
|
98
118
|
end
|
99
119
|
|
100
120
|
def record
|
101
121
|
@record ||= config[:record] || config[:record_id] && data_class && data_class.where(data_class.primary_key => config[:record_id]).first
|
102
122
|
end
|
103
123
|
|
104
|
-
# def configuration_components
|
105
|
-
# res = []
|
106
|
-
#
|
107
|
-
# res << {
|
108
|
-
# :name => 'fields',
|
109
|
-
# :class_name => "FieldsConfigurator",
|
110
|
-
# :active => true,
|
111
|
-
# :owner => self,
|
112
|
-
# :persistent_config => true
|
113
|
-
# }
|
114
|
-
#
|
115
|
-
# res << {
|
116
|
-
# :name => 'general',
|
117
|
-
# :class_name => "PropertyEditor",
|
118
|
-
# :component => self,
|
119
|
-
# :title => false
|
120
|
-
# }
|
121
|
-
#
|
122
|
-
# res
|
123
|
-
# end
|
124
|
-
|
125
|
-
def self.property_fields
|
126
|
-
res = [
|
127
|
-
{:name => "ext_config__title", :attr_type => :string},
|
128
|
-
{:name => "ext_config__header", :attr_type => :boolean, :default => true},
|
129
|
-
{:name => "ext_config__bbar", :attr_type => :json}
|
130
|
-
]
|
131
|
-
|
132
|
-
res
|
133
|
-
end
|
134
|
-
|
135
124
|
private
|
136
125
|
|
137
126
|
def self.server_side_config_options
|
@@ -100,6 +100,12 @@ module Netzke
|
|
100
100
|
set_default_field_xtype(field) if field[:xtype].nil?
|
101
101
|
set_default_read_only(field)
|
102
102
|
|
103
|
+
# temporal datetime setup, while we don't have real datetime field
|
104
|
+
if field[:attr_type] == :datetime || field[:attr_type] == :date
|
105
|
+
field[:format] ||= "Y-m-d" # needed for
|
106
|
+
field[:submit_format] = "Y-m-d"
|
107
|
+
end
|
108
|
+
|
103
109
|
# provide our special combobox with our id
|
104
110
|
field[:parent_id] = self.global_id if field[:xtype] == :netzkeremotecombo
|
105
111
|
|
@@ -183,6 +189,7 @@ module Netzke
|
|
183
189
|
:date => :datefield,
|
184
190
|
# WIP: waiting for datetime.js implementation for ExtJS 4
|
185
191
|
# :datetime => :datetimefield,
|
192
|
+
:datetime => :datefield,
|
186
193
|
|
187
194
|
:text => :textarea,
|
188
195
|
:json => :jsonfield,
|
@@ -8,14 +8,18 @@ module Netzke
|
|
8
8
|
|
9
9
|
#
|
10
10
|
# Endpoints
|
11
|
-
|
11
|
+
|
12
|
+
# Called when the form gets submitted (e.g. by pressing the Apply button)
|
12
13
|
endpoint :netzke_submit, :pre => true do |params|
|
13
14
|
netzke_submit(params)
|
14
15
|
end
|
15
16
|
|
17
|
+
# Can be called when the form needs to load a record with given ID. E.g.:
|
18
|
+
#
|
19
|
+
# someForm.netzkeLoad({id: 100});
|
16
20
|
endpoint :netzke_load do |params|
|
17
21
|
@record = data_class && data_class.find_by_id(params[:id])
|
18
|
-
{:set_form_values =>
|
22
|
+
{:set_form_values => js_record_data}
|
19
23
|
end
|
20
24
|
|
21
25
|
# Returns options for a combobox
|
@@ -98,7 +102,6 @@ module Netzke
|
|
98
102
|
|
99
103
|
# Creates/updates a record from hash
|
100
104
|
def create_or_update_record(hsh)
|
101
|
-
|
102
105
|
hsh.merge!(config[:strong_default_attrs]) if config[:strong_default_attrs]
|
103
106
|
@record ||= data_class.find(:first, :conditions => {data_class.primary_key => hsh.delete(data_class.primary_key)}) # only pick up the record specified in the params if it was not provided in the configuration
|
104
107
|
success = true
|
@@ -214,10 +214,10 @@ module Netzke
|
|
214
214
|
relation = relation.send(column[:sorting_scope].to_sym, dir.to_sym)
|
215
215
|
else
|
216
216
|
relation = if method.nil?
|
217
|
-
relation.order(assoc
|
217
|
+
relation.order("#{assoc} #{dir}")
|
218
218
|
else
|
219
219
|
assoc = data_class.reflect_on_association(assoc.to_sym)
|
220
|
-
relation.order(assoc.klass.table_name
|
220
|
+
relation.joins(assoc.name).order("#{assoc.klass.table_name}.#{method} #{dir}")
|
221
221
|
end
|
222
222
|
end
|
223
223
|
end
|
@@ -298,53 +298,6 @@ module Netzke
|
|
298
298
|
mod_records
|
299
299
|
end
|
300
300
|
|
301
|
-
# Converts Ext.ux.grid.GridFilters filters to searchlogic conditions, e.g.
|
302
|
-
# {"0" => {
|
303
|
-
# "data" => {
|
304
|
-
# "type" => "numeric",
|
305
|
-
# "comparison" => "gt",
|
306
|
-
# "value" => 10 },
|
307
|
-
# "field" => "id"
|
308
|
-
# },
|
309
|
-
# "1" => {
|
310
|
-
# "data" => {
|
311
|
-
# "type" => "string",
|
312
|
-
# "value" => "pizza"
|
313
|
-
# },
|
314
|
-
# "field" => "food_name"
|
315
|
-
# }}
|
316
|
-
#
|
317
|
-
# =>
|
318
|
-
#
|
319
|
-
# metawhere: :id.gt => 100, :food_name.matches => '%pizza%'
|
320
|
-
def convert_filters(column_filter)
|
321
|
-
# these are still JSON-encoded due to the migration to Ext.direct
|
322
|
-
column_filter=JSON.parse(column_filter)
|
323
|
-
res = {}
|
324
|
-
column_filter.each do |v|
|
325
|
-
assoc, method = v["field"].split('__')
|
326
|
-
if method
|
327
|
-
assoc = data_class.reflect_on_association(assoc.to_sym)
|
328
|
-
field = [assoc.klass.table_name, method].join('.').to_sym
|
329
|
-
else
|
330
|
-
field = assoc.to_sym
|
331
|
-
end
|
332
|
-
|
333
|
-
value = v["value"]
|
334
|
-
|
335
|
-
case v["type"]
|
336
|
-
when "string"
|
337
|
-
op = v['comparison'] && (v['comparison'] == 'like' ? :matches : :does_not_match) || :matches
|
338
|
-
field = field.send(op)
|
339
|
-
value = "%#{value}%"
|
340
|
-
when "numeric", "date"
|
341
|
-
field = field.send :"#{v['comparison']}"
|
342
|
-
end
|
343
|
-
res.merge!({field => value})
|
344
|
-
end
|
345
|
-
res
|
346
|
-
end
|
347
|
-
|
348
301
|
def normalize_extra_conditions(conditions)
|
349
302
|
conditions.each_pair do |k,v|
|
350
303
|
conditions[k] = "%#{v}%" if ["like", "matches"].include?(k.to_s.split("__").last)
|