netzke-basepack 0.5.14 → 0.6.0

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.
Files changed (196) hide show
  1. data/.gitignore +3 -2
  2. data/CHANGELOG.rdoc +15 -0
  3. data/README.rdoc +45 -50
  4. data/Rakefile +8 -8
  5. data/TODO.rdoc +1 -6
  6. data/app/components/netzke/basepack/accordion_panel.rb +37 -0
  7. data/app/components/netzke/basepack/basic_app.rb +267 -0
  8. data/{lib/netzke → app/components/netzke/basepack}/basic_app/statusbar_ext.js +0 -0
  9. data/app/components/netzke/basepack/border_layout_panel.rb +39 -0
  10. data/app/components/netzke/basepack/form_panel.rb +102 -0
  11. data/app/components/netzke/basepack/form_panel/fields.rb +206 -0
  12. data/{lib/netzke → app/components/netzke/basepack}/form_panel/javascripts/netzkefileupload.js +0 -0
  13. data/app/components/netzke/basepack/form_panel/javascripts/pre.js +76 -0
  14. data/{lib/netzke → app/components/netzke/basepack}/form_panel/javascripts/xcheckbox.js +0 -0
  15. data/app/components/netzke/basepack/form_panel/services.rb +99 -0
  16. data/app/components/netzke/basepack/grid_panel.rb +374 -0
  17. data/app/components/netzke/basepack/grid_panel/columns.rb +233 -0
  18. data/app/components/netzke/basepack/grid_panel/javascript.rb +69 -0
  19. data/app/components/netzke/basepack/grid_panel/javascripts/advanced_search.js +96 -0
  20. data/{lib/netzke → app/components/netzke/basepack}/grid_panel/javascripts/edit_in_form.js +5 -4
  21. data/{lib/netzke/grid_panel/javascripts/grid_panel_pre.js → app/components/netzke/basepack/grid_panel/javascripts/pre.js} +17 -37
  22. data/{lib/netzke → app/components/netzke/basepack}/grid_panel/javascripts/rows-dd.js +0 -0
  23. data/app/components/netzke/basepack/grid_panel/multi_edit_form.rb +16 -0
  24. data/app/components/netzke/basepack/grid_panel/record_form_window.rb +36 -0
  25. data/app/components/netzke/basepack/grid_panel/search_window.rb +56 -0
  26. data/app/components/netzke/basepack/grid_panel/services.rb +356 -0
  27. data/app/components/netzke/basepack/panel.rb +11 -0
  28. data/app/components/netzke/basepack/search_panel.rb +59 -0
  29. data/app/components/netzke/basepack/tab_panel.rb +32 -0
  30. data/app/components/netzke/basepack/window.rb +73 -0
  31. data/app/components/netzke/basepack/wrapper.rb +28 -0
  32. data/{lib/app → app}/models/netzke_field_list.rb +1 -1
  33. data/{lib/app → app}/models/netzke_model_attr_list.rb +0 -0
  34. data/{lib/app → app}/models/netzke_persistent_array_auto_model.rb +0 -0
  35. data/config/database.yml +35 -0
  36. data/features/accordion_panel.feature +15 -0
  37. data/features/basic_app.feature +12 -0
  38. data/features/form_panel.feature +40 -0
  39. data/features/grid_panel.feature +62 -0
  40. data/features/search_in_grid.feature +35 -0
  41. data/features/simple_panel.feature +15 -0
  42. data/features/step_definitions/accordion_steps.rb +9 -0
  43. data/features/step_definitions/generic_steps.rb +15 -0
  44. data/features/step_definitions/grid_panel_steps.rb +26 -0
  45. data/features/step_definitions/pickle_steps.rb +100 -0
  46. data/features/step_definitions/web_steps.rb +219 -0
  47. data/features/support/env.rb +66 -0
  48. data/features/support/paths.rb +59 -0
  49. data/features/support/pickle.rb +25 -0
  50. data/features/tab_panel.feature +15 -0
  51. data/features/window.feature +11 -0
  52. data/from_05_to_06.rdoc +2 -0
  53. data/javascripts/basepack.js +54 -2
  54. data/lib/netzke-basepack.rb +38 -25
  55. data/lib/netzke/active_record.rb +12 -4
  56. data/lib/netzke/active_record/attributes.rb +60 -5
  57. data/lib/netzke/active_record/combobox_options.rb +3 -2
  58. data/lib/netzke/active_record/relation_extensions.rb +35 -0
  59. data/lib/netzke/basepack.rb +27 -0
  60. data/lib/netzke/basepack/version.rb +11 -0
  61. data/lib/netzke/basepack/wrap_lazy_loaded.rb +26 -0
  62. data/lib/netzke/data_accessor.rb +60 -32
  63. data/lib/netzke/fields_configurator.rb +5 -9
  64. data/lib/netzke/masquerade_selector.rb +1 -1
  65. data/locale/en.yml +16 -0
  66. data/netzke-basepack.gemspec +298 -0
  67. data/spec/active_record/attributes_spec.rb +14 -0
  68. data/spec/active_record/relation_extensions_spec.rb +44 -0
  69. data/spec/components/form_panel_spec.rb +70 -0
  70. data/spec/components/grid_panel_spec.rb +10 -0
  71. data/spec/factories.rb +9 -0
  72. data/spec/spec_helper.rb +35 -0
  73. data/test/rails_app/.gitignore +4 -0
  74. data/test/rails_app/Gemfile +32 -0
  75. data/test/rails_app/Gemfile.lock +171 -0
  76. data/test/rails_app/README +256 -0
  77. data/test/rails_app/Rakefile +7 -0
  78. data/test/rails_app/app/components/generic_user_form.rb +12 -0
  79. data/test/rails_app/app/components/simple_accordion.rb +11 -0
  80. data/test/rails_app/app/components/simple_basic_app.rb +32 -0
  81. data/test/rails_app/app/components/simple_panel.rb +17 -0
  82. data/test/rails_app/app/components/simple_tab_panel.rb +11 -0
  83. data/test/rails_app/app/components/simple_wrapper.rb +7 -0
  84. data/test/rails_app/app/components/some_border_layout.rb +24 -0
  85. data/test/rails_app/app/components/some_search_panel.rb +34 -0
  86. data/test/rails_app/app/components/some_tab_panel.rb +15 -0
  87. data/test/rails_app/app/components/user_form.rb +21 -0
  88. data/test/rails_app/app/components/user_form_with_default_fields.rb +8 -0
  89. data/test/rails_app/app/components/user_grid.rb +4 -0
  90. data/test/rails_app/app/components/window_component_loader.rb +17 -0
  91. data/test/{app_root/app/controllers/application.rb → rails_app/app/controllers/application_controller.rb} +1 -0
  92. data/test/rails_app/app/controllers/components_controller.rb +6 -0
  93. data/test/rails_app/app/controllers/welcome_controller.rb +5 -0
  94. data/test/rails_app/app/helpers/application_helper.rb +2 -0
  95. data/test/{app_root → rails_app}/app/models/role.rb +0 -0
  96. data/test/rails_app/app/models/user.rb +6 -0
  97. data/test/rails_app/app/presenters/forms/generic_user.rb +6 -0
  98. data/test/rails_app/app/views/layouts/application.html.erb +13 -0
  99. data/test/rails_app/config.ru +4 -0
  100. data/test/rails_app/config/application.rb +45 -0
  101. data/test/rails_app/config/boot.rb +13 -0
  102. data/test/rails_app/config/database.yml +35 -0
  103. data/test/rails_app/config/environment.rb +6 -0
  104. data/test/rails_app/config/environments/development.rb +22 -0
  105. data/test/rails_app/config/environments/production.rb +49 -0
  106. data/test/rails_app/config/environments/test.rb +35 -0
  107. data/test/rails_app/config/initializers/backtrace_silencers.rb +8 -0
  108. data/test/rails_app/config/initializers/inflections.rb +10 -0
  109. data/test/rails_app/config/initializers/mime_types.rb +5 -0
  110. data/test/rails_app/config/initializers/netzke.rb +7 -0
  111. data/test/rails_app/config/initializers/secret_token.rb +7 -0
  112. data/test/rails_app/config/initializers/session_store.rb +8 -0
  113. data/test/rails_app/config/locales/es.yml +12 -0
  114. data/test/rails_app/config/routes.rb +65 -0
  115. data/test/rails_app/db/development_structure.sql +39 -0
  116. data/test/{app_root/db/migrate/20081222035855_create_netzke_preferences.rb → rails_app/db/migrate/20100905214933_create_netzke_preferences.rb} +2 -4
  117. data/test/{app_root/db/migrate/20090423222114_create_users.rb → rails_app/db/migrate/20100914104207_create_users.rb} +4 -1
  118. data/test/{app_root/db/migrate/20090423214303_create_roles.rb → rails_app/db/migrate/20100914104236_create_roles.rb} +2 -0
  119. data/test/rails_app/db/schema.rb +38 -0
  120. data/test/rails_app/db/seeds.rb +20 -0
  121. data/test/rails_app/features/support/paths.rb +47 -0
  122. data/test/{app_root/config/environments/in_memory.rb → rails_app/lib/tasks/.gitkeep} +0 -0
  123. data/test/rails_app/public/404.html +26 -0
  124. data/test/rails_app/public/422.html +26 -0
  125. data/test/rails_app/public/500.html +26 -0
  126. data/test/{app_root/config/environments/mysql.rb → rails_app/public/favicon.ico} +0 -0
  127. data/test/rails_app/public/images/header-deco.gif +0 -0
  128. data/test/rails_app/public/images/rails.png +0 -0
  129. data/test/rails_app/public/javascripts/application.js +2 -0
  130. data/test/rails_app/public/javascripts/controls.js +965 -0
  131. data/test/rails_app/public/javascripts/dragdrop.js +974 -0
  132. data/test/rails_app/public/javascripts/effects.js +1123 -0
  133. data/test/rails_app/public/javascripts/prototype.js +6001 -0
  134. data/test/rails_app/public/javascripts/rails.js +175 -0
  135. data/test/rails_app/public/robots.txt +5 -0
  136. data/test/{app_root/config/environments/postgresql.rb → rails_app/public/stylesheets/.gitkeep} +0 -0
  137. data/test/rails_app/script/rails +6 -0
  138. data/test/rails_app/spec/models/role_spec.rb +5 -0
  139. data/test/rails_app/spec/models/user_spec.rb +5 -0
  140. data/test/rails_app/test/performance/browsing_test.rb +9 -0
  141. data/test/rails_app/test/test_helper.rb +13 -0
  142. data/test/{app_root/config/environments/sqlite.rb → rails_app/vendor/plugins/.gitkeep} +0 -0
  143. data/test/unit/accordion_panel_test.rb +3 -3
  144. data/test/unit/active_record_basepack_test.rb +4 -4
  145. data/test/unit/tab_panel_test.rb +4 -4
  146. metadata +199 -119
  147. data/lib/netzke/accordion_panel.rb +0 -115
  148. data/lib/netzke/active_record/data_accessor.rb +0 -25
  149. data/lib/netzke/attributes_configurator.rb +0 -195
  150. data/lib/netzke/basic_app.rb +0 -368
  151. data/lib/netzke/border_layout_panel.rb +0 -130
  152. data/lib/netzke/configuration_panel.rb +0 -24
  153. data/lib/netzke/form_panel.rb +0 -138
  154. data/lib/netzke/form_panel/form_panel_api.rb +0 -81
  155. data/lib/netzke/form_panel/form_panel_fields.rb +0 -149
  156. data/lib/netzke/form_panel/form_panel_js.rb +0 -163
  157. data/lib/netzke/grid_panel.rb +0 -367
  158. data/lib/netzke/grid_panel/grid_panel_api.rb +0 -364
  159. data/lib/netzke/grid_panel/grid_panel_columns.rb +0 -232
  160. data/lib/netzke/grid_panel/grid_panel_js.rb +0 -73
  161. data/lib/netzke/grid_panel/javascripts/advanced_search.js +0 -65
  162. data/lib/netzke/grid_panel/multi_edit_form.rb +0 -14
  163. data/lib/netzke/grid_panel/record_form_window.rb +0 -50
  164. data/lib/netzke/panel.rb +0 -11
  165. data/lib/netzke/plugins/configuration_tool.rb +0 -121
  166. data/lib/netzke/property_editor.rb +0 -111
  167. data/lib/netzke/property_editor/helper_model.rb +0 -122
  168. data/lib/netzke/search_panel.rb +0 -199
  169. data/lib/netzke/tab_panel.rb +0 -174
  170. data/lib/netzke/table_editor.rb +0 -118
  171. data/lib/netzke/tree_panel.rb +0 -25
  172. data/lib/netzke/window.rb +0 -82
  173. data/lib/netzke/wrapper.rb +0 -42
  174. data/test/app_root/app/models/book.rb +0 -9
  175. data/test/app_root/app/models/category.rb +0 -2
  176. data/test/app_root/app/models/city.rb +0 -3
  177. data/test/app_root/app/models/continent.rb +0 -2
  178. data/test/app_root/app/models/country.rb +0 -3
  179. data/test/app_root/app/models/genre.rb +0 -3
  180. data/test/app_root/app/models/user.rb +0 -3
  181. data/test/app_root/config/boot.rb +0 -114
  182. data/test/app_root/config/database.yml +0 -21
  183. data/test/app_root/config/environment.rb +0 -14
  184. data/test/app_root/config/environments/sqlite3.rb +0 -0
  185. data/test/app_root/config/routes.rb +0 -4
  186. data/test/app_root/db/migrate/20081222033343_create_books.rb +0 -15
  187. data/test/app_root/db/migrate/20081222033440_create_genres.rb +0 -15
  188. data/test/app_root/db/migrate/20081223024935_create_categories.rb +0 -13
  189. data/test/app_root/db/migrate/20081223025635_create_countries.rb +0 -14
  190. data/test/app_root/db/migrate/20081223025653_create_continents.rb +0 -13
  191. data/test/app_root/db/migrate/20081223025732_create_cities.rb +0 -15
  192. data/test/app_root/db/migrate/20090102223630_create_netzke_field_lists.rb +0 -18
  193. data/test/app_root/script/console +0 -7
  194. data/test/app_root/vendor/plugins/acts_as_list/README +0 -23
  195. data/test/app_root/vendor/plugins/acts_as_list/init.rb +0 -3
  196. data/test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +0 -256
