netzke-basepack-zh 0.7.6
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/.autotest +1 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.rdoc +445 -0
- data/LICENSE +1 -0
- data/README.md +94 -0
- data/Rakefile +44 -0
- data/TODO.rdoc +8 -0
- data/config/ci/before-travis.sh +28 -0
- data/init.rb +1 -0
- data/install.rb +1 -0
- data/javascripts/basepack.js +139 -0
- data/javascripts/xdatetime.js +196 -0
- data/lib/generators/netzke/basepack_generator.rb +10 -0
- data/lib/generators/netzke/templates/assets/ts-checkbox.gif +0 -0
- data/lib/generators/netzke/templates/create_netzke_field_lists.rb +18 -0
- data/lib/netzke-basepack.rb +26 -0
- data/lib/netzke/active_record.rb +20 -0
- data/lib/netzke/active_record/attributes.rb +256 -0
- data/lib/netzke/active_record/combobox_options.rb +16 -0
- data/lib/netzke/active_record/relation_extensions.rb +37 -0
- data/lib/netzke/basepack.rb +45 -0
- data/lib/netzke/basepack/accordion_panel.rb +39 -0
- data/lib/netzke/basepack/action_column.rb +68 -0
- data/lib/netzke/basepack/action_column/javascripts/action_column.js +61 -0
- data/lib/netzke/basepack/auth_app.rb +159 -0
- data/lib/netzke/basepack/basic_app.rb +7 -0
- data/lib/netzke/basepack/border_layout_panel.rb +53 -0
- data/lib/netzke/basepack/border_layout_panel/javascripts/border_layout_panel.js +40 -0
- data/lib/netzke/basepack/data_accessor.rb +53 -0
- data/lib/netzke/basepack/data_adapters/abstract_adapter.rb +164 -0
- data/lib/netzke/basepack/data_adapters/active_record_adapter.rb +279 -0
- data/lib/netzke/basepack/data_adapters/data_mapper_adapter.rb +264 -0
- data/lib/netzke/basepack/data_adapters/sequel_adapter.rb +260 -0
- data/lib/netzke/basepack/form_panel.rb +144 -0
- data/lib/netzke/basepack/form_panel/fields.rb +208 -0
- data/lib/netzke/basepack/form_panel/javascripts/comma_list_cbg.js +51 -0
- data/lib/netzke/basepack/form_panel/javascripts/form_panel.js +225 -0
- data/lib/netzke/basepack/form_panel/javascripts/misc.js +4 -0
- data/lib/netzke/basepack/form_panel/javascripts/n_radio_group.js +43 -0
- data/lib/netzke/basepack/form_panel/javascripts/readonly_mode.js +35 -0
- data/lib/netzke/basepack/form_panel/services.rb +142 -0
- data/lib/netzke/basepack/form_panel/stylesheets/readonly_mode.css +14 -0
- data/lib/netzke/basepack/grid_panel.rb +440 -0
- data/lib/netzke/basepack/grid_panel/columns.rb +394 -0
- data/lib/netzke/basepack/grid_panel/javascripts/advanced_search.js +27 -0
- data/lib/netzke/basepack/grid_panel/javascripts/check_column_fix.js +6 -0
- data/lib/netzke/basepack/grid_panel/javascripts/edit_in_form.js +51 -0
- data/lib/netzke/basepack/grid_panel/javascripts/event_handling.js +179 -0
- data/lib/netzke/basepack/grid_panel/javascripts/grid_panel.js +438 -0
- data/lib/netzke/basepack/grid_panel/javascripts/misc.js +4 -0
- data/lib/netzke/basepack/grid_panel/javascripts/rows-dd.js +281 -0
- data/lib/netzke/basepack/grid_panel/record_form_window.rb +41 -0
- data/lib/netzke/basepack/grid_panel/services.rb +235 -0
- data/lib/netzke/basepack/paging_form_panel.rb +72 -0
- data/lib/netzke/basepack/paging_form_panel/javascripts/paging_form_panel.js +76 -0
- data/lib/netzke/basepack/panel.rb +11 -0
- data/lib/netzke/basepack/query_builder.rb +107 -0
- data/lib/netzke/basepack/query_builder/javascripts/query_builder.js +153 -0
- data/lib/netzke/basepack/search_panel.rb +79 -0
- data/lib/netzke/basepack/search_panel/javascripts/condition_field.js +160 -0
- data/lib/netzke/basepack/search_panel/javascripts/search_panel.js +65 -0
- data/lib/netzke/basepack/search_window.rb +66 -0
- data/lib/netzke/basepack/simple_app.rb +104 -0
- data/lib/netzke/basepack/simple_app/javascripts/simple_app.js +64 -0
- data/lib/netzke/basepack/simple_app/javascripts/statusbar_ext.js +8 -0
- data/lib/netzke/basepack/tab_panel.rb +21 -0
- data/lib/netzke/basepack/tab_panel/javascripts/tab_panel.js +11 -0
- data/lib/netzke/basepack/version.rb +11 -0
- data/lib/netzke/basepack/window.rb +29 -0
- data/lib/netzke/basepack/window/javascripts/window.js +20 -0
- data/lib/netzke/basepack/wrap_lazy_loaded.rb +28 -0
- data/lib/netzke/basepack/wrapper.rb +28 -0
- data/lib/netzke/data_mapper.rb +18 -0
- data/lib/netzke/data_mapper/attributes.rb +273 -0
- data/lib/netzke/data_mapper/combobox_options.rb +11 -0
- data/lib/netzke/data_mapper/relation_extensions.rb +38 -0
- data/lib/netzke/sequel.rb +18 -0
- data/lib/netzke/sequel/attributes.rb +274 -0
- data/lib/netzke/sequel/combobox_options.rb +10 -0
- data/lib/netzke/sequel/relation_extensions.rb +40 -0
- data/lib/tasks/netzke_basepack_tasks.rake +4 -0
- data/locales/de.yml +79 -0
- data/locales/en.yml +79 -0
- data/netzke-basepack.gemspec +306 -0
- data/stylesheets/basepack.css +72 -0
- data/stylesheets/datetimefield.css +54 -0
- data/test/basepack_test_app/.gitignore +6 -0
- data/test/basepack_test_app/.rvmrc +1 -0
- data/test/basepack_test_app/Gemfile +59 -0
- data/test/basepack_test_app/Gemfile.lock +196 -0
- data/test/basepack_test_app/Guardfile +46 -0
- data/test/basepack_test_app/README +1 -0
- data/test/basepack_test_app/Rakefile +7 -0
- data/test/basepack_test_app/app/components/author_form.rb +32 -0
- data/test/basepack_test_app/app/components/author_grid.rb +3 -0
- data/test/basepack_test_app/app/components/book_form.rb +38 -0
- data/test/basepack_test_app/app/components/book_form_with_custom_fields.rb +21 -0
- data/test/basepack_test_app/app/components/book_form_with_defaults.rb +8 -0
- data/test/basepack_test_app/app/components/book_form_with_nested_attributes.rb +18 -0
- data/test/basepack_test_app/app/components/book_grid.rb +12 -0
- data/test/basepack_test_app/app/components/book_grid_filtering.rb +10 -0
- data/test/basepack_test_app/app/components/book_grid_loader.rb +24 -0
- data/test/basepack_test_app/app/components/book_grid_with_column_actions.rb +15 -0
- data/test/basepack_test_app/app/components/book_grid_with_custom_columns.rb +27 -0
- data/test/basepack_test_app/app/components/book_grid_with_default_values.rb +9 -0
- data/test/basepack_test_app/app/components/book_grid_with_extra_feedback.rb +8 -0
- data/test/basepack_test_app/app/components/book_grid_with_extra_filters.rb +14 -0
- data/test/basepack_test_app/app/components/book_grid_with_nested_attributes.rb +13 -0
- data/test/basepack_test_app/app/components/book_grid_with_overridden_columns.rb +15 -0
- data/test/basepack_test_app/app/components/book_grid_with_paging.rb +10 -0
- data/test/basepack_test_app/app/components/book_grid_with_persistence.rb +8 -0
- data/test/basepack_test_app/app/components/book_grid_with_scoped_authors.rb +8 -0
- data/test/basepack_test_app/app/components/book_grid_with_virtual_attributes.rb +21 -0
- data/test/basepack_test_app/app/components/book_paging_form_panel.rb +22 -0
- data/test/basepack_test_app/app/components/book_query_builder.rb +8 -0
- data/test/basepack_test_app/app/components/book_search_panel.rb +5 -0
- data/test/basepack_test_app/app/components/book_search_panel/javascripts/i18n_de.js +6 -0
- data/test/basepack_test_app/app/components/book_with_custom_primary_key_grid.rb +10 -0
- data/test/basepack_test_app/app/components/books_bound_to_author.rb +10 -0
- data/test/basepack_test_app/app/components/double_book_grid.rb +18 -0
- data/test/basepack_test_app/app/components/extras/book_presentation.rb +27 -0
- data/test/basepack_test_app/app/components/form_without_model.rb +21 -0
- data/test/basepack_test_app/app/components/generic_user_form.rb +12 -0
- data/test/basepack_test_app/app/components/lockable_book_form.rb +17 -0
- data/test/basepack_test_app/app/components/lockable_user_form.rb +7 -0
- data/test/basepack_test_app/app/components/paging_form_with_search.rb +40 -0
- data/test/basepack_test_app/app/components/simple_accordion.rb +11 -0
- data/test/basepack_test_app/app/components/simple_panel.rb +17 -0
- data/test/basepack_test_app/app/components/simple_tab_panel.rb +11 -0
- data/test/basepack_test_app/app/components/simple_window.rb +10 -0
- data/test/basepack_test_app/app/components/simple_wrapper.rb +7 -0
- data/test/basepack_test_app/app/components/some_accordion_panel.rb +22 -0
- data/test/basepack_test_app/app/components/some_auth_app.rb +32 -0
- data/test/basepack_test_app/app/components/some_border_layout.rb +28 -0
- data/test/basepack_test_app/app/components/some_simple_app.rb +35 -0
- data/test/basepack_test_app/app/components/some_tab_panel.rb +20 -0
- data/test/basepack_test_app/app/components/user_form.rb +25 -0
- data/test/basepack_test_app/app/components/user_form_with_default_fields.rb +8 -0
- data/test/basepack_test_app/app/components/user_grid.rb +8 -0
- data/test/basepack_test_app/app/components/user_grid_with_customized_form_fields.rb +18 -0
- data/test/basepack_test_app/app/components/window_component_loader.rb +27 -0
- data/test/basepack_test_app/app/controllers/application_controller.rb +9 -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/basepack_test_app/app/helpers/embedded_components_helper.rb +2 -0
- data/test/basepack_test_app/app/models/address.rb +29 -0
- data/test/basepack_test_app/app/models/author.rb +38 -0
- data/test/basepack_test_app/app/models/book.rb +49 -0
- data/test/basepack_test_app/app/models/book_with_custom_primary_key.rb +26 -0
- data/test/basepack_test_app/app/models/role.rb +24 -0
- data/test/basepack_test_app/app/models/user.rb +29 -0
- data/test/basepack_test_app/app/presenters/forms/generic_user.rb +6 -0
- data/test/basepack_test_app/app/views/components/loadable_window.html.erb +9 -0
- data/test/basepack_test_app/app/views/components/simple_panel.html.erb +1 -0
- data/test/basepack_test_app/app/views/layouts/application.html.erb +12 -0
- data/test/basepack_test_app/app/views/layouts/components.html.erb +13 -0
- data/test/basepack_test_app/app/views/layouts/nested.html.erb +5 -0
- data/test/basepack_test_app/app/views/welcome/index.html.erb +10 -0
- data/test/basepack_test_app/config.ru +4 -0
- data/test/basepack_test_app/config/application.rb +57 -0
- data/test/basepack_test_app/config/boot.rb +13 -0
- data/test/basepack_test_app/config/cucumber.yml +8 -0
- data/test/basepack_test_app/config/database.yml.sample +41 -0
- data/test/basepack_test_app/config/database.yml.travis +15 -0
- data/test/basepack_test_app/config/environment.rb +6 -0
- data/test/basepack_test_app/config/environments/development.rb +22 -0
- data/test/basepack_test_app/config/environments/production.rb +49 -0
- data/test/basepack_test_app/config/environments/test.rb +35 -0
- data/test/basepack_test_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/basepack_test_app/config/initializers/data_mapper_logging.rb +3 -0
- data/test/basepack_test_app/config/initializers/inflections.rb +10 -0
- data/test/basepack_test_app/config/initializers/mime_types.rb +5 -0
- data/test/basepack_test_app/config/initializers/netzke.rb +9 -0
- data/test/basepack_test_app/config/initializers/secret_token.rb +7 -0
- data/test/basepack_test_app/config/initializers/sequel.rb +26 -0
- data/test/basepack_test_app/config/initializers/session_store.rb +8 -0
- data/test/basepack_test_app/config/locales/de.yml +35 -0
- data/test/basepack_test_app/config/locales/es.yml +96 -0
- data/test/basepack_test_app/config/routes.rb +68 -0
- data/test/basepack_test_app/db/development_structure.sql +88 -0
- data/test/basepack_test_app/db/migrate/20100914104207_create_users.rb +15 -0
- data/test/basepack_test_app/db/migrate/20100914104236_create_roles.rb +13 -0
- data/test/basepack_test_app/db/migrate/20101026185816_create_authors.rb +14 -0
- data/test/basepack_test_app/db/migrate/20101026190021_create_books.rb +19 -0
- data/test/basepack_test_app/db/migrate/20110101143818_create_addresses.rb +17 -0
- data/test/basepack_test_app/db/migrate/20110213213050_create_netzke_component_states.rb +20 -0
- data/test/basepack_test_app/db/migrate/20110701070052_create_book_with_custom_primary_keys.rb +15 -0
- data/test/basepack_test_app/db/migrate/20110901114016_add_last_read_at_to_books.rb +9 -0
- data/test/basepack_test_app/db/migrate/20110909071740_add_published_on_to_books.rb +5 -0
- data/test/basepack_test_app/db/schema.rb +81 -0
- data/test/basepack_test_app/db/seeds.rb +44 -0
- data/test/basepack_test_app/features/accordion_panel.feature +12 -0
- data/test/basepack_test_app/features/components_in_view.feature +11 -0
- data/test/basepack_test_app/features/form_panel.feature +142 -0
- data/test/basepack_test_app/features/grid_panel.feature +277 -0
- data/test/basepack_test_app/features/grid_panel_filters.feature +73 -0
- data/test/basepack_test_app/features/grid_panel_with_custom_primary_key.feature +15 -0
- data/test/basepack_test_app/features/grid_sorting.feature +47 -0
- data/test/basepack_test_app/features/i18n.feature +18 -0
- data/test/basepack_test_app/features/nested_attributes.feature +26 -0
- data/test/basepack_test_app/features/paging_form_panel.feature +43 -0
- data/test/basepack_test_app/features/search_in_grid.feature +49 -0
- data/test/basepack_test_app/features/simple_app.feature +15 -0
- data/test/basepack_test_app/features/simple_panel.feature +11 -0
- data/test/basepack_test_app/features/step_definitions/accordion_steps.rb +5 -0
- data/test/basepack_test_app/features/step_definitions/ext_steps.rb +16 -0
- data/test/basepack_test_app/features/step_definitions/form_panel_steps.rb +46 -0
- data/test/basepack_test_app/features/step_definitions/generic_steps.rb +44 -0
- data/test/basepack_test_app/features/step_definitions/grid_panel_steps.rb +186 -0
- data/test/basepack_test_app/features/step_definitions/pickle_steps.rb +100 -0
- data/test/basepack_test_app/features/step_definitions/web_steps.rb +219 -0
- data/test/basepack_test_app/features/support/env.rb +81 -0
- data/test/basepack_test_app/features/support/paths.rb +65 -0
- data/test/basepack_test_app/features/support/pickle.rb +24 -0
- data/test/basepack_test_app/features/support/selectors.rb +39 -0
- data/test/basepack_test_app/features/tab_panel.feature +12 -0
- data/test/basepack_test_app/features/validations_in_grid.feature +13 -0
- data/test/basepack_test_app/features/virtual_attributes.feature +16 -0
- data/test/basepack_test_app/features/window.feature +11 -0
- data/test/basepack_test_app/lib/tasks/.gitkeep +0 -0
- data/test/basepack_test_app/lib/tasks/cucumber.rake +71 -0
- data/test/basepack_test_app/lib/tasks/travis.rake +7 -0
- data/test/basepack_test_app/public/404.html +26 -0
- data/test/basepack_test_app/public/422.html +26 -0
- data/test/basepack_test_app/public/500.html +26 -0
- data/test/basepack_test_app/public/favicon.ico +0 -0
- data/test/basepack_test_app/public/images/header-deco.gif +0 -0
- data/test/basepack_test_app/public/images/rails.png +0 -0
- data/test/basepack_test_app/public/javascripts/application.js +2 -0
- data/test/basepack_test_app/public/javascripts/controls.js +965 -0
- data/test/basepack_test_app/public/javascripts/dragdrop.js +974 -0
- data/test/basepack_test_app/public/javascripts/effects.js +1123 -0
- data/test/basepack_test_app/public/javascripts/prototype.js +6001 -0
- data/test/basepack_test_app/public/javascripts/rails.js +175 -0
- data/test/basepack_test_app/public/robots.txt +5 -0
- data/test/basepack_test_app/public/stylesheets/.gitkeep +0 -0
- data/test/basepack_test_app/script/cucumber +10 -0
- data/test/basepack_test_app/script/rails +6 -0
- data/test/basepack_test_app/spec/components/form_panel_spec.rb +53 -0
- data/test/basepack_test_app/spec/components/grid_panel_spec.rb +10 -0
- data/test/basepack_test_app/spec/data_adapter/adapter_spec.rb +68 -0
- data/test/basepack_test_app/spec/data_adapter/attributes_spec.rb +56 -0
- data/test/basepack_test_app/spec/data_adapter/relation_extensions_spec.rb +125 -0
- data/test/basepack_test_app/spec/factories.rb +28 -0
- data/test/basepack_test_app/spec/spec_helper.rb +39 -0
- data/test/basepack_test_app/test/performance/browsing_test.rb +9 -0
- data/test/basepack_test_app/test/test_helper.rb +13 -0
- data/test/basepack_test_app/vendor/plugins/.gitkeep +0 -0
- data/test/console_with_fixtures.rb +4 -0
- data/test/fixtures/books.yml +11 -0
- data/test/fixtures/categories.yml +7 -0
- data/test/fixtures/cities.yml +21 -0
- data/test/fixtures/continents.yml +7 -0
- data/test/fixtures/countries.yml +9 -0
- data/test/fixtures/genres.yml +9 -0
- data/test/fixtures/roles.yml +8 -0
- data/test/fixtures/users.yml +11 -0
- data/test/schema.rb +10 -0
- data/test/test_helper.rb +21 -0
- data/test/unit/accordion_panel_test.rb +20 -0
- data/test/unit/active_record_basepack_test.rb +54 -0
- data/test/unit/fields_configuration_test.rb +18 -0
- data/test/unit/grid_panel_test.rb +52 -0
- data/test/unit/netzke_basepack_test.rb +4 -0
- data/test/unit/tab_panel_test.rb +21 -0
- data/uninstall.rb +1 -0
- metadata +332 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
module Netzke
|
|
2
|
+
module Basepack
|
|
3
|
+
# A FormPanel with paging toolbar. Allows browsing and editing records one-by-one.
|
|
4
|
+
#
|
|
5
|
+
# == Configuration
|
|
6
|
+
# Besides +Netzke::Basepack::FormPanel+ config options, accepts:
|
|
7
|
+
# * +scope+ - specifies how the data should be filtered.
|
|
8
|
+
# When it's a symbol, it's used as a scope name.
|
|
9
|
+
# When it's a string, it's a SQL statement (passed directly to +ActiveRecord::Relation#where+).
|
|
10
|
+
# When it's a hash, it's a conditions hash (passed directly to +ActiveRecord::Relation#where+).
|
|
11
|
+
# When it's an array, it's expanded into an SQL statement with arguments (passed directly to +ActiveRecord::Relation#where+), e.g.:
|
|
12
|
+
#
|
|
13
|
+
# :scope => ["id > ?", 100])
|
|
14
|
+
#
|
|
15
|
+
# When it's a Proc, it's passed the model class, and is expected to return an ActiveRecord::Relation, e.g.:
|
|
16
|
+
#
|
|
17
|
+
# :scope => { |rel| rel.where(:id.gt => 100).order(:created_at) }
|
|
18
|
+
#
|
|
19
|
+
# == ToDo
|
|
20
|
+
# * Update the number of records after form submit
|
|
21
|
+
class PagingFormPanel < FormPanel
|
|
22
|
+
js_mixin :paging_form_panel
|
|
23
|
+
|
|
24
|
+
# override
|
|
25
|
+
def record
|
|
26
|
+
@record ||= data_adapter.first
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Pass total records amount and the first record to the JS constructor
|
|
30
|
+
def js_config
|
|
31
|
+
super.merge({
|
|
32
|
+
:total_records => total_records
|
|
33
|
+
})
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
endpoint :get_data do |params|
|
|
37
|
+
@record = data_adapter.get_records(params).first
|
|
38
|
+
record_hash = @record && js_record_data
|
|
39
|
+
{:records => record_hash && [record_hash] || [], :total => total_records(params)}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
action :search do
|
|
43
|
+
{
|
|
44
|
+
:text => I18n.t('netzke.basepack.paging_form_panel.actions.search'),
|
|
45
|
+
:tooltip => I18n.t('netzke.basepack.paging_form_panel.actions.search_tooltip'),
|
|
46
|
+
:icon => :find,
|
|
47
|
+
:select => true
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def configure_bbar(c)
|
|
52
|
+
super
|
|
53
|
+
c[:bbar] << :search.action
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
component :search_form do
|
|
57
|
+
{
|
|
58
|
+
:lazy_loading => true,
|
|
59
|
+
:class_name => "Netzke::Basepack::SearchWindow",
|
|
60
|
+
:model => config[:model]
|
|
61
|
+
}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
protected
|
|
65
|
+
|
|
66
|
+
def total_records(params = {})
|
|
67
|
+
@total_records ||= data_adapter.count_records(params, [])
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
onSearch: function(el) {
|
|
3
|
+
if (this.searchWindow) {
|
|
4
|
+
this.searchWindow.show();
|
|
5
|
+
} else {
|
|
6
|
+
this.loadNetzkeComponent({name: 'search_form', callback: function(win){
|
|
7
|
+
this.searchWindow = win;
|
|
8
|
+
win.show();
|
|
9
|
+
|
|
10
|
+
win.items.first().on('apply', function(){
|
|
11
|
+
win.onSearch();
|
|
12
|
+
return false; // do not propagate the 'apply' event
|
|
13
|
+
}, this);
|
|
14
|
+
|
|
15
|
+
win.on('hide', function(){
|
|
16
|
+
var query = win.getQuery();
|
|
17
|
+
if (win.closeRes == 'search'){
|
|
18
|
+
var store = this.getStore(), proxy = store.getProxy();
|
|
19
|
+
proxy.extraParams.query = Ext.encode(query);
|
|
20
|
+
store.load();
|
|
21
|
+
}
|
|
22
|
+
el.toggle(query.length > 0); // toggle based on the state
|
|
23
|
+
}, this);
|
|
24
|
+
}, scope: this});
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
getStore: function() {
|
|
29
|
+
return this.store;
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
afterRender: function() {
|
|
33
|
+
// delete this.record so our parent FormPanel doesn't have to load it - we do it ourselves
|
|
34
|
+
var record = this.record;
|
|
35
|
+
delete (this.record);
|
|
36
|
+
|
|
37
|
+
this.callParent();
|
|
38
|
+
|
|
39
|
+
if (record) this.store.loadRawData({records: [record], total: this.totalRecords});
|
|
40
|
+
|
|
41
|
+
new Ext.LoadMask(this, Ext.apply(this.applyMask, {store: this.store}));
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
initComponent: function() {
|
|
45
|
+
// Extract field names from items recursively. We have to do it before callParent(),
|
|
46
|
+
// because we need to build the store for PagingToolbar that cannot be created after superclass.initComponent
|
|
47
|
+
// Otherwise, the things would be simpler, because this.getForm().items would already have all the fields in one place for us
|
|
48
|
+
this.fieldNames = [];
|
|
49
|
+
this.extractFields(this.items);
|
|
50
|
+
|
|
51
|
+
var store = new Ext.data.DirectStore({
|
|
52
|
+
directFn: Netzke.providers[this.id].getData,
|
|
53
|
+
root: 'records',
|
|
54
|
+
fields: this.fieldNames.concat('_meta'),
|
|
55
|
+
pageSize: 1
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
store.on('load', function(st, r){
|
|
59
|
+
if (r.length == 0) {
|
|
60
|
+
this.getForm().reset();
|
|
61
|
+
} else {
|
|
62
|
+
this.setFormValues(r[0].data);
|
|
63
|
+
}
|
|
64
|
+
}, this);
|
|
65
|
+
|
|
66
|
+
this.bbar = Ext.create('Ext.toolbar.Paging', {
|
|
67
|
+
beforePageText: "Record",
|
|
68
|
+
store: store,
|
|
69
|
+
items: ["-"].concat(this.bbar || [])
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
this.store = store;
|
|
73
|
+
|
|
74
|
+
this.callParent();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
module Netzke
|
|
2
|
+
module Basepack
|
|
3
|
+
class QueryBuilder < Netzke::Base
|
|
4
|
+
js_base_class "Ext.tab.Panel"
|
|
5
|
+
|
|
6
|
+
js_property :active_tab, 0
|
|
7
|
+
|
|
8
|
+
js_translate :overwrite_confirm, :overwrite_confirm_title, :delete_confirm, :delete_confirm_title
|
|
9
|
+
|
|
10
|
+
js_mixin :query_builder
|
|
11
|
+
|
|
12
|
+
component :search_panel do
|
|
13
|
+
{
|
|
14
|
+
:class_name => "Netzke::Basepack::SearchPanel",
|
|
15
|
+
:model => config[:model],
|
|
16
|
+
:fields => config[:fields],
|
|
17
|
+
:preset_query => config[:query],
|
|
18
|
+
:auto_scroll => config[:auto_scroll]
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
action :clear_all do
|
|
23
|
+
{
|
|
24
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.clear_all'),
|
|
25
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.clear_all_tooltip'),
|
|
26
|
+
:icon => :cross
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
action :reset do
|
|
31
|
+
{
|
|
32
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.reset'),
|
|
33
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.reset_tooltip'),
|
|
34
|
+
:icon => :application_form
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
action :save_preset do
|
|
39
|
+
{
|
|
40
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.save_preset'),
|
|
41
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.save_preset_tooltip'),
|
|
42
|
+
:icon => :disk
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
action :delete_preset do
|
|
47
|
+
{
|
|
48
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.delete_preset'),
|
|
49
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.delete_preset_tooltip'),
|
|
50
|
+
:icon => :cross
|
|
51
|
+
}
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
action :apply do
|
|
55
|
+
{
|
|
56
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.apply'),
|
|
57
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.apply_tooltip'),
|
|
58
|
+
:icon => :accept
|
|
59
|
+
}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def js_config
|
|
63
|
+
super.tap do |s|
|
|
64
|
+
s[:bbar] = (config[:bbar] || []) + [:clear_all.action, :reset.action, "->",
|
|
65
|
+
I18n.t('netzke.basepack.query_builder.presets'),
|
|
66
|
+
{
|
|
67
|
+
:itemId => "presetsCombo",
|
|
68
|
+
:xtype => "combo",
|
|
69
|
+
:triggerAction => "all",
|
|
70
|
+
:value => super[:load_last_preset] && last_preset.try(:fetch, "name"),
|
|
71
|
+
:store => state[:presets].blank? ? [[[], ""]] : state[:presets].map{ |s| [s["query"], s["name"]] },
|
|
72
|
+
:ref => "../presetsCombo",
|
|
73
|
+
:listeners => {:before_select => {
|
|
74
|
+
:fn => "function(combo, record){
|
|
75
|
+
var form = Ext.getCmp('#{global_id}');
|
|
76
|
+
form.buildFormFromQuery(record.data.field1);
|
|
77
|
+
}".l
|
|
78
|
+
}}
|
|
79
|
+
}, :save_preset.action, :delete_preset.action
|
|
80
|
+
]
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
endpoint :save_preset do |params|
|
|
85
|
+
saved_searches = state[:presets] || []
|
|
86
|
+
existing = saved_searches.detect{ |s| s["name"] == params[:name] }
|
|
87
|
+
query = ActiveSupport::JSON.decode(params[:query])
|
|
88
|
+
if existing
|
|
89
|
+
existing["query"].replace(query)
|
|
90
|
+
else
|
|
91
|
+
saved_searches << {"name" => params[:name], "query" => query}
|
|
92
|
+
end
|
|
93
|
+
update_state(:presets, saved_searches)
|
|
94
|
+
{:netzke_feedback => I18n.t('netzke.basepack.query_builder.preset_saved')}
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
endpoint :delete_preset do |params|
|
|
98
|
+
saved_searches = state[:presets]
|
|
99
|
+
saved_searches.delete_if{ |s| s["name"] == params[:name] }
|
|
100
|
+
update_state(:presets, saved_searches)
|
|
101
|
+
{:netzke_feedback => I18n.t('netzke.basepack.query_builder.preset_deleted')}
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
{
|
|
2
|
+
initComponent: function() {
|
|
3
|
+
this.callParent();
|
|
4
|
+
|
|
5
|
+
this.presetsCombo = this.getDockedItems()[1].getComponent('presetsCombo');
|
|
6
|
+
|
|
7
|
+
this.add({title: "+"});
|
|
8
|
+
|
|
9
|
+
this.on('beforetabchange', function(c, newTab, curentTab){
|
|
10
|
+
if (newTab.title === '+') {
|
|
11
|
+
this.addTab(true, true);
|
|
12
|
+
return false;
|
|
13
|
+
} else {
|
|
14
|
+
if (this.maxTabHeight) newTab.setHeight(this.maxTabHeight);
|
|
15
|
+
}
|
|
16
|
+
}, this);
|
|
17
|
+
|
|
18
|
+
this.addTab(true, false);
|
|
19
|
+
|
|
20
|
+
this.addEvents('conditionsupdate');
|
|
21
|
+
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
buildFormFromQuery: function(query) {
|
|
25
|
+
this.onClearAll();
|
|
26
|
+
|
|
27
|
+
if (query.length !== 0) {
|
|
28
|
+
Ext.each(query, function(f, i){
|
|
29
|
+
var closable = i === 0 ? false : true;
|
|
30
|
+
if (this.items.getCount() < i + 2) { this.addTab(false, closable); }
|
|
31
|
+
this.items.get(i).items.first().buildFormFromQuery(query[i]);
|
|
32
|
+
}, this);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
this.doLayout();
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
addTab: function(activate, closable){
|
|
39
|
+
var newTabConfig = Ext.apply({}, this.netzkeComponents.searchPanel);
|
|
40
|
+
newTabConfig.id = Ext.id(); // We need a unique ID every time
|
|
41
|
+
newTabConfig.preventHeader = true;
|
|
42
|
+
newTabConfig.border = false;
|
|
43
|
+
|
|
44
|
+
var newTab = this.insert(
|
|
45
|
+
this.items.getCount() - 1,
|
|
46
|
+
{
|
|
47
|
+
title: "OR",
|
|
48
|
+
closable: closable,
|
|
49
|
+
items: [
|
|
50
|
+
Ext.createByAlias(newTabConfig.alias, newTabConfig)
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
if (activate) {
|
|
56
|
+
this.suspendEvents();
|
|
57
|
+
this.setActiveTab(newTab);
|
|
58
|
+
this.resumeEvents();
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
getQuery: function(all) {
|
|
63
|
+
var query = [];
|
|
64
|
+
this.eachTab(function(i) {
|
|
65
|
+
var q = i.items.first().getQuery();
|
|
66
|
+
if (q.length > 0) query.push(i.items.first().getQuery(all));
|
|
67
|
+
});
|
|
68
|
+
return query;
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
getTabs: function() {
|
|
72
|
+
var res = [];
|
|
73
|
+
this.items.each(function(i) {
|
|
74
|
+
if (i.title !== "+") { res.push(i); }
|
|
75
|
+
});
|
|
76
|
+
return res;
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
eachTab: function(fn, scope) {
|
|
80
|
+
this.items.each(function(f) {
|
|
81
|
+
if (f.title !== "+") {
|
|
82
|
+
fn.call(scope || f, f);
|
|
83
|
+
}
|
|
84
|
+
}, this);
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
onClearAll: function() {
|
|
88
|
+
this.removeAllTabs(true);
|
|
89
|
+
this.getActiveTab().items.first().onClearAll();
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
onReset: function() {
|
|
93
|
+
this.eachTab(function(t) { t.onReset(); });
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
removeAllTabs: function(exceptLast) {
|
|
97
|
+
this.eachTab(function(t) { if (this.items.getCount() > (exceptLast ? 2 : 1)) {this.remove(t);} }, this);
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
onSavePreset: function(){
|
|
101
|
+
var searchName = this.presetsCombo.getRawValue();
|
|
102
|
+
|
|
103
|
+
if (searchName !== "") {
|
|
104
|
+
var presetsComboStore = this.presetsCombo.getStore();
|
|
105
|
+
var existingPresetIndex = presetsComboStore.find('field2', searchName);
|
|
106
|
+
if (existingPresetIndex !== -1) {
|
|
107
|
+
// overwriting
|
|
108
|
+
Ext.Msg.confirm(this.i18n.overwriteConfirmTitle, this.i18n.overwriteConfirm, function(btn, text){
|
|
109
|
+
if (btn == 'yes') {
|
|
110
|
+
var r = presetsComboStore.getAt(existingPresetIndex);
|
|
111
|
+
r.set('field1', this.getQuery(true));
|
|
112
|
+
r.commit();
|
|
113
|
+
this.doSavePreset(searchName);
|
|
114
|
+
}
|
|
115
|
+
}, this);
|
|
116
|
+
} else {
|
|
117
|
+
this.doSavePreset(searchName);
|
|
118
|
+
presetsComboStore.add({field1: this.getQuery(true), field2: searchName});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
doSavePreset: function(name){
|
|
124
|
+
this.savePreset({
|
|
125
|
+
name: name,
|
|
126
|
+
query: Ext.encode(this.getQuery(true))
|
|
127
|
+
});
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
onDeletePreset: function(){
|
|
131
|
+
var searchName = this.presetsCombo.getRawValue();
|
|
132
|
+
if (searchName !== "") {
|
|
133
|
+
Ext.Msg.confirm(this.i18n.deleteConfirmTitle, this.i18n.overwriteConfirm, function(btn, text){
|
|
134
|
+
if (btn == 'yes') {
|
|
135
|
+
this.removePresetFromList(searchName);
|
|
136
|
+
this.deletePreset({
|
|
137
|
+
name: searchName
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}, this);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
onApply: function() {
|
|
145
|
+
this.fireEvent('conditionsupdate', this.getQuery());
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
removePresetFromList: function(name){
|
|
149
|
+
var presetsComboStore = this.presetsCombo.getStore();
|
|
150
|
+
presetsComboStore.removeAt(presetsComboStore.find('field2', name));
|
|
151
|
+
this.presetsCombo.reset();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Netzke
|
|
2
|
+
module Basepack
|
|
3
|
+
# == Configuration
|
|
4
|
+
# +load_last_preset+ - on load, tries to load the latest saved preset
|
|
5
|
+
class SearchPanel < Base
|
|
6
|
+
|
|
7
|
+
include Netzke::Basepack::DataAccessor
|
|
8
|
+
|
|
9
|
+
js_base_class "Ext.form.FormPanel"
|
|
10
|
+
|
|
11
|
+
js_properties(
|
|
12
|
+
:padding => 5,
|
|
13
|
+
:auto_scroll => true
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
js_include :condition_field
|
|
17
|
+
|
|
18
|
+
js_mixin :search_panel
|
|
19
|
+
|
|
20
|
+
js_property :attribute_operators_map, {
|
|
21
|
+
:integer => [
|
|
22
|
+
["eq", I18n.t('netzke.basepack.search_panel.equals')],
|
|
23
|
+
["gt", I18n.t('netzke.basepack.search_panel.greater_than')],
|
|
24
|
+
["lt", I18n.t('netzke.basepack.search_panel.less_than')]
|
|
25
|
+
],
|
|
26
|
+
:text => [
|
|
27
|
+
["contains", I18n.t('netzke.basepack.search_panel.contains')] # same as matches => %string%
|
|
28
|
+
],
|
|
29
|
+
:string => [
|
|
30
|
+
["contains", I18n.t('netzke.basepack.search_panel.contains')], # same as matches => %string%
|
|
31
|
+
["matches", I18n.t('netzke.basepack.search_panel.matches')]
|
|
32
|
+
],
|
|
33
|
+
:boolean => [
|
|
34
|
+
["is_any", I18n.t('netzke.basepack.search_panel.is_true')],
|
|
35
|
+
["is_true", I18n.t('netzke.basepack.search_panel.is_true')],
|
|
36
|
+
["is_false", I18n.t('netzke.basepack.search_panel.is_false')]
|
|
37
|
+
],
|
|
38
|
+
:datetime => [
|
|
39
|
+
["eq", I18n.t('netzke.basepack.search_panel.date_equals')],
|
|
40
|
+
["gt", I18n.t('netzke.basepack.search_panel.after')],
|
|
41
|
+
["lt", I18n.t('netzke.basepack.search_panel.before')]
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# Builds default query search panel, where each field is presented
|
|
46
|
+
def default_query
|
|
47
|
+
data_class.column_names.map do |c|
|
|
48
|
+
column_type = data_class.columns_hash[c].type
|
|
49
|
+
operator = (self.class.js_property(:attribute_operators_map)[column_type] || []).first.try(:fetch, 0) || "matches"
|
|
50
|
+
{:attr => c, :attr_type => column_type, :operator => operator}
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def data_class
|
|
55
|
+
@data_class ||= config[:model].constantize
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def js_config
|
|
59
|
+
super.merge(
|
|
60
|
+
:attrs => attributes,
|
|
61
|
+
:attrs_hash => data_class.column_names.inject({}){ |hsh,c|
|
|
62
|
+
hsh.merge(c => data_adapter.get_property_type(data_class.columns_hash[c])) },
|
|
63
|
+
:preset_query => (config[:load_last_preset] ? last_preset.try(:fetch, "query") : config[:query]) || []
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def attributes
|
|
68
|
+
config[:fields].map do |field|
|
|
69
|
+
[field[:name], field[:field_label]]
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def last_preset
|
|
74
|
+
(state[:presets] || []).last
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|