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.
Files changed (268) hide show
  1. data/.autotest +1 -0
  2. data/.travis.yml +11 -0
  3. data/CHANGELOG.rdoc +445 -0
  4. data/LICENSE +1 -0
  5. data/README.md +94 -0
  6. data/Rakefile +44 -0
  7. data/TODO.rdoc +8 -0
  8. data/config/ci/before-travis.sh +28 -0
  9. data/init.rb +1 -0
  10. data/install.rb +1 -0
  11. data/javascripts/basepack.js +139 -0
  12. data/javascripts/xdatetime.js +196 -0
  13. data/lib/generators/netzke/basepack_generator.rb +10 -0
  14. data/lib/generators/netzke/templates/assets/ts-checkbox.gif +0 -0
  15. data/lib/generators/netzke/templates/create_netzke_field_lists.rb +18 -0
  16. data/lib/netzke-basepack.rb +26 -0
  17. data/lib/netzke/active_record.rb +20 -0
  18. data/lib/netzke/active_record/attributes.rb +256 -0
  19. data/lib/netzke/active_record/combobox_options.rb +16 -0
  20. data/lib/netzke/active_record/relation_extensions.rb +37 -0
  21. data/lib/netzke/basepack.rb +45 -0
  22. data/lib/netzke/basepack/accordion_panel.rb +39 -0
  23. data/lib/netzke/basepack/action_column.rb +68 -0
  24. data/lib/netzke/basepack/action_column/javascripts/action_column.js +61 -0
  25. data/lib/netzke/basepack/auth_app.rb +159 -0
  26. data/lib/netzke/basepack/basic_app.rb +7 -0
  27. data/lib/netzke/basepack/border_layout_panel.rb +53 -0
  28. data/lib/netzke/basepack/border_layout_panel/javascripts/border_layout_panel.js +40 -0
  29. data/lib/netzke/basepack/data_accessor.rb +53 -0
  30. data/lib/netzke/basepack/data_adapters/abstract_adapter.rb +164 -0
  31. data/lib/netzke/basepack/data_adapters/active_record_adapter.rb +279 -0
  32. data/lib/netzke/basepack/data_adapters/data_mapper_adapter.rb +264 -0
  33. data/lib/netzke/basepack/data_adapters/sequel_adapter.rb +260 -0
  34. data/lib/netzke/basepack/form_panel.rb +144 -0
  35. data/lib/netzke/basepack/form_panel/fields.rb +208 -0
  36. data/lib/netzke/basepack/form_panel/javascripts/comma_list_cbg.js +51 -0
  37. data/lib/netzke/basepack/form_panel/javascripts/form_panel.js +225 -0
  38. data/lib/netzke/basepack/form_panel/javascripts/misc.js +4 -0
  39. data/lib/netzke/basepack/form_panel/javascripts/n_radio_group.js +43 -0
  40. data/lib/netzke/basepack/form_panel/javascripts/readonly_mode.js +35 -0
  41. data/lib/netzke/basepack/form_panel/services.rb +142 -0
  42. data/lib/netzke/basepack/form_panel/stylesheets/readonly_mode.css +14 -0
  43. data/lib/netzke/basepack/grid_panel.rb +440 -0
  44. data/lib/netzke/basepack/grid_panel/columns.rb +394 -0
  45. data/lib/netzke/basepack/grid_panel/javascripts/advanced_search.js +27 -0
  46. data/lib/netzke/basepack/grid_panel/javascripts/check_column_fix.js +6 -0
  47. data/lib/netzke/basepack/grid_panel/javascripts/edit_in_form.js +51 -0
  48. data/lib/netzke/basepack/grid_panel/javascripts/event_handling.js +179 -0
  49. data/lib/netzke/basepack/grid_panel/javascripts/grid_panel.js +438 -0
  50. data/lib/netzke/basepack/grid_panel/javascripts/misc.js +4 -0
  51. data/lib/netzke/basepack/grid_panel/javascripts/rows-dd.js +281 -0
  52. data/lib/netzke/basepack/grid_panel/record_form_window.rb +41 -0
  53. data/lib/netzke/basepack/grid_panel/services.rb +235 -0
  54. data/lib/netzke/basepack/paging_form_panel.rb +72 -0
  55. data/lib/netzke/basepack/paging_form_panel/javascripts/paging_form_panel.js +76 -0
  56. data/lib/netzke/basepack/panel.rb +11 -0
  57. data/lib/netzke/basepack/query_builder.rb +107 -0
  58. data/lib/netzke/basepack/query_builder/javascripts/query_builder.js +153 -0
  59. data/lib/netzke/basepack/search_panel.rb +79 -0
  60. data/lib/netzke/basepack/search_panel/javascripts/condition_field.js +160 -0
  61. data/lib/netzke/basepack/search_panel/javascripts/search_panel.js +65 -0
  62. data/lib/netzke/basepack/search_window.rb +66 -0
  63. data/lib/netzke/basepack/simple_app.rb +104 -0
  64. data/lib/netzke/basepack/simple_app/javascripts/simple_app.js +64 -0
  65. data/lib/netzke/basepack/simple_app/javascripts/statusbar_ext.js +8 -0
  66. data/lib/netzke/basepack/tab_panel.rb +21 -0
  67. data/lib/netzke/basepack/tab_panel/javascripts/tab_panel.js +11 -0
  68. data/lib/netzke/basepack/version.rb +11 -0
  69. data/lib/netzke/basepack/window.rb +29 -0
  70. data/lib/netzke/basepack/window/javascripts/window.js +20 -0
  71. data/lib/netzke/basepack/wrap_lazy_loaded.rb +28 -0
  72. data/lib/netzke/basepack/wrapper.rb +28 -0
  73. data/lib/netzke/data_mapper.rb +18 -0
  74. data/lib/netzke/data_mapper/attributes.rb +273 -0
  75. data/lib/netzke/data_mapper/combobox_options.rb +11 -0
  76. data/lib/netzke/data_mapper/relation_extensions.rb +38 -0
  77. data/lib/netzke/sequel.rb +18 -0
  78. data/lib/netzke/sequel/attributes.rb +274 -0
  79. data/lib/netzke/sequel/combobox_options.rb +10 -0
  80. data/lib/netzke/sequel/relation_extensions.rb +40 -0
  81. data/lib/tasks/netzke_basepack_tasks.rake +4 -0
  82. data/locales/de.yml +79 -0
  83. data/locales/en.yml +79 -0
  84. data/netzke-basepack.gemspec +306 -0
  85. data/stylesheets/basepack.css +72 -0
  86. data/stylesheets/datetimefield.css +54 -0
  87. data/test/basepack_test_app/.gitignore +6 -0
  88. data/test/basepack_test_app/.rvmrc +1 -0
  89. data/test/basepack_test_app/Gemfile +59 -0
  90. data/test/basepack_test_app/Gemfile.lock +196 -0
  91. data/test/basepack_test_app/Guardfile +46 -0
  92. data/test/basepack_test_app/README +1 -0
  93. data/test/basepack_test_app/Rakefile +7 -0
  94. data/test/basepack_test_app/app/components/author_form.rb +32 -0
  95. data/test/basepack_test_app/app/components/author_grid.rb +3 -0
  96. data/test/basepack_test_app/app/components/book_form.rb +38 -0
  97. data/test/basepack_test_app/app/components/book_form_with_custom_fields.rb +21 -0
  98. data/test/basepack_test_app/app/components/book_form_with_defaults.rb +8 -0
  99. data/test/basepack_test_app/app/components/book_form_with_nested_attributes.rb +18 -0
  100. data/test/basepack_test_app/app/components/book_grid.rb +12 -0
  101. data/test/basepack_test_app/app/components/book_grid_filtering.rb +10 -0
  102. data/test/basepack_test_app/app/components/book_grid_loader.rb +24 -0
  103. data/test/basepack_test_app/app/components/book_grid_with_column_actions.rb +15 -0
  104. data/test/basepack_test_app/app/components/book_grid_with_custom_columns.rb +27 -0
  105. data/test/basepack_test_app/app/components/book_grid_with_default_values.rb +9 -0
  106. data/test/basepack_test_app/app/components/book_grid_with_extra_feedback.rb +8 -0
  107. data/test/basepack_test_app/app/components/book_grid_with_extra_filters.rb +14 -0
  108. data/test/basepack_test_app/app/components/book_grid_with_nested_attributes.rb +13 -0
  109. data/test/basepack_test_app/app/components/book_grid_with_overridden_columns.rb +15 -0
  110. data/test/basepack_test_app/app/components/book_grid_with_paging.rb +10 -0
  111. data/test/basepack_test_app/app/components/book_grid_with_persistence.rb +8 -0
  112. data/test/basepack_test_app/app/components/book_grid_with_scoped_authors.rb +8 -0
  113. data/test/basepack_test_app/app/components/book_grid_with_virtual_attributes.rb +21 -0
  114. data/test/basepack_test_app/app/components/book_paging_form_panel.rb +22 -0
  115. data/test/basepack_test_app/app/components/book_query_builder.rb +8 -0
  116. data/test/basepack_test_app/app/components/book_search_panel.rb +5 -0
  117. data/test/basepack_test_app/app/components/book_search_panel/javascripts/i18n_de.js +6 -0
  118. data/test/basepack_test_app/app/components/book_with_custom_primary_key_grid.rb +10 -0
  119. data/test/basepack_test_app/app/components/books_bound_to_author.rb +10 -0
  120. data/test/basepack_test_app/app/components/double_book_grid.rb +18 -0
  121. data/test/basepack_test_app/app/components/extras/book_presentation.rb +27 -0
  122. data/test/basepack_test_app/app/components/form_without_model.rb +21 -0
  123. data/test/basepack_test_app/app/components/generic_user_form.rb +12 -0
  124. data/test/basepack_test_app/app/components/lockable_book_form.rb +17 -0
  125. data/test/basepack_test_app/app/components/lockable_user_form.rb +7 -0
  126. data/test/basepack_test_app/app/components/paging_form_with_search.rb +40 -0
  127. data/test/basepack_test_app/app/components/simple_accordion.rb +11 -0
  128. data/test/basepack_test_app/app/components/simple_panel.rb +17 -0
  129. data/test/basepack_test_app/app/components/simple_tab_panel.rb +11 -0
  130. data/test/basepack_test_app/app/components/simple_window.rb +10 -0
  131. data/test/basepack_test_app/app/components/simple_wrapper.rb +7 -0
  132. data/test/basepack_test_app/app/components/some_accordion_panel.rb +22 -0
  133. data/test/basepack_test_app/app/components/some_auth_app.rb +32 -0
  134. data/test/basepack_test_app/app/components/some_border_layout.rb +28 -0
  135. data/test/basepack_test_app/app/components/some_simple_app.rb +35 -0
  136. data/test/basepack_test_app/app/components/some_tab_panel.rb +20 -0
  137. data/test/basepack_test_app/app/components/user_form.rb +25 -0
  138. data/test/basepack_test_app/app/components/user_form_with_default_fields.rb +8 -0
  139. data/test/basepack_test_app/app/components/user_grid.rb +8 -0
  140. data/test/basepack_test_app/app/components/user_grid_with_customized_form_fields.rb +18 -0
  141. data/test/basepack_test_app/app/components/window_component_loader.rb +27 -0
  142. data/test/basepack_test_app/app/controllers/application_controller.rb +9 -0
  143. data/test/basepack_test_app/app/controllers/components_controller.rb +10 -0
  144. data/test/basepack_test_app/app/controllers/welcome_controller.rb +9 -0
  145. data/test/basepack_test_app/app/helpers/application_helper.rb +8 -0
  146. data/test/basepack_test_app/app/helpers/embedded_components_helper.rb +2 -0
  147. data/test/basepack_test_app/app/models/address.rb +29 -0
  148. data/test/basepack_test_app/app/models/author.rb +38 -0
  149. data/test/basepack_test_app/app/models/book.rb +49 -0
  150. data/test/basepack_test_app/app/models/book_with_custom_primary_key.rb +26 -0
  151. data/test/basepack_test_app/app/models/role.rb +24 -0
  152. data/test/basepack_test_app/app/models/user.rb +29 -0
  153. data/test/basepack_test_app/app/presenters/forms/generic_user.rb +6 -0
  154. data/test/basepack_test_app/app/views/components/loadable_window.html.erb +9 -0
  155. data/test/basepack_test_app/app/views/components/simple_panel.html.erb +1 -0
  156. data/test/basepack_test_app/app/views/layouts/application.html.erb +12 -0
  157. data/test/basepack_test_app/app/views/layouts/components.html.erb +13 -0
  158. data/test/basepack_test_app/app/views/layouts/nested.html.erb +5 -0
  159. data/test/basepack_test_app/app/views/welcome/index.html.erb +10 -0
  160. data/test/basepack_test_app/config.ru +4 -0
  161. data/test/basepack_test_app/config/application.rb +57 -0
  162. data/test/basepack_test_app/config/boot.rb +13 -0
  163. data/test/basepack_test_app/config/cucumber.yml +8 -0
  164. data/test/basepack_test_app/config/database.yml.sample +41 -0
  165. data/test/basepack_test_app/config/database.yml.travis +15 -0
  166. data/test/basepack_test_app/config/environment.rb +6 -0
  167. data/test/basepack_test_app/config/environments/development.rb +22 -0
  168. data/test/basepack_test_app/config/environments/production.rb +49 -0
  169. data/test/basepack_test_app/config/environments/test.rb +35 -0
  170. data/test/basepack_test_app/config/initializers/backtrace_silencers.rb +7 -0
  171. data/test/basepack_test_app/config/initializers/data_mapper_logging.rb +3 -0
  172. data/test/basepack_test_app/config/initializers/inflections.rb +10 -0
  173. data/test/basepack_test_app/config/initializers/mime_types.rb +5 -0
  174. data/test/basepack_test_app/config/initializers/netzke.rb +9 -0
  175. data/test/basepack_test_app/config/initializers/secret_token.rb +7 -0
  176. data/test/basepack_test_app/config/initializers/sequel.rb +26 -0
  177. data/test/basepack_test_app/config/initializers/session_store.rb +8 -0
  178. data/test/basepack_test_app/config/locales/de.yml +35 -0
  179. data/test/basepack_test_app/config/locales/es.yml +96 -0
  180. data/test/basepack_test_app/config/routes.rb +68 -0
  181. data/test/basepack_test_app/db/development_structure.sql +88 -0
  182. data/test/basepack_test_app/db/migrate/20100914104207_create_users.rb +15 -0
  183. data/test/basepack_test_app/db/migrate/20100914104236_create_roles.rb +13 -0
  184. data/test/basepack_test_app/db/migrate/20101026185816_create_authors.rb +14 -0
  185. data/test/basepack_test_app/db/migrate/20101026190021_create_books.rb +19 -0
  186. data/test/basepack_test_app/db/migrate/20110101143818_create_addresses.rb +17 -0
  187. data/test/basepack_test_app/db/migrate/20110213213050_create_netzke_component_states.rb +20 -0
  188. data/test/basepack_test_app/db/migrate/20110701070052_create_book_with_custom_primary_keys.rb +15 -0
  189. data/test/basepack_test_app/db/migrate/20110901114016_add_last_read_at_to_books.rb +9 -0
  190. data/test/basepack_test_app/db/migrate/20110909071740_add_published_on_to_books.rb +5 -0
  191. data/test/basepack_test_app/db/schema.rb +81 -0
  192. data/test/basepack_test_app/db/seeds.rb +44 -0
  193. data/test/basepack_test_app/features/accordion_panel.feature +12 -0
  194. data/test/basepack_test_app/features/components_in_view.feature +11 -0
  195. data/test/basepack_test_app/features/form_panel.feature +142 -0
  196. data/test/basepack_test_app/features/grid_panel.feature +277 -0
  197. data/test/basepack_test_app/features/grid_panel_filters.feature +73 -0
  198. data/test/basepack_test_app/features/grid_panel_with_custom_primary_key.feature +15 -0
  199. data/test/basepack_test_app/features/grid_sorting.feature +47 -0
  200. data/test/basepack_test_app/features/i18n.feature +18 -0
  201. data/test/basepack_test_app/features/nested_attributes.feature +26 -0
  202. data/test/basepack_test_app/features/paging_form_panel.feature +43 -0
  203. data/test/basepack_test_app/features/search_in_grid.feature +49 -0
  204. data/test/basepack_test_app/features/simple_app.feature +15 -0
  205. data/test/basepack_test_app/features/simple_panel.feature +11 -0
  206. data/test/basepack_test_app/features/step_definitions/accordion_steps.rb +5 -0
  207. data/test/basepack_test_app/features/step_definitions/ext_steps.rb +16 -0
  208. data/test/basepack_test_app/features/step_definitions/form_panel_steps.rb +46 -0
  209. data/test/basepack_test_app/features/step_definitions/generic_steps.rb +44 -0
  210. data/test/basepack_test_app/features/step_definitions/grid_panel_steps.rb +186 -0
  211. data/test/basepack_test_app/features/step_definitions/pickle_steps.rb +100 -0
  212. data/test/basepack_test_app/features/step_definitions/web_steps.rb +219 -0
  213. data/test/basepack_test_app/features/support/env.rb +81 -0
  214. data/test/basepack_test_app/features/support/paths.rb +65 -0
  215. data/test/basepack_test_app/features/support/pickle.rb +24 -0
  216. data/test/basepack_test_app/features/support/selectors.rb +39 -0
  217. data/test/basepack_test_app/features/tab_panel.feature +12 -0
  218. data/test/basepack_test_app/features/validations_in_grid.feature +13 -0
  219. data/test/basepack_test_app/features/virtual_attributes.feature +16 -0
  220. data/test/basepack_test_app/features/window.feature +11 -0
  221. data/test/basepack_test_app/lib/tasks/.gitkeep +0 -0
  222. data/test/basepack_test_app/lib/tasks/cucumber.rake +71 -0
  223. data/test/basepack_test_app/lib/tasks/travis.rake +7 -0
  224. data/test/basepack_test_app/public/404.html +26 -0
  225. data/test/basepack_test_app/public/422.html +26 -0
  226. data/test/basepack_test_app/public/500.html +26 -0
  227. data/test/basepack_test_app/public/favicon.ico +0 -0
  228. data/test/basepack_test_app/public/images/header-deco.gif +0 -0
  229. data/test/basepack_test_app/public/images/rails.png +0 -0
  230. data/test/basepack_test_app/public/javascripts/application.js +2 -0
  231. data/test/basepack_test_app/public/javascripts/controls.js +965 -0
  232. data/test/basepack_test_app/public/javascripts/dragdrop.js +974 -0
  233. data/test/basepack_test_app/public/javascripts/effects.js +1123 -0
  234. data/test/basepack_test_app/public/javascripts/prototype.js +6001 -0
  235. data/test/basepack_test_app/public/javascripts/rails.js +175 -0
  236. data/test/basepack_test_app/public/robots.txt +5 -0
  237. data/test/basepack_test_app/public/stylesheets/.gitkeep +0 -0
  238. data/test/basepack_test_app/script/cucumber +10 -0
  239. data/test/basepack_test_app/script/rails +6 -0
  240. data/test/basepack_test_app/spec/components/form_panel_spec.rb +53 -0
  241. data/test/basepack_test_app/spec/components/grid_panel_spec.rb +10 -0
  242. data/test/basepack_test_app/spec/data_adapter/adapter_spec.rb +68 -0
  243. data/test/basepack_test_app/spec/data_adapter/attributes_spec.rb +56 -0
  244. data/test/basepack_test_app/spec/data_adapter/relation_extensions_spec.rb +125 -0
  245. data/test/basepack_test_app/spec/factories.rb +28 -0
  246. data/test/basepack_test_app/spec/spec_helper.rb +39 -0
  247. data/test/basepack_test_app/test/performance/browsing_test.rb +9 -0
  248. data/test/basepack_test_app/test/test_helper.rb +13 -0
  249. data/test/basepack_test_app/vendor/plugins/.gitkeep +0 -0
  250. data/test/console_with_fixtures.rb +4 -0
  251. data/test/fixtures/books.yml +11 -0
  252. data/test/fixtures/categories.yml +7 -0
  253. data/test/fixtures/cities.yml +21 -0
  254. data/test/fixtures/continents.yml +7 -0
  255. data/test/fixtures/countries.yml +9 -0
  256. data/test/fixtures/genres.yml +9 -0
  257. data/test/fixtures/roles.yml +8 -0
  258. data/test/fixtures/users.yml +11 -0
  259. data/test/schema.rb +10 -0
  260. data/test/test_helper.rb +21 -0
  261. data/test/unit/accordion_panel_test.rb +20 -0
  262. data/test/unit/active_record_basepack_test.rb +54 -0
  263. data/test/unit/fields_configuration_test.rb +18 -0
  264. data/test/unit/grid_panel_test.rb +52 -0
  265. data/test/unit/netzke_basepack_test.rb +4 -0
  266. data/test/unit/tab_panel_test.rb +21 -0
  267. data/uninstall.rb +1 -0
  268. 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,11 @@
1
+ module Netzke
2
+ module Basepack
3
+ class Panel < Netzke::Base
4
+ js_method :update_body_html, <<-JS
5
+ function(html){
6
+ this.body.update(html);
7
+ }
8
+ JS
9
+ end
10
+ end
11
+ end
@@ -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