data/.gitignore CHANGED
@@ -5,5 +5,6 @@ doc
5
5
  Manifest
6
6
  test/app_root/vendor/plugins/netzke-core
7
7
  rdoc
8
- netzke-basepack.gemspec
9
- netzke-basepack-*.gem
8
+ netzke-basepack-*.gem
9
+ icons
10
+ extjs
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,18 @@
1
+ = v0.6.0 - 2010-10-24
2
+ * netzke-core 0.6.0 compatibility, thorough refactoring
3
+ * Much more thorough testing (cucumber and rspec)
4
+ * FormPanel/GridPanel dynamic column/field configuration has been left out (planned for a separate gem)
5
+ * different bug fixes
6
+
7
+ * enhancements
8
+ * if omitted in config, a column for the primary key is automatically added to Grid/FormPanel
9
+
10
+ * API incompatibilities
11
+ * in FormPanel, define the fields layout directly in :items, not in :fields or :columns
12
+
13
+ * new
14
+ * FormPanel allows for arbitrary layout of fields
15
+
1
16
  = v0.5.14 - 2010-09-08
2
17
  * bug fix
3
18
  * fields configurator wouldn't open in some cases
data/README.rdoc CHANGED
@@ -1,87 +1,82 @@
1
1
  = netzke-basepack
