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,51 @@
|
|
|
1
|
+
Ext.ns("Ext.netzke.form");
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
A very simple CheckboxGroup extension, which serializes its checkboxes' "boxLabel" attributes into a string.
|
|
5
|
+
Config options:
|
|
6
|
+
* separator - separator of values in the string (defaults to ",")
|
|
7
|
+
* options - all checkboxes, by boxLabel, e.g.: ["Cool", "To read", "Important"]
|
|
8
|
+
*/
|
|
9
|
+
Ext.define('Ext.netzke.form.CommaListCbg', {
|
|
10
|
+
extend: 'Ext.form.CheckboxGroup',
|
|
11
|
+
alias: 'widget.commalistcbg',
|
|
12
|
+
separator: ",",
|
|
13
|
+
|
|
14
|
+
initComponent: function(){
|
|
15
|
+
this.items = [];
|
|
16
|
+
Ext.each(this.options, function(o){
|
|
17
|
+
this.items.push({ boxLabel: o, displayOnly:true });
|
|
18
|
+
}, this);
|
|
19
|
+
|
|
20
|
+
this.callParent();
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
getSubmitData: function(){
|
|
24
|
+
var res = [];
|
|
25
|
+
Ext.each(this.getChecked(), function( item ){ res.push( item.boxLabel ) });
|
|
26
|
+
res = res.join(this.separator);
|
|
27
|
+
var o = {};
|
|
28
|
+
o[this.name]=res;
|
|
29
|
+
return o;
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
setValue: function(v){
|
|
33
|
+
if (Ext.isString(v)) {
|
|
34
|
+
var passedValues = v.split(this.separator);
|
|
35
|
+
this.items.each(function(i){
|
|
36
|
+
i.setValue( passedValues.indexOf(i.boxLabel) >= 0 );
|
|
37
|
+
});
|
|
38
|
+
// we can alse set values the Ext way
|
|
39
|
+
} else {
|
|
40
|
+
this.callParent(arguments);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
setReadonlyMode: function(onOff) {
|
|
45
|
+
this.items.each(function(i){
|
|
46
|
+
i.setReadonlyMode(onOff);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
});
|
|
51
|
+
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
{
|
|
2
|
+
bodyStyle : 'padding:5px 5px 0',
|
|
3
|
+
autoScroll : true,
|
|
4
|
+
fieldDefaults : { labelWidth : 150 },
|
|
5
|
+
applyMask : { msg: "Updating..." },
|
|
6
|
+
|
|
7
|
+
defaults : {
|
|
8
|
+
anchor : '-20', // to leave some space for the scrollbar
|
|
9
|
+
listeners : {
|
|
10
|
+
// On "return" key, submit the form
|
|
11
|
+
specialkey : {
|
|
12
|
+
fn : function(field, event){
|
|
13
|
+
if (event.getKey() == 13) this.ownerCt.onApply();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
initComponent: function(){
|
|
20
|
+
// passing config options to BasicForm is possible via initialConfig only
|
|
21
|
+
// see Ext.form.Panel documentation
|
|
22
|
+
this.initialConfig = {
|
|
23
|
+
// form tracks it's default field values so they can be reset()
|
|
24
|
+
trackResetOnLoad: true,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!this.bbar && !this.readOnly) this.bbar = {xtype: 'toolbar'}; // an empty bbar by default, so that we can dynamically add buttons
|
|
28
|
+
|
|
29
|
+
// Custom error reader. We don't use it to process form values, but rather to normalize the response from the server in case of "real" (iframe) form submit.
|
|
30
|
+
ErrorReader = function(){};
|
|
31
|
+
|
|
32
|
+
ErrorReader.prototype.read = function(xhr) {
|
|
33
|
+
var unescapeHTML = function(str) {
|
|
34
|
+
return str.replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');
|
|
35
|
+
}
|
|
36
|
+
xhr.responseText = unescapeHTML(xhr.responseText.replace(/<pre.*?>/, "").replace("</pre>", ""));
|
|
37
|
+
return {records: [], success: true};
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
this.initialConfig.errorReader = new ErrorReader();
|
|
41
|
+
|
|
42
|
+
// Now let Ext.form.FormPanel do the rest
|
|
43
|
+
this.callParent(arguments);
|
|
44
|
+
|
|
45
|
+
// To inform the parent about the apply event
|
|
46
|
+
this.addEvents('apply', 'cancel');
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
afterRender: function(){
|
|
50
|
+
this.callParent();
|
|
51
|
+
|
|
52
|
+
// have a record to be displayed?
|
|
53
|
+
if (this.record) { this.setFormValues(this.record); }
|
|
54
|
+
|
|
55
|
+
// render in display mode?
|
|
56
|
+
if (this.locked || this.readOnly) this.setReadonlyMode(true);
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
onEdit: function(){
|
|
60
|
+
this.setReadonlyMode(false);
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
onCancel: function(){
|
|
64
|
+
this.getForm().reset();
|
|
65
|
+
this.setReadonlyMode(true, true);
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
updateToolbar: function(){
|
|
69
|
+
var tbar = this.child('toolbar');
|
|
70
|
+
|
|
71
|
+
if ( this.inReadonlyMode ) {
|
|
72
|
+
// if the form in readonly mode, remove "Apply" and "Cancel"
|
|
73
|
+
// buttons from toolbar and add "Edit" button
|
|
74
|
+
var buttonToRemove = tbar.child("button[name='apply']");
|
|
75
|
+
if ( buttonToRemove ) {
|
|
76
|
+
tbar.remove( buttonToRemove );
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
var buttonToRemove = tbar.child("button[name='cancel']");
|
|
80
|
+
if ( buttonToRemove ) {
|
|
81
|
+
tbar.remove( buttonToRemove );
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
tbar.add( this.actions.edit );
|
|
85
|
+
|
|
86
|
+
} else {
|
|
87
|
+
// if the form editable, remove "edit" button and
|
|
88
|
+
// insert "apply" and "cancel" instead
|
|
89
|
+
|
|
90
|
+
var buttonIndex = tbar.items.findIndex("name", "edit");
|
|
91
|
+
var buttonToRemove = tbar.items.getAt(buttonIndex);
|
|
92
|
+
if (buttonToRemove) {
|
|
93
|
+
tbar.remove(buttonToRemove);
|
|
94
|
+
}
|
|
95
|
+
tbar.insert( buttonIndex, this.actions.cancel );
|
|
96
|
+
tbar.insert( buttonIndex, this.actions.apply );
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
tbar.doLayout();
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
onApply: function() {
|
|
103
|
+
if (this.fireEvent('apply', this)) {
|
|
104
|
+
var values = this.getForm().getValues();
|
|
105
|
+
for (var fieldName in values) {
|
|
106
|
+
var field = this.getForm().findField(fieldName);
|
|
107
|
+
|
|
108
|
+
// TODO: move the following checks to the server side (through the :display_only option)
|
|
109
|
+
|
|
110
|
+
// do not submit values from disabled fields
|
|
111
|
+
if (!field || field.disabled) {
|
|
112
|
+
delete values[fieldName];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// do not submit values from read-only association fields
|
|
116
|
+
if (field
|
|
117
|
+
&& field.name.indexOf("__") !== -1
|
|
118
|
+
&& (field.readOnly || !field.isXType('combobox'))
|
|
119
|
+
&& (!field.nestedAttribute) // except for "nested attributes"
|
|
120
|
+
) {
|
|
121
|
+
delete values[fieldName];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// do not submit values from displayfields
|
|
125
|
+
if (field.isXType('displayfield')) {
|
|
126
|
+
delete values[fieldName];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// do not submit displayOnly fields
|
|
130
|
+
if (field.displayOnly) {
|
|
131
|
+
delete values[fieldName];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// WIP: commented out on 2011-05-11 because of fatal errors
|
|
135
|
+
// apply mask
|
|
136
|
+
// if (!this.applyMaskCmp) this.applyMaskCmp = new Ext.LoadMask(this.bwrap, this.applyMask);
|
|
137
|
+
// this.applyMaskCmp.show();
|
|
138
|
+
|
|
139
|
+
// We must use a different approach when the form is multipart, as we can't use the endpoint
|
|
140
|
+
if (this.fileUpload) {
|
|
141
|
+
this.getForm().submit({ // normal submit
|
|
142
|
+
url: this.endpointUrl("netzke_submit"),
|
|
143
|
+
params: {
|
|
144
|
+
data: Ext.encode(values) // here are the correct values that may be different from display values
|
|
145
|
+
},
|
|
146
|
+
failure: function(form, action){
|
|
147
|
+
if (this.applyMaskCmp) this.applyMaskCmp.hide();
|
|
148
|
+
},
|
|
149
|
+
success: function(form, action) {
|
|
150
|
+
try {
|
|
151
|
+
var respObj = Ext.decode(action.response.responseText);
|
|
152
|
+
delete respObj.success;
|
|
153
|
+
this.bulkExecute(respObj);
|
|
154
|
+
this.fireEvent('submitsuccess');
|
|
155
|
+
}
|
|
156
|
+
catch(e) {
|
|
157
|
+
Ext.Msg.alert('File upload error', action.response.responseText);
|
|
158
|
+
}
|
|
159
|
+
if (this.applyMaskCmp) this.applyMaskCmp.hide();
|
|
160
|
+
},
|
|
161
|
+
scope: this
|
|
162
|
+
});
|
|
163
|
+
} else {
|
|
164
|
+
this.netzkeSubmit(Ext.apply((this.baseParams || {}), {data:Ext.encode(values)}), function(success){
|
|
165
|
+
if (success) {
|
|
166
|
+
this.fireEvent("submitsuccess");
|
|
167
|
+
if (this.mode == "lockable") this.setReadonlyMode(true);
|
|
168
|
+
};
|
|
169
|
+
if (this.applyMaskCmp) this.applyMaskCmp.hide();
|
|
170
|
+
}, this);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
this.fireEvent('afterApply', this);
|
|
174
|
+
},
|
|
175
|
+
|
|
176
|
+
setFormValues: function(values){
|
|
177
|
+
var assocValues = values._meta.associationValues || {};
|
|
178
|
+
for (var assocFieldName in assocValues) {
|
|
179
|
+
|
|
180
|
+
var assocField = this.getForm().getFields().filter('name', assocFieldName).first();
|
|
181
|
+
if (assocField.isXType('combobox')) {
|
|
182
|
+
assocField.emptyText = assocField.emptyText || "---";
|
|
183
|
+
// HACK: using private property 'store' here!
|
|
184
|
+
assocField.store.loadData([[values[assocFieldName], assocValues[assocFieldName]]]);
|
|
185
|
+
delete assocField.lastQuery; // force loading the store next time user clicks the trigger
|
|
186
|
+
} else {
|
|
187
|
+
assocField.setValue(assocValues[assocFieldName]);
|
|
188
|
+
delete values[assocFieldName]; // we don't want this to be set once more below with setValues()
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
this.getForm().setValues(values);
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
setReadonlyMode: function(onOff, cancel){
|
|
196
|
+
if (this.inReadonlyMode == onOff) return;
|
|
197
|
+
this.getForm().getFields().each(function(i){
|
|
198
|
+
if (i.setReadonlyMode) i.setReadonlyMode(onOff);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// this.getForm().cleanDestroyed(); // because fields inside of composite fields are not auto-cleaned!
|
|
202
|
+
this.doLayout();
|
|
203
|
+
this.inReadonlyMode = onOff;
|
|
204
|
+
if (this.mode == "lockable") this.updateToolbar();
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
// recursively extract field names
|
|
208
|
+
extractFields: function(items){
|
|
209
|
+
Ext.each(items, function(i){
|
|
210
|
+
if (i.items) {this.extractFields(i.items);}
|
|
211
|
+
else if (i.name) {this.fieldNames.push(i.name);}
|
|
212
|
+
}, this);
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
applyFormErrors: function(errors) {
|
|
216
|
+
var field;
|
|
217
|
+
Ext.iterate(errors, function(fieldName, message){
|
|
218
|
+
fieldName = fieldName.underscore();
|
|
219
|
+
if ( field = this.getForm().findField(fieldName) || this.getForm().findField(fieldName.replace(/([a-z]+)([0-9])/g, '$1_$2'))) {
|
|
220
|
+
field.markInvalid(message.join('<br/>'));
|
|
221
|
+
}
|
|
222
|
+
}, this);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
Ext.ns("Ext.netzke.form");
|
|
2
|
+
/*
|
|
3
|
+
A very simple RadioGroup extension.
|
|
4
|
+
Config options:
|
|
5
|
+
* options:
|
|
6
|
+
1) all radio buttons, by boxLabel, e.g.: ["Cool", "To read", "Important"]
|
|
7
|
+
2) array of arrays in format [value, label], e.g.: [[1, "Good"], [2, "Average"], [3, "Poor"]]
|
|
8
|
+
*/
|
|
9
|
+
Ext.define('Ext.netzke.form.NRadioGroup', {
|
|
10
|
+
extend: 'Ext.form.RadioGroup',
|
|
11
|
+
alias: 'widget.nradiogroup',
|
|
12
|
+
initComponent: function(){
|
|
13
|
+
this.callParent();
|
|
14
|
+
|
|
15
|
+
this.items = [];
|
|
16
|
+
|
|
17
|
+
Ext.each(this.options, function(o){
|
|
18
|
+
if (Ext.isArray(o)){
|
|
19
|
+
this.items.push({boxLabel: o[1], name: this.name, inputValue: o[0]});
|
|
20
|
+
} else {
|
|
21
|
+
this.items.push({boxLabel: o, name: this.name, inputValue: o});
|
|
22
|
+
}
|
|
23
|
+
}, this);
|
|
24
|
+
|
|
25
|
+
// delete this.name;
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
getValue: function() {
|
|
29
|
+
var value;
|
|
30
|
+
this.items.each(function(i) {
|
|
31
|
+
value = i.inputValue;
|
|
32
|
+
return !i.getValue();
|
|
33
|
+
});
|
|
34
|
+
return value;
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
setReadonlyMode: function(onOff) {
|
|
38
|
+
this.items.each(function(i){
|
|
39
|
+
i.setReadonlyMode(onOff);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Overrides that implement setReadonlyMode for form fields.
|
|
2
|
+
//
|
|
3
|
+
|
|
4
|
+
Ext.form.field.Base.override({
|
|
5
|
+
setReadonlyMode: function(onOff){
|
|
6
|
+
if (this.hidden) return;
|
|
7
|
+
|
|
8
|
+
if (!this.initialConfig.readOnly) {
|
|
9
|
+
this.setReadOnly(onOff);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (onOff) {
|
|
13
|
+
this.addCls("readonly");
|
|
14
|
+
if (this.label) this.label.addCls("readonly");
|
|
15
|
+
} else {
|
|
16
|
+
this.removeCls("readonly");
|
|
17
|
+
if (this.label) this.label.removeCls("readonly");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Also the FieldContainer
|
|
23
|
+
Ext.form.FieldContainer.override({
|
|
24
|
+
setReadonlyMode: function(onOff){
|
|
25
|
+
this.items.each(function(i){
|
|
26
|
+
i.setReadonlyMode(onOff);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
Ext.form.field.Checkbox.override({
|
|
32
|
+
setReadonlyMode: function(onOff){
|
|
33
|
+
this.setDisabled(onOff);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
module Netzke
|
|
2
|
+
module Basepack
|
|
3
|
+
class FormPanel < Netzke::Base
|
|
4
|
+
module Services
|
|
5
|
+
extend ActiveSupport::Concern
|
|
6
|
+
|
|
7
|
+
included do
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Endpoints
|
|
11
|
+
|
|
12
|
+
# Called when the form gets submitted (e.g. by pressing the Apply button)
|
|
13
|
+
endpoint :netzke_submit, :pre => true do |params|
|
|
14
|
+
netzke_submit(params)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Can be called when the form needs to load a record with given ID. E.g.:
|
|
18
|
+
#
|
|
19
|
+
# someForm.netzkeLoad({id: 100});
|
|
20
|
+
endpoint :netzke_load do |params|
|
|
21
|
+
@record = data_class && data_adapter.find_record(params[:id])
|
|
22
|
+
{:set_form_values => js_record_data}
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Returns options for a combobox
|
|
26
|
+
endpoint :get_combobox_options do |params|
|
|
27
|
+
query = params[:query]
|
|
28
|
+
|
|
29
|
+
field = fields[params[:column].to_sym]
|
|
30
|
+
scope = field.to_options[:scope]
|
|
31
|
+
query = params[:query]
|
|
32
|
+
{:data => combobox_options_for_column(field, :query => query, :scope => scope, :record_id => params[:id])}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Overriding configuration_panel's get_combobox_options endpoint call
|
|
38
|
+
def configuration_panel__fields__get_combobox_options(params)
|
|
39
|
+
query = params[:query]
|
|
40
|
+
{:data => (default_columns.map{ |c| c[:name].to_s }).grep(/^#{query}/).map{ |n| [n] }}.to_nifty_json
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Returns array of form values according to the configured columns
|
|
44
|
+
# def array_of_values
|
|
45
|
+
# @record && @record.netzke_array(fields)
|
|
46
|
+
# end
|
|
47
|
+
|
|
48
|
+
def values
|
|
49
|
+
record && record.netzke_hash(fields)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Implementation for the "netzke_submit" endpoint (for backward compatibility)
|
|
53
|
+
def netzke_submit(params)
|
|
54
|
+
data = ActiveSupport::JSON.decode(params[:data])
|
|
55
|
+
data.each_pair do |k,v|
|
|
56
|
+
data[k]=nil if v.blank? || v == "null" # Ext JS returns "null" on empty date fields, or "" for not filled optional integer fields, which gives errors when passed to model (at least in DataMapper)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# File uploads are in raw params instead of "data" hash, so, mix them in into "data"
|
|
60
|
+
if config[:file_upload]
|
|
61
|
+
Netzke::Core.controller.params.each_pair do |k,v|
|
|
62
|
+
data[k] = v if v.is_a?(ActionDispatch::Http::UploadedFile)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
success = create_or_update_record(data)
|
|
67
|
+
|
|
68
|
+
if success
|
|
69
|
+
{:set_form_values => js_record_data, :set_result => true}
|
|
70
|
+
else
|
|
71
|
+
# flash eventual errors
|
|
72
|
+
data_adapter.errors_array(@record).each do |error|
|
|
73
|
+
flash :error => error
|
|
74
|
+
end
|
|
75
|
+
{:netzke_feedback => @flash, :apply_form_errors => build_form_errors(record)}
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
# Builds the form errors
|
|
82
|
+
def build_form_errors(record)
|
|
83
|
+
form_errors = {}
|
|
84
|
+
foreign_keys = data_adapter.hash_fk_model
|
|
85
|
+
record.errors.to_hash.map{|field, error|
|
|
86
|
+
# some ORM return an array for error
|
|
87
|
+
error = error.join ', ' if error.kind_of? Array
|
|
88
|
+
# Get the correct field name for the errors on foreign keys
|
|
89
|
+
if foreign_keys.has_key?(field)
|
|
90
|
+
fields.each do |k, v|
|
|
91
|
+
# Hack to stop to_nifty_json from camalizing model__field
|
|
92
|
+
field = k.to_s.gsub('__', '____') if k.to_s.split('__').first == foreign_keys[field].to_s
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
form_errors[field] ||= []
|
|
96
|
+
form_errors[field] << error
|
|
97
|
+
}
|
|
98
|
+
form_errors
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Creates/updates a record from hash
|
|
102
|
+
def create_or_update_record(hsh)
|
|
103
|
+
hsh.merge!(config[:strong_default_attrs]) if config[:strong_default_attrs]
|
|
104
|
+
@record ||= data_adapter.find_record hsh.delete(data_class.primary_key.to_s) # only pick up the record specified in the params if it was not provided in the configuration
|
|
105
|
+
#data_class.find(:first, :conditions => {data_class.primary_key => hsh.delete(data_class.primary_key)})
|
|
106
|
+
success = true
|
|
107
|
+
|
|
108
|
+
@record = data_class.new if @record.nil?
|
|
109
|
+
|
|
110
|
+
hsh.each_pair do |k,v|
|
|
111
|
+
@record.set_value_for_attribute(fields[k.to_sym].nil? ? {:name => k} : fields[k.to_sym], v)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
#hsh.each_pair do |k,v|
|
|
115
|
+
#begin
|
|
116
|
+
#@record.send("#{k}=",v)
|
|
117
|
+
#rescue StandardError => exc
|
|
118
|
+
#flash :error => exc.message
|
|
119
|
+
#success = false
|
|
120
|
+
#break
|
|
121
|
+
#end
|
|
122
|
+
#end
|
|
123
|
+
|
|
124
|
+
# did we have complete success?
|
|
125
|
+
success && data_adapter.save_record(@record)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# API handling form load
|
|
129
|
+
# def load(params)
|
|
130
|
+
# klass = config[:model].constantize
|
|
131
|
+
# case params[:neighbour]
|
|
132
|
+
# when "previous" then @record = klass.previous(params[:id])
|
|
133
|
+
# when "next" then @record = klass.next(params[:id])
|
|
134
|
+
# else @record = klass.find(params[:id])
|
|
135
|
+
# end
|
|
136
|
+
# {:data => [array_of_values]}
|
|
137
|
+
# end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|