netzke-basepack 0.7.7 → 0.8.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 (192) hide show
  1. data/.travis.yml +15 -10
  2. data/{CHANGELOG.rdoc → CHANGELOG.md} +146 -110
  3. data/LICENSE +7 -1
  4. data/README.md +47 -56
  5. data/Rakefile +5 -5
  6. data/config/before-travis.sh +10 -0
  7. data/javascripts/basepack.js +0 -130
  8. data/javascripts/netzkeremotecombo.js +59 -0
  9. data/lib/netzke/basepack.rb +9 -14
  10. data/lib/netzke/basepack/accordion.rb +45 -0
  11. data/lib/netzke/basepack/active_record.rb +12 -0
  12. data/lib/netzke/basepack/active_record/relation_extensions.rb +27 -0
  13. data/lib/netzke/basepack/columns.rb +309 -0
  14. data/lib/netzke/basepack/data_accessor.rb +22 -12
  15. data/lib/netzke/basepack/data_adapters/abstract_adapter.rb +75 -11
  16. data/lib/netzke/basepack/data_adapters/active_record_adapter.rb +154 -49
  17. data/lib/netzke/basepack/fields.rb +162 -0
  18. data/lib/netzke/basepack/form.rb +136 -0
  19. data/lib/netzke/basepack/{form_panel → form}/javascripts/comma_list_cbg.js +0 -1
  20. data/lib/netzke/basepack/{form_panel/javascripts/form_panel.js → form/javascripts/form.js} +20 -26
  21. data/lib/netzke/basepack/{form_panel → form}/javascripts/n_radio_group.js +0 -1
  22. data/lib/netzke/basepack/{form_panel → form}/javascripts/readonly_mode.js +0 -0
  23. data/lib/netzke/basepack/form/services.rb +115 -0
  24. data/lib/netzke/basepack/{form_panel → form}/stylesheets/readonly_mode.css +0 -0
  25. data/lib/netzke/basepack/grid.rb +355 -0
  26. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/advanced_search.js +1 -1
  27. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/check_column_fix.js +0 -0
  28. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/edit_in_form.js +3 -3
  29. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/event_handling.js +5 -2
  30. data/lib/netzke/basepack/{grid_panel/javascripts/grid_panel.js → grid/javascripts/grid.js} +120 -132
  31. data/lib/netzke/basepack/{grid_panel → grid}/javascripts/misc.js +0 -0
  32. data/lib/netzke/basepack/grid/services.rb +216 -0
  33. data/lib/netzke/basepack/item_persistence.rb +44 -0
  34. data/lib/netzke/basepack/item_persistence/events_plugin.rb +47 -0
  35. data/lib/netzke/basepack/{paging_form_panel.rb → paging_form.rb} +24 -30
  36. data/lib/netzke/basepack/{paging_form_panel/javascripts/paging_form_panel.js → paging_form/javascripts/paging_form.js} +2 -4
  37. data/lib/netzke/basepack/query_builder.rb +44 -73
  38. data/lib/netzke/basepack/query_builder/javascripts/query_builder.js +16 -2
  39. data/lib/netzke/basepack/record_form_window.rb +67 -0
  40. data/lib/netzke/basepack/search_panel.rb +22 -24
  41. data/lib/netzke/basepack/search_panel/javascripts/condition_field.js +2 -2
  42. data/lib/netzke/basepack/search_window.rb +47 -53
  43. data/lib/netzke/basepack/simple_app.rb +10 -13
  44. data/lib/netzke/basepack/simple_app/javascripts/simple_app.js +2 -8
  45. data/lib/netzke/basepack/tab_panel.rb +5 -4
  46. data/lib/netzke/basepack/tab_panel/javascripts/tab_panel.js +5 -5
  47. data/lib/netzke/basepack/version.rb +2 -2
  48. data/lib/netzke/basepack/viewport.rb +16 -0
  49. data/lib/netzke/basepack/window.rb +27 -18
  50. data/lib/netzke/basepack/window/javascripts/window.js +7 -1
  51. data/lib/netzke/basepack/wrap_lazy_loaded.rb +18 -18
  52. data/locales/en.yml +40 -24
  53. data/netzke-basepack.gemspec +51 -82
  54. data/stylesheets/basepack.css +0 -41
  55. data/test/basepack_test_app/Gemfile +9 -46
  56. data/test/basepack_test_app/Gemfile.lock +61 -96
  57. data/test/basepack_test_app/app/components/author_form.rb +8 -5
  58. data/test/basepack_test_app/app/components/author_grid.rb +2 -2
  59. data/test/basepack_test_app/app/components/book_form.rb +34 -31
  60. data/test/basepack_test_app/app/components/book_form_with_defaults.rb +6 -7
  61. data/test/basepack_test_app/app/components/book_form_with_file_upload.rb +10 -0
  62. data/test/basepack_test_app/app/components/book_form_with_nested_attributes.rb +5 -6
  63. data/test/basepack_test_app/app/components/book_grid.rb +19 -8
  64. data/test/basepack_test_app/app/components/book_grid_filtering.rb +4 -7
  65. data/test/basepack_test_app/app/components/book_grid_loader.rb +28 -15
  66. data/test/basepack_test_app/app/components/book_grid_with_custom_columns.rb +45 -21
  67. data/test/basepack_test_app/app/components/book_grid_with_default_values.rb +26 -8
  68. data/test/basepack_test_app/app/components/book_grid_with_excluded_columns.rb +11 -0
  69. data/test/basepack_test_app/app/components/book_grid_with_extra_feedback.rb +2 -2
  70. data/test/basepack_test_app/app/components/book_grid_with_extra_filters.rb +7 -6
  71. data/test/basepack_test_app/app/components/book_grid_with_mass_assignment_security.rb +9 -0
  72. data/test/basepack_test_app/app/components/book_grid_with_nested_attributes.rb +9 -9
  73. data/test/basepack_test_app/app/components/book_grid_with_overridden_columns.rb +5 -3
  74. data/test/basepack_test_app/app/components/book_grid_with_paging.rb +6 -8
  75. data/test/basepack_test_app/app/components/book_grid_with_persistence.rb +6 -4
  76. data/test/basepack_test_app/app/components/book_grid_with_scope.rb +6 -0
  77. data/test/basepack_test_app/app/components/book_grid_with_scoped_authors.rb +10 -7
  78. data/test/basepack_test_app/app/components/book_grid_with_virtual_attributes.rb +21 -13
  79. data/test/basepack_test_app/app/components/book_paging_form.rb +21 -0
  80. data/test/basepack_test_app/app/components/book_query_builder.rb +7 -6
  81. data/test/basepack_test_app/app/components/book_with_custom_primary_key_grid.rb +6 -7
  82. data/test/basepack_test_app/app/components/books_bound_to_author.rb +9 -7
  83. data/test/basepack_test_app/app/components/border_layout_panel_with_persistence.rb +12 -0
  84. data/test/basepack_test_app/app/components/double_book_grid.rb +19 -14
  85. data/test/basepack_test_app/app/components/form_without_model.rb +15 -16
  86. data/test/basepack_test_app/app/components/grid_with_initial_sorting.rb +7 -0
  87. data/test/basepack_test_app/app/components/grid_with_inline_data.rb +7 -0
  88. data/test/basepack_test_app/app/components/paging_form_with_search.rb +2 -2
  89. data/test/basepack_test_app/app/components/panel_with_persistent_regions.rb +35 -0
  90. data/test/basepack_test_app/app/components/query_builder.rb +7 -0
  91. data/test/basepack_test_app/app/components/simple_panel.rb +16 -11
  92. data/test/basepack_test_app/app/components/simple_window.rb +7 -6
  93. data/test/basepack_test_app/app/components/some_accordion.rb +18 -0
  94. data/test/basepack_test_app/app/components/some_auth_app.rb +5 -5
  95. data/test/basepack_test_app/app/components/some_border_layout.rb +20 -20
  96. data/test/basepack_test_app/app/components/some_search_panel.rb +6 -0
  97. data/test/basepack_test_app/app/components/some_simple_app.rb +30 -16
  98. data/test/basepack_test_app/app/components/some_tab_panel.rb +18 -15
  99. data/test/basepack_test_app/app/components/user_form.rb +18 -16
  100. data/test/basepack_test_app/app/components/user_form_with_default_fields.rb +5 -6
  101. data/test/basepack_test_app/app/components/user_grid.rb +11 -6
  102. data/test/basepack_test_app/app/components/user_grid_with_customized_form_fields.rb +5 -3
  103. data/test/basepack_test_app/app/components/window_component_loader.rb +25 -21
  104. data/test/basepack_test_app/app/models/address.rb +0 -26
  105. data/test/basepack_test_app/app/models/author.rb +0 -31
  106. data/test/basepack_test_app/app/models/book.rb +1 -42
  107. data/test/basepack_test_app/app/models/book_with_custom_primary_key.rb +1 -23
  108. data/test/basepack_test_app/app/models/role.rb +0 -21
  109. data/test/basepack_test_app/app/models/user.rb +0 -24
  110. data/test/basepack_test_app/app/views/layouts/components.html.erb +1 -1
  111. data/test/basepack_test_app/config/application.rb +1 -1
  112. data/test/basepack_test_app/config/database.yml.travis +2 -6
  113. data/test/basepack_test_app/config/initializers/netzke.rb +1 -6
  114. data/test/basepack_test_app/db/schema.rb +14 -14
  115. data/test/basepack_test_app/features/accordion_panel.feature +2 -2
  116. data/test/basepack_test_app/features/form_panel.feature +7 -7
  117. data/test/basepack_test_app/features/grid_panel.feature +93 -39
  118. data/test/basepack_test_app/features/grid_panel_with_custom_primary_key.feature +2 -1
  119. data/test/basepack_test_app/features/grid_sorting.feature +30 -6
  120. data/test/basepack_test_app/features/paging_form_panel.feature +7 -7
  121. data/test/basepack_test_app/features/persistent_regions.feature +30 -0
  122. data/test/basepack_test_app/features/search_in_grid.feature +5 -5
  123. data/test/basepack_test_app/features/simple_app.feature +6 -7
  124. data/test/basepack_test_app/features/step_definitions/form_panel_steps.rb +1 -1
  125. data/test/basepack_test_app/features/step_definitions/generic_steps.rb +109 -4
  126. data/test/basepack_test_app/features/step_definitions/grid_panel_steps.rb +8 -10
  127. data/test/basepack_test_app/features/step_definitions/window_steps.rb +27 -0
  128. data/test/basepack_test_app/features/tab_panel.feature +1 -1
  129. data/test/basepack_test_app/features/window.feature +17 -0
  130. data/test/unit/accordion_panel_test.rb +2 -2
  131. data/test/unit/grid_panel_test.rb +4 -4
  132. metadata +57 -83
  133. data/TODO.rdoc +0 -8
  134. data/lib/generators/netzke/basepack_generator.rb +0 -10
  135. data/lib/generators/netzke/templates/assets/ts-checkbox.gif +0 -0
  136. data/lib/generators/netzke/templates/create_netzke_field_lists.rb +0 -18
  137. data/lib/netzke/active_record.rb +0 -20
  138. data/lib/netzke/active_record/attributes.rb +0 -259
  139. data/lib/netzke/active_record/combobox_options.rb +0 -16
  140. data/lib/netzke/active_record/relation_extensions.rb +0 -37
  141. data/lib/netzke/basepack/accordion_panel.rb +0 -39
  142. data/lib/netzke/basepack/action_column.rb +0 -68
  143. data/lib/netzke/basepack/action_column/javascripts/action_column.js +0 -61
  144. data/lib/netzke/basepack/auth_app.rb +0 -159
  145. data/lib/netzke/basepack/basic_app.rb +0 -7
  146. data/lib/netzke/basepack/border_layout_panel.rb +0 -53
  147. data/lib/netzke/basepack/border_layout_panel/javascripts/border_layout_panel.js +0 -40
  148. data/lib/netzke/basepack/data_adapters/data_mapper_adapter.rb +0 -264
  149. data/lib/netzke/basepack/data_adapters/sequel_adapter.rb +0 -260
  150. data/lib/netzke/basepack/form_panel.rb +0 -144
  151. data/lib/netzke/basepack/form_panel/fields.rb +0 -208
  152. data/lib/netzke/basepack/form_panel/javascripts/misc.js +0 -4
  153. data/lib/netzke/basepack/form_panel/services.rb +0 -142
  154. data/lib/netzke/basepack/grid_panel.rb +0 -441
  155. data/lib/netzke/basepack/grid_panel/columns.rb +0 -400
  156. data/lib/netzke/basepack/grid_panel/javascripts/rows-dd.js +0 -281
  157. data/lib/netzke/basepack/grid_panel/record_form_window.rb +0 -41
  158. data/lib/netzke/basepack/grid_panel/services.rb +0 -235
  159. data/lib/netzke/basepack/panel.rb +0 -11
  160. data/lib/netzke/basepack/wrapper.rb +0 -28
  161. data/lib/netzke/data_mapper.rb +0 -18
  162. data/lib/netzke/data_mapper/attributes.rb +0 -273
  163. data/lib/netzke/data_mapper/combobox_options.rb +0 -11
  164. data/lib/netzke/data_mapper/relation_extensions.rb +0 -38
  165. data/lib/netzke/sequel.rb +0 -18
  166. data/lib/netzke/sequel/attributes.rb +0 -274
  167. data/lib/netzke/sequel/combobox_options.rb +0 -10
  168. data/lib/netzke/sequel/relation_extensions.rb +0 -40
  169. data/locales/zh-cn.yml +0 -79
  170. data/test/basepack_test_app/app/components/book_form_with_custom_fields.rb +0 -21
  171. data/test/basepack_test_app/app/components/book_grid_with_column_actions.rb +0 -15
  172. data/test/basepack_test_app/app/components/book_grid_with_defaults.rb +0 -6
  173. data/test/basepack_test_app/app/components/book_paging_form_panel.rb +0 -22
  174. data/test/basepack_test_app/app/components/generic_user_form.rb +0 -12
  175. data/test/basepack_test_app/app/components/simple_accordion.rb +0 -11
  176. data/test/basepack_test_app/app/components/simple_tab_panel.rb +0 -11
  177. data/test/basepack_test_app/app/components/simple_wrapper.rb +0 -7
  178. data/test/basepack_test_app/app/components/some_accordion_panel.rb +0 -22
  179. data/test/basepack_test_app/app/presenters/forms/generic_user.rb +0 -6
  180. data/test/basepack_test_app/app/views/components/loadable_window.html.erb +0 -9
  181. data/test/basepack_test_app/app/views/components/simple_panel.html.erb +0 -1
  182. data/test/basepack_test_app/features/components_in_view.feature +0 -11
  183. data/test/basepack_test_app/features/simple_panel.feature +0 -11
  184. data/test/basepack_test_app/features/validations_in_grid.feature +0 -13
  185. data/test/basepack_test_app/features/virtual_attributes.feature +0 -16
  186. data/test/basepack_test_app/spec/components/form_panel_spec.rb +0 -53
  187. data/test/basepack_test_app/spec/components/grid_panel_spec.rb +0 -10
  188. data/test/basepack_test_app/spec/data_adapter/adapter_spec.rb +0 -68
  189. data/test/basepack_test_app/spec/data_adapter/attributes_spec.rb +0 -56
  190. data/test/basepack_test_app/spec/data_adapter/relation_extensions_spec.rb +0 -125
  191. data/test/basepack_test_app/spec/factories.rb +0 -28
  192. data/test/basepack_test_app/spec/spec_helper.rb +0 -39