2
- A pack of basic Rails/ExtJS widgets as a part of the Netzke framework. Live demo/tutorials on http://blog.writelesscode.com. Introduction to the Netzke framework and the Wiki: http://github.com/skozlov/netzke
3
2
 
4
- == Prerequisites
5
- 1. Rails >= 2.2
6
- 2. Netzke assumes that your ExtJS library is in public/extjs, which may be a symbolic link, e.g:
7
-
8
- cd public && ln -s ~/Developer/extjs/ext-3.1.1 extjs
9
-
10
- 3. acts_as_list plugin:
3
+ A pack of pre-built Netzke components, such as grid, form, tab panel, etc.
4
+ Learn about Netzke on http://netzke.org.
11
5
 
12
- ./script/plugin install git://github.com/rails/acts_as_list.git
6
+ == Prerequisites
13
7
 
14
- 4. netzke-core gem or plugin. Gem:
15
-
16
- gem install netzke-core
17
-
18
- Plugin (for the "edge" stuff, recommended):
8
+ 1. Rails >= 3.0, Ext JS >= 3.3.0
9
+ 2. Netzke assumes that your ExtJS library is in public/extjs, which may be a symbolic link, e.g (from your app root):
19
10
 
20
- ./script/plugin install git://github.com/skozlov/netzke-core.git
11
+ ln -s ~/code/sencha/extjs/ext-3.3.0 public/extjs
21
12
 
