netzke-basepack 0.12.9 → 1.0.0.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/CHANGELOG.md +75 -44
  2. data/Gemfile +4 -2
  3. data/LICENSE +2 -6
  4. data/README.md +22 -24
  5. data/javascripts/basepack.js +0 -8
  6. data/javascripts/{columns.js → grid/columns.js} +59 -71
  7. data/javascripts/grid/event_handlers.js +218 -0
  8. data/javascripts/netzkeremotecombo.js +5 -13
  9. data/javascripts/tristate.js +62 -0
  10. data/javascripts/xdatetime.js +8 -37
  11. data/lib/netzke-basepack.rb +3 -2
  12. data/lib/netzke/basepack.rb +1 -1
  13. data/lib/netzke/basepack/action_column.rb +6 -23
  14. data/lib/netzke/basepack/active_record.rb +0 -6
  15. data/lib/netzke/basepack/attr_config.rb +20 -11
  16. data/lib/netzke/basepack/attribute_config.rb +10 -0
  17. data/lib/netzke/basepack/attributes.rb +196 -0
  18. data/lib/netzke/basepack/column_config.rb +47 -39
  19. data/lib/netzke/basepack/columns.rb +127 -97
  20. data/lib/netzke/basepack/data_accessor.rb +7 -48
  21. data/lib/netzke/basepack/data_adapters/abstract_adapter.rb +15 -17
  22. data/lib/netzke/basepack/data_adapters/active_record_adapter.rb +111 -90
  23. data/lib/netzke/basepack/dynamic_tab_panel.rb +3 -5
  24. data/lib/netzke/basepack/dynamic_tab_panel/{javascripts → client}/dynamic_tab_panel.js +6 -5
  25. data/lib/netzke/basepack/field_config.rb +30 -19
  26. data/lib/netzke/basepack/fields.rb +22 -12
  27. data/lib/netzke/basepack/grid_live_search.rb +1 -4
  28. data/lib/netzke/basepack/grid_live_search/{javascripts → client}/grid_live_search.js +9 -7
  29. data/lib/netzke/basepack/item_persistence.rb +3 -3
  30. data/lib/netzke/basepack/item_persistence/events_plugin.rb +8 -10
  31. data/lib/netzke/basepack/paging_form.rb +7 -11
  32. data/lib/netzke/basepack/paging_form/{javascripts → client}/paging_form.js +4 -4
  33. data/lib/netzke/basepack/query_builder.rb +12 -10
  34. data/lib/netzke/basepack/query_builder/{javascripts → client}/query_builder.js +14 -12
  35. data/lib/netzke/basepack/record_form_window.rb +8 -8
  36. data/lib/netzke/basepack/search_panel.rb +4 -6
  37. data/lib/netzke/basepack/search_panel/{javascripts → client}/condition_field.js +13 -16
  38. data/lib/netzke/basepack/search_panel/{javascripts → client}/search_panel.js +7 -7
  39. data/lib/netzke/basepack/search_window.rb +6 -6
  40. data/lib/netzke/basepack/simple_app/{javascripts → client}/statusbar_ext.js +0 -0
  41. data/lib/netzke/basepack/version.rb +1 -1
  42. data/lib/netzke/form/base.rb +166 -0
  43. data/lib/netzke/{basepack/form/javascripts/form.js → form/base/client/base.js} +77 -38
  44. data/lib/netzke/form/base/client/readonly_mode.css +4 -0
  45. data/lib/netzke/{basepack/form/javascripts → form/base/client}/readonly_mode.js +5 -5
  46. data/lib/netzke/form/endpoints.rb +33 -0
  47. data/lib/netzke/form/services.rb +74 -0
  48. data/lib/netzke/grid/actions.rb +52 -0
  49. data/lib/netzke/grid/base.rb +289 -0
  50. data/lib/netzke/{basepack/grid/javascripts → grid/base/client}/advanced_search.js +5 -1
  51. data/lib/netzke/{basepack/grid/javascripts/grid.js → grid/base/client/base.js} +61 -53
  52. data/lib/netzke/{basepack/grid/javascripts → grid/base/client}/extensions.js +19 -13
  53. data/lib/netzke/{basepack/grid/javascripts → grid/base/client}/remember_selection.js +0 -1
  54. data/lib/netzke/grid/client.rb +8 -0
  55. data/lib/netzke/grid/components.rb +55 -0
  56. data/lib/netzke/grid/configuration.rb +72 -0
  57. data/lib/netzke/grid/endpoints.rb +99 -0
  58. data/lib/netzke/grid/permissions.rb +18 -0
  59. data/lib/netzke/grid/services.rb +141 -0
  60. data/lib/netzke/tree/base.rb +173 -0
  61. data/lib/netzke/{basepack/tree/javascripts/tree.js → tree/base/client/base.js} +55 -26
  62. data/lib/netzke/{basepack/tree/javascripts → tree/base/client}/extensions.js +7 -7
  63. data/lib/netzke/tree/endpoints.rb +34 -0
  64. data/lib/netzke/{basepack/viewport.rb → viewport/base.rb} +3 -3
  65. data/lib/netzke/{basepack/window.rb → window/base.rb} +7 -8
  66. data/lib/netzke/window/base/client/base.js +26 -0
  67. data/locales/de.yml +49 -33
  68. data/locales/en.yml +32 -39
  69. data/locales/es.yml +39 -25
  70. data/locales/nl.yml +39 -25
  71. data/locales/ru.yml +38 -25
  72. data/locales/uk.yml +40 -26
  73. data/stylesheets/basepack.css +10 -0
  74. metadata +48 -45
  75. data/javascripts/mixins/grid_event_handlers.js +0 -139
  76. data/lib/netzke/basepack/accordion.rb +0 -45
  77. data/lib/netzke/basepack/active_record/relation_extensions.rb +0 -27
  78. data/lib/netzke/basepack/form.rb +0 -131
  79. data/lib/netzke/basepack/form/endpoints.rb +0 -35
  80. data/lib/netzke/basepack/form/services.rb +0 -74
  81. data/lib/netzke/basepack/form/stylesheets/readonly_mode.css +0 -14
  82. data/lib/netzke/basepack/grid.rb +0 -570
  83. data/lib/netzke/basepack/grid/endpoints.rb +0 -111
  84. data/lib/netzke/basepack/grid/javascripts/edit_in_form.js +0 -51
  85. data/lib/netzke/basepack/grid/services.rb +0 -148
  86. data/lib/netzke/basepack/tab_panel.rb +0 -22
  87. data/lib/netzke/basepack/tab_panel/javascripts/tab_panel.js +0 -11
  88. data/lib/netzke/basepack/tree.rb +0 -269
  89. data/lib/netzke/basepack/window/javascripts/window.js +0 -26
  90. data/lib/netzke/basepack/wrap_lazy_loaded.rb +0 -29