@@ -1,61 +0,0 @@
1
- Ext.define('Ext.grid.column.NetzkeAction', {
2
- extend: 'Ext.grid.column.Action',
3
- alias: ['widget.netzkeactioncolumn'],
4
-
5
- constructor: function(config) {
6
- var me = this,
7
- cfg = Ext.apply({}, config),
8
- i,
9
- item;
10
-
11
- me.callParent([cfg]);
12
-
13
- me.renderer = function(actions, meta) {
14
- // previous renderer
15
- var v = Ext.isFunction(cfg.renderer) ? cfg.renderer.apply(this, arguments)||'' : '',
16
- actions = Ext.decode(actions),
17
- l = actions.length,
18
- action;
19
-
20
- meta.tdCls += ' ' + Ext.baseCSSPrefix + 'action-col-cell';
21
-
22
- for (i = 0; i < l; i++) {
23
- action = actions[i];
24
- if (!action.hidden) {
25
- v += '<img alt="' + (action.altText || me.altText) + '" src="' + (action.icon || Ext.BLANK_IMAGE_URL) +
26
- '" class="' + Ext.baseCSSPrefix + 'action-col-icon ' + Ext.baseCSSPrefix + 'action-col-' + String(i) + ' ' + (action.iconCls || '') +
27
- ' ' + (Ext.isFunction(action.getClass) ? action.getClass.apply(action.scope||me.scope||me, arguments) : (me.iconCls || '')) + '"' +
28
- ((action.tooltip) ? ' data-qtip="' + action.tooltip + '"' : '') +
29
- ' data-name="' + action.name + '"' +
30
- ((action.handler) ? ' data-handler="' + action.handler + '"' : '') + ' />';
31
- }
32
- }
33
-
34
- return v;
35
- };
36
- },
37
-
38
- processEvent : function(type, view, cell, recordIndex, cellIndex, e){
39
- var me = this,
40
- target = e.getTarget(),
41
- match = target.className.match("x-action-col-icon"),
42
- fn, grid, record;
43
- if (match) {
44
- if (type == 'click') {
45
- grid = me.ownerCt.ownerCt;
46
- fn = (target.getAttribute("data-handler") || "").camelize(true);
47
- fn = Ext.isFunction(grid[fn]) ? grid[fn] : undefined;
48
- // if (fn) fn.call(grid, view, recordIndex, cellIndex, target, e);
49
- if (fn) {
50
- record = grid.getStore().getAt(recordIndex);
51
- fn.call(grid, record, target, e);
52
- } else {
53
- Netzke.warning("Undefined handler for column action '" + target.getAttribute("data-name") + "'");
54
- }
55
- } else if (type == 'mousedown') {
56
- return false;
57
- }
58
- }
59
- return me.callParent(arguments);
60
- }
61
- });
@@ -1,159 +0,0 @@
1
- module Netzke
2
- module Basepack
3
- # Extension to SimpleApp that brings in support for authentication and masquerading
4
- # ** NOTE: it's WIP **
5
- class AuthApp < SimpleApp
6
-
7
- def default_config
8
- super.tap do |c|
9
- c[:login_url] = "/login"
10
- c[:logout_url] = "/logout"
11
- end
12
- end
13
-
14
- # class_config_option :login_url, "/login"
15
- # # self.login_url = "/login"
16
- #
17
- # class_attribute :logout_url
18
- # self.logout_url = "/logout"
19
-
20
- js_method :on_login, <<-JS
21
- function(){
22
- window.location = this.loginUrl;
23
- }
24
- JS
25
-
26
- js_method :on_logout, <<-JS
27
- function(){
28
- window.location = this.logoutUrl;
29
- }
30
- JS
31
-
32
- js_method :on_toggle_config_mode, <<-JS
33
- function(params){
34
- this.toggleConfigMode();
35
- }
36
- JS
37
- # WIP: todo - rewrite Ext.lib calls below
38
- js_method :show_masquerade_selector, <<-JS
39
- function(){
40
- var w = new Ext.Window({
41
- title: 'Masquerade as',
42
- modal: true,
43
- width: Ext.lib.Dom.getViewWidth() * 0.6,
44
- height: Ext.lib.Dom.getViewHeight() * 0.6,
45
- layout: 'fit',
46
- closeAction :'destroy',
47
- buttons: [{
48
- text: 'Select',
49
- handler : function(){
50
- if (role = w.getNetzkeComponent().masquerade.role) {
51
- 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){
52
- if (btn === 'yes') {
53
- w.close();
54
- }
55
- });
56
- } else {
57
- w.close();
58
- }
59
- },
60
- scope:this
61
- },{
62
- text:'As World',
63
- handler:function(){
64
- 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){
65
- if (btn === "yes") {
66
- this.masquerade = {world:true};
67
- w.close();
68
- }
69
- }, this);
70
- },
71
- scope:this
72
- },{
73
- text:'No masquerading',
74
- handler:function(){
75
- this.masquerade = {};
76
- w.close();
77
- },
78
- scope:this
79
- },{
80
- text:'Cancel',
81
- handler:function(){
82
- w.hide();
83
- },
84
- scope:this
85
- }],
86
- listeners : {close: {fn: function(){
87
- this.masqueradeAs(this.masquerade || w.getNetzkeComponent().masquerade || {});
88
- }, scope: this}}
89
- });
90
-
91
- w.show(null, function(){
92
- this.loadNetzkeComponent({id:"masqueradeSelector", container:w.id})
93
- }, this);
94
-
95
- }
96
- JS
97
-
98
- # Set the Logout button if Netzke::Core.current_user is set
99
- def menu
100
- [].tap do |menu|
101
- user = Netzke::Core.current_user
102
- if !user.nil?
103
- user_name = user.respond_to?(:name) ? user.name : user.email # try to display user's name, fallback to email
104
- menu << "->" <<
105
- {
106
- :text => user_name,
107
- :menu => user_menu
108
- }
109
- else
110
- menu << "->" << :login.action
111
- end
112
- end
113
- end
114
-
115
- def user_menu
116
- [:logout.action]
117
- end
118
-
119
- def initialize(*args)
120
- super
121
-
122
- if session[:netzke_just_logged_in] || session[:netzke_just_logged_out]
123
- session[:config_mode] = false
124
- session[:masq_world] = session[:masq_user] = session[:masq_roles] = nil
125
- end
126
-
127
- strong_children_config.deep_merge!(:mode => :config) if session[:config_mode]
128
- end
129
-
130
- action :masquerade_selector, :text => "Masquerade as ...", :handler => :show_masquerade_selector
131
-
132
- action :toggle_config_mode do
133
- {:text => "#{session[:config_mode] ? "Leave" : "Enter"} config mode"}
134
- end
135
-
136
- action :login, :icon => :door_in
137
-
138
- action :logout, :icon => :door_out
139
-
140
- #
141
- # Interface section
142
- #
143
- endpoint :toggle_config_mode do |params|
144
- session = Netzke::Base.session
145
- session[:config_mode] = !session[:config_mode]
146
- {:js => "window.location.reload();"}
147
- end
148
-
149
- endpoint :masquerade_as do |params|
150
- session = Netzke::Base.session
151
- session[:masq_world] = params[:world] == "true"
152
- session[:masq_role] = params[:role].try(:to_i)
153
- session[:masq_user] = params[:user].try(:to_i)
154
- {:js => "window.location.reload();"}
155
- end
156
-
157
- end
158
- end
159
- end
@@ -1,7 +0,0 @@
1
- module Netzke
2
- module Basepack
3
- # For backward compatibility only. Use AuthApp instead.
4
- class BasicApp < AuthApp
5
- end
6
- end
7
- end
@@ -1,53 +0,0 @@
1
- module Netzke
2
- module Basepack
3
- # Panel with border layout.
4
- #
5
- # == Features
6
- # * When persistence enabled, remembers the sizes and collapsed/expanded states of its regions.
7
- #
8
- # == Example configuration:
9
- #
10
- # :items => [
11
- # {:title => "Item One", :class_name => "Basepack::Panel", :region => :center},
12
- # {:title => "Item Two", :class_name => "Basepack::Panel", :region => :west, :width => 300, :split => true}
13
- # ]
14
- class BorderLayoutPanel < Netzke::Base
15
- js_mixin :border_layout_panel
16
-
17
- def items
18
- @border_layout_items ||= begin
19
- updated_items = super
20
-
21
- if config[:persistence]
22
- updated_items.each do |item|
23
- region = item[:region] || components[item[:netzke_component]][:region]
24
- item.merge!({
25
- :width => state[:"#{region}_region_width"],
26
- :height => state[:"#{region}_region_height"],
27
- :collapsed => state[:"#{region}_region_collapsed"]
28
- })
29
- end
30
- end
31
-
32
- updated_items
33
- end
34
- end
35
-
36
- endpoint :region_resized do |params|
37
- size_state_hash = {}
38
- size_state_hash[:"#{params[:region]}_region_width"] = params[:width].to_i if params[:width]
39
- size_state_hash[:"#{params[:region]}_region_height"] = params[:height].to_i if params[:height]
40
- update_state(size_state_hash)
41
- end
42
-
43
- endpoint :region_collapsed do |params|
44
- update_state(:"#{params[:region]}_region_collapsed" => true)
45
- end
46
-
47
- endpoint :region_expanded do |params|
48
- update_state(:"#{params[:region]}_region_collapsed" => false)
49
- end
50
-
51
- end
52
- end
53
- end
@@ -1,40 +0,0 @@
1
- {
2
- layout: 'border',
3
-
4
- initComponent: function(){
5
- this.callParent();
6
-
7
- // First time on "afterlayout", set resize events
8
- if (this.persistence) {this.on('afterlayout', this.setRegionEvents, this, {single: true});}
9
- },
10
-
11
- setRegionEvents: function(){
12
- this.items.each(function(item, index, length){
13
- if (!item.oldSize) item.oldSize = item.getSize(); // remember initial size
14
-
15
- item.on('resize', function(panel, w, h){
16
- if (panel.region !== 'center' && w && h) {
17
- var params = {region:panel.region};
18
-
19
- if (panel.oldSize.width != w) {
20
- params.width = w;
21
- } else {
22
- params.height = h;
23
- }
24
-
25
- panel.oldSize = panel.getSize();
26
- this.regionResized(params);
27
- }
28
- }, this);
29
-
30
- item.on('collapse', function(panel){
31
- this.regionCollapsed({region: panel.region});
32
- }, this);
33
-
34
- item.on('expand', function(panel){
35
- this.regionExpanded({region: panel.region});
36
- }, this);
37
-
38
- }, this);
39
- }
40
- }
@@ -1,264 +0,0 @@
1
- module Netzke::Basepack::DataAdapters
2
- class DataMapperAdapter < AbstractAdapter
3
- def self.for_class?(model_class)
4
- model_class <= DataMapper::Resource
5
- end
6
-
7
- def get_records(params, columns=[])
8
- search_query = @model_class
9
-
10
- # used for specifying models to join (for ordering and column selection)
11
- links = []
12
- # join association models into query if they are specified in query
13
- # NOTE: AFAIK, in DataMapper there is no possibility to do
14
- # OUTER JOINs, and inner join is not correct if a foreign key is
15
- # nullable, so we don't join at all and instead rely on strategic
16
- # eager loading.
17
-
18
- #columns.each do |column|
19
- #if column[:name].index('__')
20
- #assoc, _ = column[:name].split('__')
21
- #link = @model_class.relationships[assoc.to_sym].inverse
22
- #links << link unless links.include? link
23
- #end
24
- #end
25
-
26
- # apply filter
27
- search_query = apply_column_filters search_query, params[:filter] if params[:filter]
28
- query_options = {}
29
-
30
- # apply sorting
31
- if params[:sort] && sort_params = params[:sort]
32
- order = []
33
- sort_params.each do |sort_param|
34
- assoc, method = sort_param["property"].split("__")
35
- dir = sort_param["direction"].downcase
36
-
37
- # if a sorting scope is set, call the scope with the given direction
38
- column = columns.detect { |c| c[:name] == sort_param["property"] }
39
- if column.try(:'has_key?', :sorting_scope)
40
- search_query = search_query.send(column[:sorting_scope].to_sym, dir.to_sym)
41
- else
42
- if method
43
- order << @model_class.send(assoc).send(method).send(dir)
44
- link = @model_class.relationships[assoc.to_sym].inverse
45
- links << link unless links.include? link
46
- else
47
- order << assoc.to_sym.send(dir)
48
- end
49
- end
50
- end
51
- query_options[:order] = order unless order.empty?
52
- query_options[:links] = links unless links.empty?
53
- end
54
-
55
- # apply paging
56
- query_options[:limit]=params[:limit] if params[:limit]
57
- query_options[:offset]=params[:start] if params[:start]
58
-
59
- # apply scope
60
- search_query = search_query.extend_with(params[:scope]) if params[:scope]
61
-
62
- search_query.all(query_options)
63
- end
64
-
65
- def count_records(params, columns=[])
66
- # delete pagig related params, as this would break the query
67
- params=params.reject { |k, v|
68
- [:start, :limit, :page].include? k.to_sym
69
- }
70
- # this will NOT do a SELECT *, but a SELECT COUNT(*)
71
- get_records(params, columns).count
72
- end
73
-
74
- def map_type type
75
- @typemap ||= {
76
- DataMapper::Property::Integer => :integer,
77
- DataMapper::Property::Serial => :integer,
78
- DataMapper::Property::Boolean => :boolean,
79
- DataMapper::Property::Date => :date,
80
- DataMapper::Property::DateTime => :datetime,
81
- DataMapper::Property::Time => :time,
82
- DataMapper::Property::String => :string,
83
- DataMapper::Property::Text => :text
84
- }
85
- @typemap[type]
86
- end
87
-
88
- def get_assoc_property_type assoc_name, prop_name
89
- assoc = @model_class.send(assoc_name)
90
- # prop_name could be a virtual column, check it first, return nil in this case
91
- assoc.respond_to?(prop_name) ? map_type(assoc.send(prop_name).property.class) : nil
92
- end
93
-
94
- # like get_assoc_property_type but for non-association columns
95
- def get_property_type column
96
- map_type(column.class)
97
- end
98
-
99
- def column_virtual? c
100
- assoc_name, assoc_method = c[:name].split '__'
101
- if assoc_method
102
- column_names=@model_class.send(assoc_name).model.column_names
103
- column_name=assoc_method
104
- else
105
- column_names=@model_class.column_names
106
- column_name=c[:name]
107
- end
108
- !column_names.include? column_name
109
- end
110
-
111
- # Returns options for comboboxes in grids/forms
112
- def combobox_options_for_column(column, method_options = {})
113
- query = method_options[:query]
114
-
115
- # First, check if we have options for this column defined in persistent storage
116
- options = column[:combobox_options] && column[:combobox_options].split("\n")
117
- if options
118
- query ? options.select{ |o| o.index(/^#{query}/) }.map{ |el| [el] } : options
119
- else
120
- assoc_name, assoc_method = column[:name].split '__'
121
-
122
- if assoc_name
123
- # Options for an asssociation attribute
124
- relation = @model_class.send(assoc_name).model
125
-
126
- relation = relation.extend_with(method_options[:scope]) if method_options[:scope]
127
-
128
- if class_for(assoc_name).column_names.include?(assoc_method)
129
- # apply query
130
- relation = relation.all(assoc_method.to_sym.send(:like) => "%#{query}%") if query.present?
131
- relation.all.map{ |r| [r.id, r.send(assoc_method)] }
132
- else
133
- relation.all.map{ |r| [r.id, r.send(assoc_method)] }.select{ |id,value| value =~ /^#{query}/ }
134
- end
135
- else
136
- # Options for a non-association attribute
137
- res=@model_class.netzke_combo_options_for(column[:name], method_options)
138
-
139
- # ensure it is an array-in-array, as Ext will fail otherwise
140
- raise RuntimeError, "netzke_combo_options_for should return an Array" unless res.kind_of? Array
141
- return [[]] if res.empty?
142
-
143
- unless res.first.kind_of? Array
144
- res=res.map do |v|
145
- [v]
146
- end
147
- end
148
- return res
149
- end
150
- end
151
- end
152
-
153
- def foreign_key_for assoc_name
154
- @model_class.relationships[assoc_name].child_key.first.name.to_s
155
- end
156
-
157
- # Returns the model class for an association
158
- def class_for assoc_name
159
- @model_class.send(assoc_name).model
160
- end
161
-
162
- def destroy(ids)
163
- @model_class.all(:id => ids).destroy
164
- end
165
-
166
- def find_record(id)
167
- @model_class.get(id)
168
- end
169
-
170
- # Build a hash of foreign keys and the associated model
171
- def hash_fk_model
172
- @model_class.relationships.inject({}) do |foreign_keys, rel|
173
- if rel.kind_of? DataMapper::Associations::ManyToOne::Relationship
174
- foreign_keys[rel.child_key.first.name]=rel.parent_model.to_s.downcase.to_sym
175
- foreign_keys
176
- end
177
- end || {}
178
- end
179
-
180
- def move_records(params)
181
- @model_class.all(:id => params[:ids]).each_with_index do |item, index|
182
- item.move(:to => params[:new_index] + index)
183
- end
184
- end
185
-
186
- # give the data adapter the opporunity to process error messages
187
- # must return an raay of the form ["Title can't be blank", "Foo can't be blank"]
188
- def errors_array(record)
189
- record.errors.to_a.flatten
190
- end
191
-
192
- # Needed for seed and tests
193
- def last
194
- @model_class.last
195
- end
196
-
197
- def destroy_all
198
- @model_class.all.destroy
199
- end
200
-
201
- private
202
-
203
- # Parses and applies grid column filters
204
- #
205
- # Example column grid data:
206
- #
207
- # {"0" => {
208
- # "data" => {
209
- # "type" => "numeric",
210
- # "comparison" => "gt",
211
- # "value" => 10 },
212
- # "field" => "id"
213
- # },
214
- # "1" => {
215
- # "data" => {
216
- # "type" => "string",
217
- # "value" => "pizza"
218
- # },
219
- # "field" => "food_name"
220
- # }}
221
- #
222
- # This will result in:
223
- # Clazz.get(:id => 10, :food_name.like => "%pizza")
224
- def apply_column_filters(relation, column_filter)
225
- # these are still JSON-encoded due to the migration to Ext.direct
226
- column_filter=JSON.parse(column_filter)
227
-
228
- conditions = {}
229
- column_filter.each do |v|
230
- assoc, method = v["field"].split('__')
231
- if method
232
- query_path = relation.send(assoc).send(method) # Book.athor.last_name.like
233
- else
234
- query_path = assoc.to_sym # :last_name.like
235
- end
236
-
237
- value = v["value"]
238
- type = v["type"]
239
- case v["comparison"]
240
- when "lt"
241
- query_path=query_path.lt if ["date","numeric"].include? type
242
- when "gt"
243
- query_path=query_path.gt if ["date","numeric"].include? type
244
- else
245
- query_path=query_path.like if type == "string"
246
- end
247
-
248
- case type
249
- when "string"
250
- conditions[query_path]="%#{value}%"
251
- when "date"
252
- # convert value to the DB date
253
- value.match /(\d\d)\/(\d\d)\/(\d\d\d\d)/
254
- conditions[query_path]="#{$3}-#{$1}-#{$2}"
255
- else
256
- conditions[query_path]=value
257
- end
258
- end
259
- relation.all conditions
260
- end
261
-
262
- end
263
-
264
- end