22
13
  = Installation
23
- For the "edge" stuff, install as plugin (recommended):
24
14
 
25
- ./script/plugin install git://github.com/skozlov/netzke-basepack.git
15
+ For the latest ("edge") stuff, install as plugin:
26
16
 
27
- Or install as gem:
17
+ rails plugin install git://github.com/skozlov/netzke-basepack.git
18
+
19
+ Or tell bundler to get the gem straight from github:
28
20
 
29
- gem install netzke-basepack
21
+ gem 'netzke-basepack', :git => "git://github.com/skozlov/netzke-basepack.git"
30
22
 
31
23
  == Usage
32
- If using as gem, include it into environment.rb:
33
24
 
34
- config.gem "netzke-basepack"
25
+ Add Netzke routes (in routes.rb):
26
+
27
+ # in routes.rb
28
+ RailsApp::Application.routes.draw do
29
+ netzke
30
+ ...
31
+ end
35
32
 
36
- Include mapping for Netzke controller providing Netzke javascripts and styles (in routes.rb):
33
+ == Embedding components into Rails' view
37
34
 
38
- map.netzke
35
+ Before you can use Netzke components in Rails' views, you need to add the following helper into your layout template, inside the "head" tag:
39
36
 
40
- Run the generators (some assets and a migration for dynamically configured columns/fields):
37
+ <%= netzke_init %>
41
38
 