@@ -1,5 +1,9 @@
1
1
  {
2
- onSearch: function(el){
2
+ /**
3
+ * Handler for the `search` action
4
+ * @method netzkeOnSearch
5
+ */
6
+ netzkeOnSearch: function(el){
3
7
  if (this.searchWindow) {
4
8
  this.searchWindow.show();
5
9
  } else {
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Client-side code for [Netzke::Grid::Base](http://www.rubydoc.info/github/netzke/netzke-basepack/Netzke/Grid/Base)
3
+ * @class Netzke.Grid.Base
4
+ */
1
5
  {
2
6
  multiSelect: true,
3
7
 
@@ -8,17 +12,11 @@
8
12
  this.plugins = this.plugins || [];
9
13
 
10
14
  // Enable filters feature
11
- if (this.enableColumnFilters) {
12
- this.plugins.push('gridfilters');
13
- }
15
+ this.plugins.push('gridfilters');
14
16
 
15
17
  // Normalize columns. Extract data fields and meta column.
16
18
  this.netzkeProcessColumns();
17
19
 
18
- this.netzkeBuildModel('Ext.data.Model');
19
-
20
- delete this.fields;
21
-
22
20
  // Prepare column model config with columns in the correct order; columns out of order go to the end.
23
21
  var colModelConfig = [];
24
22
  var columns = this.columns;
@@ -37,17 +35,16 @@
37
35
 
38
36
  this.columns.items = colModelConfig;
39
37
 
40
- // data store
41
38
  this.store = this.netzkeBuildStore();
42
39
 
43
40
  // Cell editing
44
- if (!this.prohibitUpdate && this.enableEditInline) {
41
+ if (!this.prohibitUpdate && this.editInline) {
45
42
  this.plugins.push(Ext.create('Ext.grid.plugin.CellEditing', {pluginId: 'celleditor'}));
46
43
  }
47
44
 
48
45
  // Toolbar
49
46
  this.dockedItems = this.dockedItems || [];
50
- if (this.enablePagination) {
47
+ if (this.paging) {
51
48
  this.dockedItems.push({
52
49
  xtype: 'pagingtoolbar',
53
50
  dock: 'bottom',
@@ -55,7 +52,7 @@
55
52
  'beforechange': this.disableDirtyPageWarning ? {} : {fn: this.netzkeBeforePageChange, scope: this}
56
53
  },
57
54
  store: this.store,
58
- items: this.bbar && ["-"].concat(this.bbar) // append the passed bbar
55
+ items: this.bbar && ["-"].concat(this.bbar)
59
56
  });
60
57
  } else if (this.bbar) {
61
58
  this.dockedItems.push({
@@ -71,30 +68,10 @@
71
68
 
72
69
  // Context menu
73
70
  if (this.contextMenu) {
74
- this.on('itemcontextmenu', this.onItemContextMenu, this);
75
- }
76
-
77
- // Disabling/enabling editInForm button according to current selection
78
- if (this.enableEditInForm && !this.prohibitUpdate) {
79
- this.getSelectionModel().on('selectionchange', function(selModel, selected){
80
- var disabled;
81
- if (selected === undefined || selected.length === 0) { // empty?
82
- disabled = true;
83
- } else {
84
- // Disable "edit in form" button if new record is present in selection
85
- Ext.each(selected, function(r){
86
- if (r.isNew) { disabled = true; return false; }
87
- });
88
- };
89
- this.actions.editInForm.setDisabled(disabled);
90
- }, this);
71
+ this.on('itemcontextmenu', this.netzkeOnItemContextMenu, this);
91
72
  }
92
73
 
93
- // Process selectionchange event to enable/disable actions
94
- this.getSelectionModel().on('selectionchange', function(selModel){
95
- if (this.actions.del) this.actions.del.setDisabled(!selModel.hasSelection() || this.prohibitDelete);
96
- if (this.actions.edit) this.actions.edit.setDisabled(selModel.getCount() != 1 || this.prohibitUpdate);
97
- }, this);
74
+ this.netzkeSetActionEvents();
98
75
 
99
76
  // When starting editing as assocition column, pre-load the combobox store from the meta column, so that we don't see the real value of this cell (the id of the associated record), but rather the associated record by the configured method.
100
77
  this.on('beforeedit', function(editor, e){
@@ -124,19 +101,14 @@
124
101
  }, this);
125
102
 
126
103
  if(this.getStore().autoSync){
127
- // if autoSync is enabled, cancel event and call onApply() instead
104
+ // if autoSync is enabled, cancel event and call netzkeOnApply() instead
128
105
  this.getStore().on('beforesync', function(){
129
- this.onApply();
106
+ this.netzkeOnApply();
130
107
  return false;
131
108
  }, this);
132
109
  }
133
110
 
134
- // If edit in form is enabled, but edit in cell is disabled, change double-click to edit in form
135
- if (this.enableEditInForm && !this.enableEditInline) {
136
- this.on('itemdblclick', function(view, record) {
137
- this.onEditInForm();
138
- }, this);
139
- }
111
+ this.on('itemdblclick', this.netzkeHandleItemdblclick, this);
140
112
 
141
113
  // Remember grid selection on reloads
142
114
  if(this.netzkeRememberSelection && this.netzkeRestoreSelection){
@@ -145,16 +117,12 @@
145
117
  }
146
118
  },
147
119
 
120
+ /**
121
+ * @method netzkeBuildStore
122
+ * @return {Ext.data.Store} Pre-configured instance of the store
123
+ */
148
124
  netzkeBuildStore: function() {
149
- var store = Ext.create('Ext.data.Store', Ext.apply({
150
- model: Netzke.modelName(this.id),
151
- proxy: this.netzkeBuildProxy(),
152
- pruneModifiedRecords: true,
153
- remoteSort: true,
154
- remoteFilter: true,
155
- pageSize: this.rowsPerPage,
156
- autoLoad: true
157
- }, this.dataStore));
125
+ var store = Ext.create('Ext.data.Store', this.netzkeStoreConfig());
158
126
 
159
127
  delete this.dataStore;
160
128
 
@@ -165,17 +133,57 @@
165
133
  return store;
166
134
  },
167
135
 
136
+ /**
137
+ * @method netzkeStoreConfig
138
+ * @return {Object} Configuration for the store
139
+ */
140
+ netzkeStoreConfig: function(){
141
+ var defaults = {
142
+ proxy: this.netzkeBuildProxy(),
143
+ fields: this.fields,
144
+ pruneModifiedRecords: true,
145
+ remoteSort: true,
146
+ remoteFilter: true,
147
+ buffered: !this.paging
148
+ };
149
+
150
+ if (!this.paging) defaults.pageSize = 300;
151
+
152
+ return Ext.apply({}, this.storeConfig, defaults);
153
+ },
154
+
155
+ /**
156
+ * @method netzkeBuildProxy
157
+ * @return {Netzke.Grid.Proxy} Instance of the data proxy
158
+ */
168
159
  netzkeBuildProxy: function() {
169
- return Ext.create('Netzke.classes.Basepack.Grid.Proxy', {
160
+ return Ext.create('Netzke.Grid.Proxy', this.netzkeProxyConfig());
161
+ },
162
+
163
+ /**
164
+ * @method netzkeProxyConfig
165
+ * @return {Object} configuration for data proxy
166
+ */
167
+ netzkeProxyConfig: function(){
168
+ return {
170
169
  reader: this.netzkeBuildReader(),
171
170
  grid: this
172
- });
171
+ }
173
172
  },
174
173
 
174
+ /**
175
+ * @method netzkeBuildReader
176
+ * @return {Netzke.Grid.ArrayReader} Instance of the data reader
177
+ */
175
178
  netzkeBuildReader: function() {
176
- return Ext.create('Netzke.classes.Basepack.Grid.ArrayReader');
179
+ return Ext.create('Netzke.Grid.ArrayReader');
177
180
  },
178
181
 
182
+ /**
183
+ * Called before user navigates from page in the grid
184
+ * @method netzkeBeforePageChange
185
+ * @return {Boolean} Browser confirmation popup result
186
+ */
179
187
  netzkeBeforePageChange: function(){
180
188
  var store = this.getStore();
181
189
  if (store.getNewRecords().length > 0 || store.getModifiedRecords().length > 0) {
@@ -1,8 +1,10 @@
1
1
  /**
2
- * Extended Ext.data.reader.Array, which can handle commands from the endpoint, and fires the 'endpointcommands' event
2
+ * Data reader which can handle commands from the endpoint, and fires the 'endpointcommands' event
3
3
  * when commands are present in the endpoint response
4
+ * @class Netzke.Grid.ArrayReader
5
+ * @extends Ext.data.reader.Array
4
6
  */
5
- Ext.define('Netzke.classes.Basepack.Grid.ArrayReader', {
7
+ Ext.define('Netzke.Grid.ArrayReader', {
6
8
  extend: 'Ext.data.reader.Array',
7
9
  config: {
8
10
  rootProperty: 'data',
@@ -19,7 +21,12 @@ Ext.define('Netzke.classes.Basepack.Grid.ArrayReader', {
19
21
  }
20
22
  });
21
23
 
22
- Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
24
+ /**
25
+ * Data proxy that talks to Grid's endpoints.
26
+ * @extends Ext.data.proxy.Server
27
+ * @class Netzke.Grid.Proxy
28
+ */
29
+ Ext.define('Netzke.Grid.Proxy', {
23
30
  extend: 'Ext.data.proxy.Server',
24
31
 
25
32
  batch: function(options) {
@@ -30,10 +37,11 @@ Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
30
37
  }
31
38
  },
32
39
 
40
+ // NOTE: not used, as delete is being called directly from the grid
33
41
  destroy: function(op, callback, scope) {
34
42
  var data = Ext.Array.map(op.getRecords(), function(r) { return r.getData().id; });
35
43
  var store = this.grid.getStore();
36
- this.grid.serverDelete(data, function(res){
44
+ this.grid.server.destroy(data, function(res){
37
45
  var errors = [];
38
46
  for (var id in res) {
39
47
  var error;
@@ -51,7 +59,7 @@ Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
51
59
  store.commitChanges();
52
60
 
53
61
  if (errors.length > 0) {
54
- this.grid.netzkeFeedback([errors]);
62
+ this.grid.netzkeNotify(errors);
55
63
  }
56
64
 
57
65
  this.grid.getStore().load();
@@ -63,7 +71,7 @@ Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
63
71
  var records = op.getRecords(),
64
72
  data = Ext.Array.map(records, function(r) { return Ext.apply(r.getData(), {internal_id: r.internalId}); });
65
73
 
66
- this.grid.serverCreate(data, function(res) {
74
+ this.grid.server.create(data, function(res) {
67
75
  var errors = [];
68
76
  Ext.each(records, function(r) {
69
77
  var rid = r.internalId,
@@ -80,7 +88,7 @@ Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
80
88
  if (errors.length == 0) {
81
89
  this.grid.getStore().load();
82
90
  } else {
83
- this.grid.netzkeFeedback(errors);
91
+ this.grid.netzkeNotify(errors);
84
92
  }
85
93
 
86
94
  }, this);
@@ -89,7 +97,7 @@ Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
89
97
  update: function(op, callback, scope) {
90
98
  var data = Ext.Array.map(op.getRecords(), function(r) { return r.getData(); });
91
99
 
92
- this.grid.serverUpdate(data, function(res) {
100
+ this.grid.server.update(data, function(res) {
93
101
  var errors = [];
94
102
  Ext.each(op.records, function(r) {
95
103
  var rid = r.getId(),
@@ -106,13 +114,13 @@ Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
106
114
  if (errors.length == 0) {
107
115
  this.grid.getStore().load();
108
116
  } else {
109
- this.grid.netzkeFeedback(errors);
117
+ this.grid.netzkeNotify(errors);
110
118
  }
111
119
  }, this);
112
120
  },
113
121
 
114
122
  read: function(operation, callback, scope) {
115
- this.grid.serverRead(this.paramsFromOperation(operation), function(res) {
123
+ this.grid.server.read(this.paramsFromOperation(operation), function(res) {
116
124
  this.processResponse(true, operation, {}, res, callback, scope);
117
125
  }, this);
118
126
  return {};
@@ -138,9 +146,7 @@ Ext.define('Netzke.classes.Basepack.Grid.Proxy', {
138
146
  }
139
147
  });
140
148
 
141
- /**
142
- * A fix for CheckColumn
143
- */
149
+ // Fix for CheckColumn
144
150
  Ext.override(Ext.ux.CheckColumn, {
145
151
  processEvent: function(type) {
146
152
  // by returning true, we'll allow event propagation, so it reacts similarly to other columns
@@ -23,4 +23,3 @@
23
23
  this.getSelectionModel().select(newRecordsToSelect);
24
24
  }
25
25
  }
26
-
@@ -0,0 +1,8 @@
1
+ module Netzke
2
+ module Grid
3
+ module Client
4
+ extend ActiveSupport::Concern
5
+
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,55 @@
1
+ module Netzke
2
+ module Grid
3
+ # Child components for Grid and Tree
4
+ module Components
5
+ extend ActiveSupport::Concern
6
+
7
+ included do
8
+ component :add_window do |c|
9
+ configure_form_window(c)
10
+ c.title = I18n.t('netzke.grid.base.add_record', model: model.model_name.human)
11
+ c.items = [:add_form]
12
+ c.form_config.record = model.new(columns_default_values)
13
+ c.excluded = !allowed_to?(:create)
14
+ end
15
+
16
+ component :edit_window do |c|
17
+ configure_form_window(c)
18
+ c.title = I18n.t('netzke.grid.base.edit_record', model: model.model_name.human)
19
+ c.items = [:edit_form]
20
+ c.excluded = !allowed_to?(:update)
21
+ end
22
+
23
+ component :multiedit_window do |c|
24
+ configure_form_window(c)
25
+ c.title = I18n.t('netzke.grid.base.edit_records', models: model.model_name.human.pluralize)
26
+ c.items = [:multiedit_form]
27
+ c.excluded = !allowed_to?(:update)
28
+ end
29
+
30
+ component :search_window do |c|
31
+ c.klass = Basepack::SearchWindow
32
+ c.model = config.model
33
+ c.fields = attributes_for_search
34
+ end
35
+ end
36
+
37
+ def configure_form_window(c)
38
+ c.klass = Basepack::RecordFormWindow
39
+ c.form_config = ActiveSupport::OrderedOptions.new
40
+ configure_form(c.form_config)
41
+ end
42
+
43
+ def configure_form(c)
44
+ shared_config = %w(mode persistent_config strong_values).reduce({}) do |r, m|
45
+ r.merge!(m.to_sym => config.send(m))
46
+ end
47
+
48
+ c.model = model
49
+ c.merge!(shared_config)
50
+ c.attribute_overrides = attribute_overrides
51
+ c.items = form_items
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,72 @@
1
+ module Netzke
2
+ module Grid
3
+ # Overridable methods related to configuration of Grid. For example, to add a custom action to the end of the grid's
4
+ # bbar, you can do:
5
+ #
6
+ # def bbar
7
+ # super + [:my_action]
8
+ # end
9
+ module Configuration # WTF: naming it Config causes troubles in 1.9.3
10
+ extend ActiveSupport::Concern
11
+
12
+ module ClassMethods
13
+ def server_side_config_options
14
+ super + [:scope]
15
+ end
16
+ end
17
+
18
+ def bbar
19
+ config.has_key?(:bbar) ? config[:bbar] : default_bbar
20
+ end
21
+
22
+ def default_bbar
23
+ [].tap do |bbar|
24
+ bbar << :add if has_add_action?
25
+ bbar << :edit if has_edit_action?
26
+ bbar << :apply if has_apply_action?
27
+ bbar << :delete if has_delete_action?
28
+ bbar << :search if has_search_action?
29
+ end
30
+ end
31
+
32
+ def context_menu
33
+ config.has_key?(:context_menu) ? config.context_menu : default_context_menu
34
+ end
35
+
36
+ def default_context_menu
37
+ [].tap do |menu|
38
+ menu << :edit if has_edit_action?
39
+ menu << :delete if has_delete_action?
40
+ end
41
+ end
42
+
43
+ def tools
44
+ config.has_key?(:tools) ? config.tools : default_tools
45
+ end
46
+
47
+ def default_tools
48
+ [{ type: :refresh, handler: f(:netzke_on_refresh_tool) }]
49
+ end
50
+
51
+ def configure_client(c)
52
+ super
53
+ c.title ||= model.name.pluralize
54
+ c.columns = {items: js_columns}
55
+ c.columns_order = columns_order
56
+ c.pri = model_adapter.primary_key
57
+ if c.default_filters
58
+ populate_columns_with_filters(c)
59
+ end
60
+ end
61
+
62
+ def validate_config(c)
63
+ raise ArgumentError, "Grid requires a model" if model.nil?
64
+ c.paging = true if c.edit_inline
65
+ c.tools = tools
66
+ c.bbar = bbar
67
+ c.context_menu = context_menu
68
+ super
69
+ end
70
+ end
71
+ end
72
+ end