42
- ./script/generate netzke_basepack
39
+ This will include both ExtJS-related files (JavaScript and styles), and Netzke-related files.
43
40
 
44
- To be able to use persistent on-the-fly configuration of widgets, run netzke-core generators:
41
+ To embed a component into a view, use the +netzke+ helper, e.g.:
45
42
 
46
- ./script/generate netzke_core
47
-
48
- ... then run the migrations:
43
+ <%= netzke :books, :class_name => 'Basepack::GridPanel', :model => 'Book' %>
44
+
45
+ (assuming the existence of model 'Book')
49
46
 
50
- rake db:migrate
47
+ For more examples, see http://demo.netzke.com, and look into test/rails_app
51
48
 
52
- == Embedding widgets into Rails' view
53
- To enable Netzke widgets in Rails' views, you need to add the following helper into your layout template, inside the "head" tag:
49
+ == Running tests
54
50
 
55
- <%= netzke_init %>
56
-
57
- This will include both ExtJS-related files (JavaScript and styles), and Netzke-related files.
51
+ Netzke-basepack is bundled with automated tests. To run them, you need to set up test/rails_app a similar way as you did with your own Rails app that is using Netzke, i.e.: 1) link Ext JS into the "public" folder, 2) link netzke-core into vendor/plugins, 3) run migrations and clone the development database structure into the test database.
58
52
 
59
- Now let's embed a widget into a view. The following example will provide you with a grid-based scaffold for ActiveRecord-model called Book. You may generate it like this:
53
+ After this you may run (*from the netzke-basepack folder*):
60
54
 
61
- ./script/generate model Book title:string amount:integer
55
+ cucumber features
56
+
57
+ and
62
58
 
63
- (don't forget to re-run the migrations after it)
59
+ rspec spec
64
60
 
65
- Now embed a widget into a view like this:
61
+ == Testing playground
66
62
 
67
- <%= netzke :books, :class_name => 'GridPanel', :model => 'Book' %>
63
+ The test/rails_app application is also a convenient playground, as it may be run as independent Rails 3 app. After starting it, access any of the lib/netzke widgets by using the following url:
68
64
 
69
- For more examples, see http://netzke-demo.writelesscode.com
65
+ http://localhost:3000/components/<name of the component class>
66
+
67
+ e.g.:
70
68
 
69
+ http://localhost:3000/components/UserGrid
70
+
71
71
  == Icons support
72
- Netzke-basepack supports FamFamFam Silk icon set (http://www.famfamfam.com/archive/silk-icons-thats-your-lot/). To enable it, download it and put the "icons" folder into your app's public/images folder. Then restart your application.
72
+ 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.
73
73
 
74
74
  == More info
75
- Introduction to Netzke framework and wiki: http://github.com/skozlov/netzke
76
-
77
- Twitter: http://twitter.com/skozlov
78
-
79
- Tutorials: http://blog.writelesscode.com
75
+ Official project site: http://netzke.org
80
76
 
81
- Live-demo with sample code: http://netzke-demo.writelesscode.com
77
+ Twitter (I try to only tweet about useful stuff): http://twitter.com/skozlov
82
78
 
83
- = Credentials
84
- Testing done with the help of http://github.com/pluginaweek/plugin_test_helper
79
+ Many (if a bit outdated) tutorials: http://blog.writelesscode.com
85
80
 
86
81
  ---
87
82
  Copyright (c) 2008-2010 Sergei Kozlov, released under the MIT license
data/Rakefile CHANGED
@@ -1,18 +1,18 @@
1
1
  begin
2
2
  require 'jeweler'
3
+ require './lib/netzke/basepack/version'
3
4
  Jeweler::Tasks.new do |gemspec|
4
- gemspec.version = "0.5.14"
5
+ gemspec.version = Netzke::Basepack::Version::STRING
5
6
  gemspec.name = "netzke-basepack"
6
- gemspec.summary = "Pre-built Rails + ExtJS widgets for your RIA"
7
- gemspec.description = "A set of full-featured extendible Netzke widgets (such as FormPanel, GridPanel, Window, BorderLayoutPanel, etc) which can be used as building block for your RIA"
7
+ gemspec.summary = "Pre-built Rails + ExtJS components for your RIA"
8
+ gemspec.description = "A set of full-featured extendible Netzke components (such as FormPanel, GridPanel, Window, BorderLayoutPanel, etc) which can be used as building block for your RIA"
8
9
  gemspec.email = "sergei@playcode.nl"
9
10
  gemspec.homepage = "http://github.com/skozlov/netzke-basepack"
10
- gemspec.rubyforge_project = "netzke-basepack"
11
11
  gemspec.authors = ["Sergei Kozlov"]
12
- gemspec.add_dependency("netzke-core", ">=0.5.5")
13
- gemspec.add_dependency("searchlogic", ">=2.0.0")
14
- gemspec.add_dependency("will_paginate", ">=2.0.0")
15
- gemspec.add_dependency("acts_as_list", ">=0.1.2")
12
+ gemspec.add_dependency("netzke-core", "~>0.6.0")
13
+ gemspec.add_dependency("meta_where", ">=0.9.3")
14
+ gemspec.add_dependency("will_paginate", "~>3.0.pre2")
15
+ gemspec.add_dependency("acts_as_list")
16
16
  gemspec.post_install_message = <<-MESSAGE
17
17
 
18
18
  ========================================================================
data/TODO.rdoc CHANGED
@@ -1,20 +1,15 @@
1
1
  == Priority
2
2
  * Solve the confusion about columns being stored in the persistent config
3
3
  * On grid refresh, reset the dirty fields, so that the "Apply" button doesn't do anything
4
+ * DataAccessor#to_array should not rescue exceptions, but rather check the availability of the attributes; `respond_to_with_basepack?` should be extended to also return true for association columns
4
5
  * GridPanel's read_only vs editable (doesn't work now) options
5
- * Inclusion of css in a stand-alone widget
6
6
  * Find a way to print the grid nicely (along with the column and rows that don't fit on the screen)
7
- * Auto-include the ID column into GridPanel by default
8
7
 
9
8
  == Foolproof
10
- * Should not be possible delete the "ID" field from grids/forms
11
9
  * Should not be possible to put the "ID" field on any place but first for grids (otherwise record ID is not correct)
12
10
 
13
11
  == Optimizations
14
12
  * Check persistent_config-related queries (aren't they too many?)
15
13
 
16
- == Code design
17
- * Replace <tt>initial_late_aggregatees</tt> method with a set of methods for each aggregatee, so that more logic would be possible at the moment of on-demand aggregatee loading.
18
-
19
14
  == One day
20
15
  * Replace xcheckbox with checkbox in FormPanel
@@ -0,0 +1,37 @@
1
+ module Netzke
2
+ module Basepack
3
+ # = AccordionPanel
4
+ #
5
+ # A panel with the 'accordion' layout. Can lazily load its nested components. For example:
6
+ #
7
+ # netzke :my_accordion, :items => [{
8
+ # :html => "I'm a simple Ext.Panel",
9
+ # :title => "Panel One"
10
+ # },{
11
+ # :class_name => "SimplePanel",
12
+ # :update_text => "Update for Panel Two",
13
+ # :title => "Panel Two",
14
+ # :lazy_loading => true
15
+ # }]
16
+ class AccordionPanel < Netzke::Base
17
+
18
+ include WrapLazyLoaded
19
+
20
+ js_property :layout, 'accordion'
21
+
22
+ js_method :init_component, <<-JS
23
+ function(params){
24
+ #{js_full_class_name}.superclass.initComponent.call(this);
25
+ this.items.each(function(item){
26
+ item.on('expand', function(i){
27
+ if (i.wrappedComponent && !i.items.first()) {
28
+ this.loadComponent({name: i.wrappedComponent, container: i.id});
29
+ }
30
+ }, this);
31
+ }, this);
32
+ }
33
+ JS
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,267 @@
1
+ module Netzke
2
+ module Basepack
3
+ # == BasicApp
4
+ # Basis for a Ext.Viewport-based application
5
+ #
6
+ # Features:
7
+ # * dynamic loading of components
8
+ # * browser history support (press the "Back"-button to go to the previously loaded component)
9
+ # * AJAX activity indicator
10
+ # * (TODO) authentification support
11
+ # * (TODO) masquerade support
12
+ class BasicApp < Base
13
+
14
+ js_base_class "Ext.Viewport"
15
+
16
+ js_property :layout, :border
17
+
18
+ def self.include_js
19
+ res = []
20
+ ext_examples = Netzke::Core.ext_location.join("examples")
21
+ res << ext_examples.join("ux/statusbar/StatusBar.js")
22
+ res << "#{File.dirname(__FILE__)}/basic_app/statusbar_ext.js"
23
+ end
24
+
25
+ class_attribute :logout_url
26
+ self.logout_url = "/logout"
27
+
28
+ config do
29
+ # In status bar we want to show what we are masquerading as
30
+ if session[:masq_user]
31
+ user = User.find(session[:masq_user])
32
+ masq = %Q{user "#{user.login}"}
33
+ elsif session[:masq_role]
34
+ role = Role.find(session[:masq_role])
35
+ masq = %Q{role "#{role.name}"}
36
+ elsif session[:masq_world]
37
+ masq = %Q{World}
38
+ end
39
+
40
+ {
41
+ :items => [{
42
+ :id => 'main-panel',
43
+ :region => 'center',
44
+ :layout => 'fit'
45
+ },{
46
+ :id => 'main-toolbar',
47
+ :xtype => 'toolbar',
48
+ :region => 'north',
49
+ :height => 25,
50
+ :items => menu
51
+ },{
52
+ :id => 'main-statusbar',
53
+ :xtype => 'statusbar',
54
+ :region => 'south',
55
+ :height => 22,
56
+ :statusAlign => 'right',
57
+ :busyText => 'Busy...',
58
+ :default_text => masq.nil? ? "Ready #{"(config mode)" if session[:config_mode]}" : "Masquerading as #{masq}",
59
+ :default_icon_cls => ""
60
+ }]
61
+ }
62
+ end
63
+
64
+ js_method :init_component, <<-JS
65
+ function(){
66
+ #{js_full_class_name}.superclass.initComponent.call(this);
67
+
68
+ // If we are given a token, load the corresponding component, otherwise load the last loaded component
69
+ var currentToken = Ext.History.getToken();
70
+ if (currentToken != "") {
71
+ this.processHistory(currentToken);
72
+ } else {
73
+ var lastLoaded = this.initialConfig.componentToLoad; // passed from the server
74
+ if (lastLoaded) Ext.History.add(lastLoaded);
75
+ }
76
+
77
+ Ext.History.on('change', this.processHistory, this);
78
+
79
+ // Setting the "busy" indicator for Ajax requests
80
+ Ext.Ajax.on('beforerequest', function(){this.findById('main-statusbar').showBusy()}, this);
81
+ Ext.Ajax.on('requestcomplete', function(){this.findById('main-statusbar').hideBusy()}, this);
82
+ Ext.Ajax.on('requestexception', function(){this.findById('main-statusbar').hideBusy()}, this);
83
+
84
+ // Initialize history
85
+ Ext.History.init();
86
+ }
87
+ JS
88
+
89
+ js_method :on_login, <<-JS
90
+ function(){
91
+ window.location = "/login"
92
+ }
93
+ JS
94
+
95
+ js_method :on_logout, <<-JS
96
+ function(){
97
+ window.location = "#{logout_url}"
98
+ }
99
+ JS
100
+
101
+ js_method :process_history, <<-JS
102
+ function(token){
103
+ if (token){
104
+ this.loadComponent({name:token, container:'main-panel'});
105
+ } else {
106
+ Ext.getCmp('main-panel').removeChild();
107
+ }
108
+ }
109
+ JS
110
+
111
+ js_method :instantiate_component, <<-JS
112
+ function(config){
113
+ this.findById('main-panel').instantiateChild(config);
114
+ }
115
+ JS
116
+
117
+ js_method :app_load_component, <<-JS
118
+ function(name){
119
+ Ext.History.add(name);
120
+ }
121
+ JS
122
+
123
+ js_method :load_component_by_action, <<-JS
124
+ function(action){
125
+ this.appLoadComponent(action.component || action.name);
126
+ }
127
+ JS
128
+
129
+ js_method :on_toggle_config_mode, <<-JS
130
+ function(params){
131
+ this.toggleConfigMode();
132
+ }
133
+ JS
134
+
135
+ js_method :show_masquerade_selector, <<-JS
136
+ function(){
137
+ var w = new Ext.Window({
138
+ title: 'Masquerade as',
139
+ modal: true,
140
+ width: Ext.lib.Dom.getViewWidth() * 0.6,
141
+ height: Ext.lib.Dom.getViewHeight() * 0.6,
142
+ layout: 'fit',
143
+ closeAction :'destroy',
144
+ buttons: [{
145
+ text: 'Select',
146
+ handler : function(){
147
+ if (role = w.getNetzkeComponent().masquerade.role) {
148
+ Ext.Msg.confirm("Masquerading as a role", "Individual preferences for all users with this role will get overwritten as you make changes. Continue?", function(btn){
149
+ if (btn === 'yes') {
150
+ w.close();
151
+ }
152
+ });
153
+ } else {
154
+ w.close();
155
+ }
156
+ },
157
+ scope:this
158
+ },{
159
+ text:'As World',
160
+ handler:function(){
161
+ Ext.Msg.confirm("Masquerading as World", "Caution! All settings that you will modify will be overwritten for all roles and all users. Are you sure you know what you're doing?", function(btn){
162
+ if (btn === "yes") {
163
+ this.masquerade = {world:true};
164
+ w.close();
165
+ }
166
+ }, this);
167
+ },
168
+ scope:this
169
+ },{
170
+ text:'No masquerading',
171
+ handler:function(){
172
+ this.masquerade = {};
173
+ w.close();
174
+ },
175
+ scope:this
176
+ },{
177
+ text:'Cancel',
178
+ handler:function(){
179
+ w.hide();
180
+ },
181
+ scope:this
182
+ }],
183
+ listeners : {close: {fn: function(){
184
+ this.masqueradeAs(this.masquerade || w.getNetzkeComponent().masquerade || {});
185
+ }, scope: this}}
186
+ });
187
+
188
+ w.show(null, function(){
189
+ this.loadComponent({id:"masqueradeSelector", container:w.id})
190
+ }, this);
191
+
192
+ }
193
+ JS
194
+
195
+ # Set the Logout button if Netzke::Base.user is set
196
+ def menu
197
+ res = []
198
+ user = User.find_by_id(session[:netzke_user_id])
199
+ if !user.nil?
200
+ user_name = user.respond_to?(:name) ? user.name : user.login # try to display user's name, fallback to login
201
+ res << "->" <<
202
+ {
203
+ :text => "#{user_name}",
204
+ :menu => user_menu
205
+ }
206
+ else
207
+ res << "->" << :login.action
208
+ end
209
+ res
210
+ end
211
+
212
+ def user_menu
213
+ [:logout.action]
214
+ end
215
+
216
+ def initialize(*args)
217
+ super
218
+
219
+ if session[:netzke_just_logged_in] || session[:netzke_just_logged_out]
220
+ session[:config_mode] = false
221
+ session[:masq_world] = session[:masq_user] = session[:masq_roles] = nil
222
+ end
223
+
224
+ strong_children_config.deep_merge!(:mode => :config) if session[:config_mode]
225
+ end
226
+
227
+
228
+ action :masquerade_selector, :text => "Masquerade as ...", :handler => :show_masquerade_selector
229
+
230
+ action :toggle_config_mode do
231
+ {:text => "#{session[:config_mode] ? "Leave" : "Enter"} config mode"}
232
+ end
233
+
234
+ action :login, :icon => :door_in
235
+
236
+ action :logout, :icon => :door_out
237
+
238
+ # Html required for Ext.History to work
239
+ def js_component_html
240
+ super << %Q{
241
+ <form id="history-form" class="x-hidden">
242
+ <input type="hidden" id="x-history-field" />
243
+ <iframe id="x-history-frame"></iframe>
244
+ </form>
245
+ }
246
+ end
247
+
248
+ #
249
+ # Interface section
250
+ #
251
+ endpoint :toggle_config_mode do |params|
252
+ session = Netzke::Base.session
253
+ session[:config_mode] = !session[:config_mode]
254
+ {:js => "window.location.reload();"}
255
+ end
256
+
257
+ endpoint :masquerade_as do |params|
258
+ session = Netzke::Base.session
259
+ session[:masq_world] = params[:world] == "true"
260
+ session[:masq_role] = params[:role].try(:to_i)
261
+ session[:masq_user] = params[:user].try(:to_i)
262
+ {:js => "window.location.reload();"}
263
+ end
264
+
265
+ end
266
+ end
267
+ end