netzke-basepack 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ v0.3.1
2
+ Added the "conditions" configuration option to GridPanel to limit the search
3
+ Basic column editor for grids has been replaced with FieldsConfigurator, which can do a bit more
4
+ Added Checkbox column/form-field type for boolean fields
5
+ "renderer" configuration option added for grid columns - any Ext.util.Format renderer can be specified there (thanks to Josh Holt for the initial idea)
6
+
1
7
  v0.3.0
2
8
  Added BasicApp widget - the base for a Ext.Viewport based ("application") widget with support for dynamic widget loading, browser history, authentification, and more. See the demo an http://netzke-demo.writelesscode.com
3
9
 
data/Manifest CHANGED
@@ -9,6 +9,7 @@ generators/netzke_grid_panel/templates/create_netzke_grid_panel_columns.rb
9
9
  init.rb
10
10
  install.rb
11
11
  javascripts/basepack.js
12
+ javascripts/check_column.js
12
13
  javascripts/filters.js
13
14
  lib/app/models/netzke_form_panel_field.rb
14
15
  lib/app/models/netzke_grid_panel_column.rb
@@ -18,6 +19,7 @@ lib/netzke/basic_app.rb
18
19
  lib/netzke/border_layout_panel.rb
19
20
  lib/netzke/column.rb
20
21
  lib/netzke/container.rb
22
+ lib/netzke/fields_configurator.rb
21
23
  lib/netzke/form_panel.rb
22
24
  lib/netzke/grid_panel.rb
23
25
  lib/netzke/grid_panel_interface.rb
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ Echoe.new("netzke-basepack") do |p|
5
5
  p.email = "sergei@writelesscode.com"
6
6
  p.summary = "Base Netzke widgets - grid, form, tree, and more"
7
7
  p.url = "http://writelesscode.com"
8
- p.runtime_dependencies = ["searchlogic >=1.6.2", "netzke-core >= 0.2.3"]
8
+ p.runtime_dependencies = ["searchlogic >=1.6.2", "netzke-core >= 0.2.4"]
9
9
  p.development_dependencies = []
10
10
  p.test_pattern = 'test/**/*_test.rb'
11
11
 
@@ -8,6 +8,7 @@ class CreateNetzkeGridPanelColumns < ActiveRecord::Migration
8
8
  t.boolean :hidden
9
9
  t.integer :width
10
10
  t.string :editor, :limit => 32
11
+ t.string :renderer, :limit => 32
11
12
 
12
13
  t.integer :layout_id
13
14
 
@@ -1,82 +1,110 @@
1
1
  // Editors for grid cells and form fields
2
2
  Ext.netzke.editors = {
3
- combo_box: function(c, config){
4
- var row = Ext.data.Record.create([{name:'id'}])
3
+ combo_box: function(c, config){
4
+ var row = Ext.data.Record.create([{name:'id'}])
5
5
  var store = new Ext.data.Store({
6
- proxy: new Ext.data.HttpProxy({url:config.interface.getCbChoices, jsonData:{column:c.name}}),
7
- reader: new Ext.data.ArrayReader({root:'data', id:0}, row)
6
+ proxy : new Ext.data.HttpProxy({url:config.interface.getCbChoices, jsonData:{column:c.name}}),
7
+ reader : new Ext.data.ArrayReader({root:'data', id:0}, row)
8
8
  })
9
- return new Ext.form.ComboBox({
10
- mode: 'remote',
11
- displayField:'id',
12
- valueField:'id',
13
- triggerAction:'all',
14
- store: store
9
+
10
+ var comboBox = new Ext.form.ComboBox({
11
+ mode : 'remote',
12
+ displayField : 'id',
13
+ valueField : 'id',
14
+ triggerAction : 'all',
15
+ typeAhead : true,
16
+ selectOnFocus : true,
17
+ store : store
15
18
  })
16
- },
19
+
20
+ // let user enter values that are not in the store
21
+ comboBox.on('blur', function(cb){
22
+ cb.setValue(cb.getRawValue());
23
+ });
24
+ comboBox.on('specialkey', function(cb, event){
25
+ if (event.getKey() == 9 || event.getKey() == 13) {cb.setValue(cb.getRawValue());}
26
+ });
27
+
28
+ return comboBox;
29
+ },
17
30
 
18
- text_field: function(c, config){
19
- return new Ext.form.TextField({
20
- selectOnFocus:true
21
- })
22
- },
23
-
24
- checkbox: function(c, config){
25
- return new Ext.form.TextField({
26
- selectOnFocus:true
27
- })
28
- },
29
-
30
- number_field: function(c, config){
31
- return new Ext.form.NumberField({
32
- selectOnFocus:true
33
- })
34
- },
35
-
36
- // TODO: it's simply a text field for now
37
- datetime: function(c, config){
38
- return new Ext.form.TextField({
39
- selectOnFocus:true
40
- })
41
- }
31
+ text_field: function(c, config){
32
+ return new Ext.form.TextField({
33
+ selectOnFocus:true
34
+ })
35
+ },
36
+
37
+ checkbox: function(c, config){
38
+ return new Ext.form.TextField({
39
+ selectOnFocus:true
40
+ })
41
+ },
42
+
43
+ number_field: function(c, config){
44
+ return new Ext.form.NumberField({
45
+ selectOnFocus:true
46
+ })
47
+ },
48
+
49
+ // TODO: it's simply a text field for now
50
+ datetime: function(c, config){
51
+ return new Ext.form.TextField({
52
+ selectOnFocus:true
53
+ })
54
+ }
42
55
  };
43
56
 
57
+ Ext.netzke.renderer = function(renderer, c, config){
58
+ res = Ext.emptyFn;
59
+ switch (renderer) {
60
+
61
+ // custom renderers can be later added like this:
62
+ case 'my_renderer':
63
+ res = function(value){ return "Not implemented" };
64
+ break
65
+
66
+ // falls back to Ext.util.Format renderers
67
+ default:
68
+ res = Ext.util.Format[renderer]
69
+ break
70
+ }
71
+ return res
72
+ }
73
+
44
74
  // Mapping of editor field to grid filters
45
75
  Ext.netzke.filterMap = {
46
- number_field:'Numeric',
47
- text_field:'String',
48
- datetime:'String',
49
- checkbox:'Boolean',
50
- combo_box:'String',
51
- date:'Date'
76
+ number_field:'Numeric',
77
+ text_field:'String',
78
+ datetime:'String',
79
+ checkbox:'Boolean',
80
+ combo_box:'String',
81
+ date:'Date'
52
82
  }
53
83
 
54
84
  Ext.data.RecordArrayReader = Ext.extend(Ext.data.JsonReader, {
55
- /**
56
- * Create a data block containing Ext.data.Records from an Array.
57
- * @param {Object} o An Array of row objects which represents the dataset.
58
- * @return {Object} data A data block which is used by an Ext.data.Store object as
59
- * a cache of Ext.data.Records.
60
- */
61
- readRecord : function(o){
62
- var sid = this.meta ? this.meta.id : null;
63
- var recordType = this.recordType, fields = recordType.prototype.fields;
64
- var records = [];
65
- var root = o;
66
- // for(var i = 0; i < root.length; i++){
67
- var n = root;
68
- var values = {};
69
- var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
70
- for(var j = 0, jlen = fields.length; j < jlen; j++){
71
- var f = fields.items[j];
72
- var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
73
- var v = n[k] !== undefined ? n[k] : f.defaultValue;
74
- v = f.convert(v, n);
75
- values[f.name] = v;
76
- }
77
- var record = new recordType(values, id);
78
- record.json = n;
79
- // }
80
- return record;
85
+ /**
86
+ * Create a data block containing Ext.data.Records from an Array.
87
+ * @param {Object} o An Array of row objects which represents the dataset.
88
+ * @return {Object} data A data block which is used by an Ext.data.Store object as
89
+ * a cache of Ext.data.Records.
90
+ */
91
+ readRecord : function(o){
92
+ var sid = this.meta ? this.meta.id : null;
93
+ var recordType = this.recordType, fields = recordType.prototype.fields;
94
+ var records = [];
95
+ var root = o;
96
+ var n = root;
97
+ var values = {};
98
+ var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);
99
+ for(var j = 0, jlen = fields.length; j < jlen; j++){
100
+ var f = fields.items[j];
101
+ var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;
102
+ var v = n[k] !== undefined ? n[k] : f.defaultValue;
103
+ v = f.convert(v, n);
104
+ values[f.name] = v;
81
105
  }
106
+ var record = new recordType(values, id);
107
+ record.json = n;
108
+ return record;
109
+ }
82
110
  });
@@ -0,0 +1,33 @@
1
+ // CheckColumn
2
+ Ext.grid.CheckColumn = function(config){
3
+ Ext.apply(this, config);
4
+ if(!this.id){
5
+ this.id = Ext.id();
6
+ }
7
+ this.renderer = this.renderer.createDelegate(this);
8
+ };
9
+
10
+ Ext.grid.CheckColumn.prototype ={
11
+ init : function(grid){
12
+ this.grid = grid;
13
+ if (this.disabled) return; // SK
14
+ this.grid.on('render', function(){
15
+ var view = this.grid.getView();
16
+ view.mainBody.on('mousedown', this.onMouseDown, this);
17
+ }, this);
18
+ },
19
+
20
+ onMouseDown : function(e, t){
21
+ if(t.className && t.className.indexOf('x-grid3-cc-'+this.id) != -1){
22
+ e.stopEvent();
23
+ var index = this.grid.getView().findRowIndex(t);
24
+ var record = this.grid.store.getAt(index);
25
+ record.set(this.dataIndex, !record.data[this.dataIndex]);
26
+ }
27
+ },
28
+
29
+ renderer : function(v, p, record){
30
+ p.css += ' x-grid3-check-col-td';
31
+ return '<div class="x-grid3-check-col'+(v?'-on':'')+' x-grid3-cc-'+this.id+'">&#160;</div>';
32
+ }
33
+ };
@@ -18,6 +18,7 @@ end
18
18
 
19
19
  # Include the javascript
20
20
  Netzke::Base.config[:javascripts] << "#{File.dirname(__FILE__)}/../javascripts/basepack.js"
21
+ Netzke::Base.config[:javascripts] << "#{File.dirname(__FILE__)}/../javascripts/check_column.js"
21
22
 
22
23
  # TODO: implement configurable loading of JS, to spare the traffic at the initial loading
23
24
  extjs_dir = "#{RAILS_ROOT}/public/extjs"
data/lib/netzke/ar_ext.rb CHANGED
@@ -160,6 +160,8 @@ module Netzke
160
160
  assoc_method = %w{name title label}.detect{|m| (assoc.klass.instance_methods + assoc.klass.column_names).include?(m) } || assoc.klass.primary_key
161
161
  res[:name] = "#{assoc.name}__#{assoc_method}"
162
162
  end
163
+
164
+ res[:width] = 50 if res[:editor] == :checkbox # more narrow column for checkboxes
163
165
 
164
166
  # merge with the given confg, which has the priority
165
167
  config.delete(:name) # because we might have changed the name
@@ -50,7 +50,7 @@ module Netzke
50
50
  });
51
51
  panel.oldSize.width = w;
52
52
  }
53
- return true;
53
+ return true;
54
54
  }, this);
55
55
  else if (item.region == 'south' || item.region == 'north') item.on('resize', function(panel, w, h){
56
56
  if (panel.oldSize.height != h) {
@@ -60,7 +60,7 @@ module Netzke
60
60
  });
61
61
  panel.oldSize.height = h;
62
62
  }
63
- return true;
63
+ return true;
64
64
  }, this);
65
65
  }, this);
66
66
  this.un('afterlayout', this.setResizeEvents, this); // to avoid redefinition of resize events
data/lib/netzke/column.rb CHANGED
@@ -6,10 +6,8 @@ module Netzke
6
6
 
7
7
  # layout = NetzkeLayout.create(:widget_name => widget.id_name, :items_class => self.name, :user_id => NetzkeLayout.user_id)
8
8
 
9
- data_class = widget.config[:data_class_name].constantize
10
-
11
- exposed_columns = normalize_columns(data_class.exposed_columns) # columns exposed from the data class
12
-
9
+ data_class = widget.config[:data_class_name].constantize
10
+ exposed_columns = normalize_columns(data_class.exposed_columns) # columns exposed from the data class
13
11
  columns_from_config = widget.config[:columns] && normalize_columns(widget.config[:columns]) # columns specified in widget's config
14
12
 
15
13
  if columns_from_config
@@ -46,16 +46,16 @@ module Netzke
46
46
  def self.js_items
47
47
  items.inject([]) do |a,i|
48
48
  a << {
49
- :title => i.to_s.humanize,
50
- :layout => 'fit',
51
- :id => i.to_s,
52
- # :id => "#{config[:name]}_#{i.to_s}",
53
- :items => ([i.to_s.to_js.l] if !aggregatees[i][:late_aggregation]),
49
+ :title => i.to_s.humanize,
50
+ :layout => 'fit',
51
+ :id => i.to_s,
52
+ # :id => "#{config[:name]}_#{i.to_s}",
53
+ :items => ([i.to_s.to_js.l] if !aggregatees[i][:late_aggregation]),
54
54
  # these listeners will be different for tab_panel and accordion
55
- :collapsed => !aggregatees[i][:active],
56
- :listeners => {
57
- # :activate => {:fn => "function(p){this.feedback(p.id)}".l, :scope => this},
58
- :expand => {:fn => "this.loadItemWidget".l, :scope => this}
55
+ :collapsed => !aggregatees[i][:active],
56
+ :listeners => {
57
+ # :activate => {:fn => "function(p){this.feedback(p.id)}".l, :scope => this},
58
+ :expand => {:fn => "this.loadItemWidget".l, :scope => this}
59
59
  }
60
60
  }
61
61
  end
@@ -0,0 +1,66 @@
1
+ module Netzke
2
+ class FieldsConfigurator < GridPanel
3
+ interface :load_defaults
4
+
5
+ def initialize(*args)
6
+ super
7
+
8
+ # process config[:layout]
9
+ config[:conditions] = {:layout_id => (config[:layout] && config[:layout].id)}
10
+ config[:columns] = [
11
+ :id,
12
+ :label,
13
+ {:name => :read_only, :label => "R/O"},
14
+ :hidden,
15
+ {:name => :width, :width => 50},
16
+ {:name => :editor, :editor => :combo_box},
17
+ {:name => :renderer, :editor => :combo_box}
18
+ ]
19
+
20
+ end
21
+
22
+ def initial_config
23
+ super.recursive_merge({
24
+ :name => 'columns',
25
+ :widget_class_name => "GridPanel",
26
+ :data_class_name => "NetzkeGridPanelColumn",
27
+ :ext_config => {:title => false},
28
+ # :conditions => {:layout_id => config[:layout].id},
29
+ :active => true
30
+ })
31
+ end
32
+
33
+ def actions
34
+ super + [{
35
+ :text => 'Restore defaults', :handler => 'loadDefaults'
36
+ }]
37
+ end
38
+
39
+ def self.js_extend_properties
40
+ super.merge({
41
+ :load_defaults => <<-JS.l,
42
+ function(){
43
+ Ext.Msg.confirm('Confirm', 'Are you sure?', function(btn){
44
+ if (btn == 'yes') {
45
+ Ext.Ajax.request({
46
+ url:this.initialConfig.interface.loadDefaults,
47
+ callback:function(){
48
+ this.store.reload();
49
+ },
50
+ scope:this
51
+ })
52
+ }
53
+ }, this);
54
+ }
55
+ JS
56
+ })
57
+ end
58
+
59
+ def load_defaults(params)
60
+ NetzkeLayout.destroy(config[:layout].id)
61
+ NetzkeGridPanelColumn.create_layout_for_widget(parent.parent)
62
+ {}
63
+ end
64
+
65
+ end
66
+ end
@@ -21,14 +21,14 @@ module Netzke
21
21
 
22
22
  def js_default_config
23
23
  super.merge({
24
- :auto_scroll => true,
25
- :bbar => "config.actions".l,
26
- # :plugins => "plugins".l,
27
- :items => "fields".l,
28
- :default_type => 'textfield',
29
- :body_style => 'padding:5px 5px 0',
30
- :label_width => 150,
31
- :listeners => {:afterlayout => {:fn => "this.afterlayoutHandler".l, :scope => this}},
24
+ :auto_scroll => true,
25
+ :bbar => "config.actions".l,
26
+ # :plugins => "plugins".l,
27
+ :items => "fields".l,
28
+ :default_type => 'textfield',
29
+ :body_style => 'padding:5px 5px 0',
30
+ :label_width => 150,
31
+ :listeners => {:afterlayout => {:fn => "this.afterlayoutHandler".l, :scope => this}},
32
32
 
33
33
  #custom configs
34
34
  :auto_load_data => true,
@@ -152,12 +152,9 @@ module Netzke
152
152
  logger.debug { "!!! params: #{params.inspect}" }
153
153
  klass = config[:data_class_name].constantize
154
154
  case params[:neighbour]
155
- when "previous"
156
- book = klass.previous(params[:id])
157
- when "next"
158
- book = klass.next(params[:id])
159
- else
160
- book = klass.find(params[:id])
155
+ when "previous" then book = klass.previous(params[:id])
156
+ when "next" then book = klass.next(params[:id])
157
+ else book = klass.find(params[:id])
161
158
  end
162
159
  [book && book.to_array(get_fields)].to_json
163
160
  end
@@ -47,45 +47,38 @@ module Netzke
47
47
  def initial_config
48
48
  {
49
49
  :ext_config => {
50
- :config_tool => false,
51
- :enable_column_filters => Netzke::Base.config[:grid_panel][:filters],
52
- :enable_column_move => true,
53
- :enable_column_resize => true,
54
- :border => true,
55
- :load_mask => true
50
+ :config_tool => false,
51
+ :enable_column_filters => Netzke::Base.config[:grid_panel][:filters],
52
+ :enable_column_move => true,
53
+ :enable_column_resize => true,
54
+ :border => true,
55
+ :load_mask => true
56
56
  },
57
57
  :persistent_layout => true,
58
58
  :persistent_config => true
59
59
  }
60
60
  end
61
61
 
62
+ def initial_dependencies
63
+ ["FieldsConfigurator"] # TODO: make this happen automatically
64
+ end
65
+
62
66
  def property_widgets
63
67
  [{
64
- :name => 'columns',
65
- :widget_class_name => "GridPanel",
66
- :data_class_name => column_manager_class.name,
67
- :ext_config => {:title => false, :config_tool => false},
68
- :active => true
68
+ :name => 'columns',
69
+ :widget_class_name => "FieldsConfigurator",
70
+ :ext_config => {:title => false},
71
+ :active => true,
72
+ :layout => NetzkeLayout.by_widget(id_name)
69
73
  },{
70
- :name => 'general',
71
- :widget_class_name => "PreferenceGrid",
72
- :host_widget_name => @id_name,
74
+ :name => 'general',
75
+ :widget_class_name => "PreferenceGrid",
76
+ :host_widget_name => id_name,
73
77
  :default_properties => available_permissions.map{ |k| {:name => "permissions.#{k}", :value => @permissions[k.to_sym]}},
74
- :ext_config => {:title => false}
78
+ :ext_config => {:title => false}
75
79
  }]
76
80
  end
77
81
 
78
- ## Data for properties grid
79
- def properties__columns__get_data(params = {})
80
- # add extra filter to show only the columns for the current grid (filtered by layout_id)
81
- layout_id = layout_manager_class.by_widget(id_name).id
82
- params[:filter] ||= {}
83
- params[:filter].merge!(:extra_conditions => {:field => 'layout_id', :data => {:type => 'numeric', :value => layout_id}})
84
-
85
- columns_widget = aggregatee_instance(:properties__columns)
86
- columns_widget.interface_get_data(params)
87
- end
88
-
89
82
  def properties__general__load_source(params = {})
90
83
  w = aggregatee_instance(:properties__general)
91
84
  w.interface_load_source(params)
@@ -134,7 +127,6 @@ module Netzke
134
127
  # [{:text => "config.dataClassName".l, :menu => "config.actions".l}]
135
128
  # end
136
129
 
137
- # include ColumnOperations
138
130
  include PropertiesTool # it will load aggregation with name :properties into a modal window
139
131
  end
140
132
  end
@@ -100,7 +100,9 @@ module Netzke::GridPanelInterface
100
100
 
101
101
  # get records
102
102
  def get_records(params)
103
- search_params = normalize_params(params)
103
+ search_params = normalize_params(params) # make params coming from the browser understandable by searchlogic
104
+ search_params[:conditions].recursive_merge!(config[:conditions] || {}) # merge with conditions coming from the config
105
+
104
106
  raise ArgumentError, "No data_class_name specified for widget '#{config[:name]}'" if !config[:data_class_name]
105
107
  records = config[:data_class_name].constantize.all(search_params.clone) # clone needed as searchlogic removes :conditions key from the hash
106
108
  # output_array = []
@@ -29,25 +29,25 @@ module Netzke::GridPanelJsBuilder
29
29
 
30
30
  def js_default_config
31
31
  super.merge({
32
- :store => "ds".l,
33
- :cm => "cm".l,
34
- :sel_model => "new Ext.grid.RowSelectionModel()".l,
35
- :auto_scroll => true,
36
- :click_to_edit => 2,
32
+ :store => "ds".l,
33
+ :cm => "cm".l,
34
+ :sel_model => "new Ext.grid.RowSelectionModel()".l,
35
+ :auto_scroll => true,
36
+ :click_to_edit => 2,
37
37
  :track_mouse_over => true,
38
- # :bbar => "config.actions".l,
39
- :bbar => js_bbar,
40
- :plugins => "plugins".l,
38
+ # :bbar => "config.actions".l,
39
+ :bbar => js_bbar,
40
+ :plugins => "plugins".l,
41
41
 
42
42
  #custom configs
43
- :auto_load_data => true
43
+ :auto_load_data => true
44
44
  })
45
45
  end
46
46
 
47
47
  def js_before_constructor
48
48
  <<-JS
49
49
  var plugins = [];
50
- if (!config.columns) this.feedback('No columns defined for grid '+config.id);
50
+ if (!config.columns) this.feedback('No columns defined for grid '+config.id);
51
51
  this.recordConfig = [];
52
52
  Ext.each(config.columns, function(column){this.recordConfig.push({name:column.name})}, this);
53
53
  this.Row = Ext.data.Record.create(this.recordConfig);
@@ -65,15 +65,31 @@ module Netzke::GridPanelJsBuilder
65
65
  this.cmConfig = [];
66
66
  Ext.each(config.columns, function(c){
67
67
  var editor = (c.readOnly || !config.permissions.update) ? null : Ext.netzke.editors[c.editor](c, config);
68
+ var renderer = Ext.netzke.renderer(c.renderer);
69
+
70
+ if (c.editor == 'checkbox') {
71
+ var plugin = new Ext.grid.CheckColumn({
72
+ header: c.label || c.name,
73
+ dataIndex: c.name,
74
+ disabled: c.readOnly,
75
+ hidden: c.hidden,
76
+ width: c.width
77
+ });
78
+ plugins.push(plugin);
79
+ this.cmConfig.push(plugin);
80
+
81
+ } else {
82
+ this.cmConfig.push({
83
+ header: c.label || c.name,
84
+ dataIndex: c.name,
85
+ hidden: c.hidden,
86
+ width: c.width,
87
+ editor: editor,
88
+ renderer: renderer,
89
+ sortable: true
90
+ })
91
+ }
68
92
 
69
- this.cmConfig.push({
70
- header: c.label || c.name,
71
- dataIndex: c.name,
72
- hidden: c.hidden,
73
- width: c.width,
74
- editor: editor,
75
- sortable: true
76
- })
77
93
  }, this);
78
94
 
79
95
  var cm = new Ext.grid.ColumnModel(this.cmConfig);
@@ -86,7 +102,7 @@ module Netzke::GridPanelJsBuilder
86
102
  Ext.each(config.columns, function(c){
87
103
  filters.push({type:Ext.netzke.filterMap[c.editor], dataIndex:c.name})
88
104
  })
89
- var gridFilters = new Ext.grid.GridFilters({filters:filters});
105
+ var gridFilters = new Ext.grid.GridFilters({filters:filters});
90
106
  plugins.push(gridFilters);
91
107
  }
92
108
 
@@ -96,7 +112,7 @@ module Netzke::GridPanelJsBuilder
96
112
  def js_listeners
97
113
  super.merge({
98
114
  :columnresize => {:fn => "this.onColumnResize".l, :scope => this},
99
- :columnmove => {:fn => "this.onColumnMove".l, :scope => this}
115
+ :columnmove => {:fn => "this.onColumnMove".l, :scope => this}
100
116
  })
101
117
  end
102
118
 
@@ -136,12 +152,12 @@ module Netzke::GridPanelJsBuilder
136
152
  var r = new this.Row(rowConfig); // TODO: add default values
137
153
  r.set('id', -r.id); // to distinguish new records by negative values
138
154
  this.stopEditing();
139
- this.store.add(r);
140
- this.store.newRecords = this.store.newRecords || []
141
- this.store.newRecords.push(r);
155
+ this.store.add(r);
156
+ this.store.newRecords = this.store.newRecords || []
157
+ this.store.newRecords.push(r);
142
158
  // console.info(this.store.newRecords);
143
159
  this.tryStartEditing(this.store.indexOf(r));
144
- }
160
+ }
145
161
  JS
146
162
 
147
163
  :edit => <<-JS.l,
@@ -155,17 +171,17 @@ module Netzke::GridPanelJsBuilder
155
171
 
156
172
  # try editing the first editable (not hidden, not read-only) sell
157
173
  :try_start_editing => <<-JS.l,
158
- function(row){
159
- if (row == null) return;
160
- var editableColumns = this.getColumnModel().getColumnsBy(function(columnConfig, index){
161
- return !columnConfig.hidden && !!columnConfig.editor;
162
- });
163
- // console.info(editableColumns);
164
- var firstEditableColumn = editableColumns[0];
165
- if (firstEditableColumn){
166
- this.startEditing(row, firstEditableColumn.id);
167
- }
168
- }
174
+ function(row){
175
+ if (row == null) return;
176
+ var editableColumns = this.getColumnModel().getColumnsBy(function(columnConfig, index){
177
+ return !columnConfig.hidden && !!columnConfig.editor;
178
+ });
179
+ // console.info(editableColumns);
180
+ var firstEditableColumn = editableColumns[0];
181
+ if (firstEditableColumn){
182
+ this.startEditing(row, firstEditableColumn.id);
183
+ }
184
+ }
169
185
  JS
170
186
 
171
187
  :delete => <<-JS.l,
@@ -175,19 +191,19 @@ module Netzke::GridPanelJsBuilder
175
191
  if (btn == 'yes') {
176
192
  var records = []
177
193
  this.getSelectionModel().each(function(r){
178
- records.push(r.get('id'));
194
+ records.push(r.get('id'));
179
195
  }, this);
180
- Ext.Ajax.request({
181
- url: this.initialConfig.interface.deleteData,
182
- params: {records: Ext.encode(records)},
183
- success:function(r){
184
- var m = Ext.decode(r.responseText);
185
- this.store.reload();
196
+ Ext.Ajax.request({
197
+ url: this.initialConfig.interface.deleteData,
198
+ params: {records: Ext.encode(records)},
199
+ success:function(r){
200
+ var m = Ext.decode(r.responseText);
201
+ this.store.reload();
186
202
  // this.loadWithFeedback();
187
- this.feedback(m.flash);
188
- },
189
- scope:this
190
- });
203
+ this.feedback(m.flash);
204
+ },
205
+ scope:this
206
+ });
191
207
  }
192
208
  }, this);
193
209
  }
@@ -198,46 +214,46 @@ module Netzke::GridPanelJsBuilder
198
214
 
199
215
  var newRecords = [];
200
216
  if (this.store.newRecords){
201
- Ext.each(this.store.newRecords, function(r){
202
- newRecords.push(r.getChanges())
203
- r.commit() // commit the changes, so that they are not picked up by getModifiedRecords() further down
204
- }, this);
205
- delete this.store.newRecords;
206
- }
207
-
208
- var updatedRecords = [];
209
- Ext.each(this.store.getModifiedRecords(),
210
- function(record) {
211
- var completeRecordData = {};
212
- Ext.apply(completeRecordData, Ext.apply(record.getChanges(), {id:record.get('id')}));
213
- updatedRecords.push(completeRecordData);
214
- },
215
- this);
217
+ Ext.each(this.store.newRecords, function(r){
218
+ newRecords.push(r.getChanges())
219
+ r.commit() // commit the changes, so that they are not picked up by getModifiedRecords() further down
220
+ }, this);
221
+ delete this.store.newRecords;
222
+ }
223
+
224
+ var updatedRecords = [];
225
+ Ext.each(this.store.getModifiedRecords(),
226
+ function(record) {
227
+ var completeRecordData = {};
228
+ Ext.apply(completeRecordData, Ext.apply(record.getChanges(), {id:record.get('id')}));
229
+ updatedRecords.push(completeRecordData);
230
+ },
231
+ this);
216
232
 
217
233
  if (newRecords.length > 0 || updatedRecords.length > 0) {
218
- Ext.Ajax.request({
219
- url:this.initialConfig.interface.postData,
220
- params: {
221
- updated_records: Ext.encode(updatedRecords),
222
- created_records: Ext.encode(newRecords),
223
- filters: this.store.baseParams.filters
224
- },
225
- success:function(response){
226
- var m = Ext.decode(response.responseText);
227
- if (m.success) {
228
- this.store.reload();
234
+ Ext.Ajax.request({
235
+ url:this.initialConfig.interface.postData,
236
+ params: {
237
+ updated_records: Ext.encode(updatedRecords),
238
+ created_records: Ext.encode(newRecords),
239
+ filters: this.store.baseParams.filters
240
+ },
241
+ success:function(response){
242
+ var m = Ext.decode(response.responseText);
243
+ if (m.success) {
244
+ this.store.reload();
229
245
  // this.loadWithFeedback();
230
- this.store.commitChanges();
231
- this.feedback(m.flash);
232
- } else {
233
- this.feedback(m.flash);
234
- }
235
- },
236
- failure:function(response){
237
- this.feedback('Bad response from server');
238
- },
239
- scope:this
240
- });
246
+ this.store.commitChanges();
247
+ this.feedback(m.flash);
248
+ } else {
249
+ this.feedback(m.flash);
250
+ }
251
+ },
252
+ failure:function(response){
253
+ this.feedback('Bad response from server');
254
+ },
255
+ scope:this
256
+ });
241
257
  }
242
258
 
243
259
  }
@@ -28,31 +28,31 @@ module Netzke
28
28
  var w = new Ext.Window({
29
29
  title:'Config',
30
30
  layout:'fit',
31
- modal:true,
31
+ modal:true,
32
32
  width:window.innerWidth*.9,
33
33
  height:window.innerHeight*.9,
34
- closeAction:'destroy',
35
- buttons:[{
36
- text:'Submit',
37
- handler:function(){this.ownerCt.closeRes = 'OK'; this.ownerCt.destroy()}
38
- }]
34
+ closeAction:'destroy',
35
+ buttons:[{
36
+ text:'Submit',
37
+ handler:function(){this.ownerCt.closeRes = 'OK'; this.ownerCt.destroy()}
38
+ }]
39
39
 
40
- });
40
+ });
41
41
 
42
- w.show(null, function(){
42
+ w.show(null, function(){
43
43
  w.loadWidget(this.initialConfig.id+"__properties__get_widget");
44
- }, this);
44
+ }, this);
45
45
 
46
- w.on('destroy', function(){
47
- if (w.closeRes == 'OK'){
46
+ w.on('destroy', function(){
47
+ if (w.closeRes == 'OK'){
48
48
  widget = this;
49
- if (widget.ownerCt) {
49
+ if (widget.ownerCt) {
50
50
  widget.ownerCt.loadWidget(widget.initialConfig.interface.getWidget);
51
51
  } else {
52
52
  this.feedback('Reload current window') // no aggregation
53
53
  }
54
- }
55
- }, this)
54
+ }
55
+ }, this)
56
56
  }
57
57
  JS
58
58
  })
@@ -47,7 +47,7 @@ module Netzke
47
47
  url:this.initialConfig.interface.loadSource,
48
48
  success:function(r){
49
49
  var m = Ext.decode(r.responseText);
50
- this.setSource(m.source);
50
+ this.setSource(m.source);
51
51
  // this.feedback(m.flash);
52
52
  },
53
53
  scope:this
@@ -4,9 +4,9 @@ module Netzke
4
4
  # make us an invisible 'fit'-layout panel
5
5
  super.merge({
6
6
  :layout => 'fit',
7
- :title => false,
7
+ :title => false,
8
8
  :border => false,
9
- :items => ["new Ext.componentCache[config.itemConfig.widgetClassName](config.itemConfig)".l]
9
+ :items => ["new Ext.componentCache[config.itemConfig.widgetClassName](config.itemConfig)".l]
10
10
  })
11
11
  end
12
12
 
@@ -2,15 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{netzke-basepack}
5
- s.version = "0.3.0"
5
+ s.version = "0.3.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Sergei Kozlov"]
9
- s.date = %q{2009-01-25}
9
+ s.date = %q{2009-01-28}
10
10
  s.description = %q{Base Netzke widgets - grid, form, tree, and more}
11
11
  s.email = %q{sergei@writelesscode.com}
12
- s.extra_rdoc_files = ["CHANGELOG", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/basic_app.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "README.rdoc", "tasks/netzke_basepack_tasks.rake"]
13
- s.files = ["CHANGELOG", "css/basepack.css", "generators/netzke_basepack/netzke_basepack_generator.rb", "generators/netzke_basepack/USAGE", "generators/netzke_form_panel/netzke_form_panel_generator.rb", "generators/netzke_form_panel/templates/create_netzke_form_panel_fields.rb", "generators/netzke_grid_panel/netzke_grid_panel_generator.rb", "generators/netzke_grid_panel/templates/create_netzke_grid_panel_columns.rb", "init.rb", "install.rb", "javascripts/basepack.js", "javascripts/filters.js", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/basic_app.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "Manifest", "Rakefile", "README.rdoc", "tasks/netzke_basepack_tasks.rake", "test/app_root/app/controllers/application.rb", "test/app_root/app/models/book.rb", "test/app_root/app/models/category.rb", "test/app_root/app/models/city.rb", "test/app_root/app/models/continent.rb", "test/app_root/app/models/country.rb", "test/app_root/app/models/genre.rb", "test/app_root/config/boot.rb", "test/app_root/config/database.yml", "test/app_root/config/environment.rb", "test/app_root/config/environments/in_memory.rb", "test/app_root/config/environments/mysql.rb", "test/app_root/config/environments/postgresql.rb", "test/app_root/config/environments/sqlite.rb", "test/app_root/config/environments/sqlite3.rb", "test/app_root/config/routes.rb", "test/app_root/db/migrate/20081222033343_create_books.rb", "test/app_root/db/migrate/20081222033440_create_genres.rb", "test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb", "test/app_root/db/migrate/20081223024935_create_categories.rb", "test/app_root/db/migrate/20081223025635_create_countries.rb", "test/app_root/db/migrate/20081223025653_create_continents.rb", "test/app_root/db/migrate/20081223025732_create_cities.rb", "test/app_root/db/migrate/20090102223630_create_netzke_layouts.rb", "test/app_root/db/migrate/20090102223811_create_netzke_grid_panel_columns.rb", "test/app_root/script/console", "test/app_root/vendor/plugins/acts_as_list/init.rb", "test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb", "test/app_root/vendor/plugins/acts_as_list/README", "test/ar_ext_test.rb", "test/border_layout_panel_test.rb", "test/column_test.rb", "test/console_with_fixtures.rb", "test/fixtures/books.yml", "test/fixtures/categories.yml", "test/fixtures/cities.yml", "test/fixtures/continents.yml", "test/fixtures/countries.yml", "test/fixtures/genres.yml", "test/grid_panel_test.rb", "test/netzke_basepack_test.rb", "test/schema.rb", "test/test_helper.rb", "uninstall.rb", "netzke-basepack.gemspec"]
12
+ s.extra_rdoc_files = ["CHANGELOG", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/basic_app.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/fields_configurator.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "README.rdoc", "tasks/netzke_basepack_tasks.rake"]
13
+ s.files = ["CHANGELOG", "css/basepack.css", "generators/netzke_basepack/netzke_basepack_generator.rb", "generators/netzke_basepack/USAGE", "generators/netzke_form_panel/netzke_form_panel_generator.rb", "generators/netzke_form_panel/templates/create_netzke_form_panel_fields.rb", "generators/netzke_grid_panel/netzke_grid_panel_generator.rb", "generators/netzke_grid_panel/templates/create_netzke_grid_panel_columns.rb", "init.rb", "install.rb", "javascripts/basepack.js", "javascripts/check_column.js", "javascripts/filters.js", "lib/app/models/netzke_form_panel_field.rb", "lib/app/models/netzke_grid_panel_column.rb", "lib/netzke/accordion_panel.rb", "lib/netzke/ar_ext.rb", "lib/netzke/basic_app.rb", "lib/netzke/border_layout_panel.rb", "lib/netzke/column.rb", "lib/netzke/container.rb", "lib/netzke/fields_configurator.rb", "lib/netzke/form_panel.rb", "lib/netzke/grid_panel.rb", "lib/netzke/grid_panel_interface.rb", "lib/netzke/grid_panel_js_builder.rb", "lib/netzke/panel.rb", "lib/netzke/preference_grid.rb", "lib/netzke/properties_tool.rb", "lib/netzke/property_grid.rb", "lib/netzke/wrapper.rb", "lib/netzke-basepack.rb", "LICENSE", "Manifest", "Rakefile", "README.rdoc", "tasks/netzke_basepack_tasks.rake", "test/app_root/app/controllers/application.rb", "test/app_root/app/models/book.rb", "test/app_root/app/models/category.rb", "test/app_root/app/models/city.rb", "test/app_root/app/models/continent.rb", "test/app_root/app/models/country.rb", "test/app_root/app/models/genre.rb", "test/app_root/config/boot.rb", "test/app_root/config/database.yml", "test/app_root/config/environment.rb", "test/app_root/config/environments/in_memory.rb", "test/app_root/config/environments/mysql.rb", "test/app_root/config/environments/postgresql.rb", "test/app_root/config/environments/sqlite.rb", "test/app_root/config/environments/sqlite3.rb", "test/app_root/config/routes.rb", "test/app_root/db/migrate/20081222033343_create_books.rb", "test/app_root/db/migrate/20081222033440_create_genres.rb", "test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb", "test/app_root/db/migrate/20081223024935_create_categories.rb", "test/app_root/db/migrate/20081223025635_create_countries.rb", "test/app_root/db/migrate/20081223025653_create_continents.rb", "test/app_root/db/migrate/20081223025732_create_cities.rb", "test/app_root/db/migrate/20090102223630_create_netzke_layouts.rb", "test/app_root/db/migrate/20090102223811_create_netzke_grid_panel_columns.rb", "test/app_root/script/console", "test/app_root/vendor/plugins/acts_as_list/init.rb", "test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb", "test/app_root/vendor/plugins/acts_as_list/README", "test/ar_ext_test.rb", "test/border_layout_panel_test.rb", "test/column_test.rb", "test/console_with_fixtures.rb", "test/fixtures/books.yml", "test/fixtures/categories.yml", "test/fixtures/cities.yml", "test/fixtures/continents.yml", "test/fixtures/countries.yml", "test/fixtures/genres.yml", "test/grid_panel_test.rb", "test/netzke_basepack_test.rb", "test/schema.rb", "test/test_helper.rb", "uninstall.rb", "netzke-basepack.gemspec"]
14
14
  s.has_rdoc = true
15
15
  s.homepage = %q{http://writelesscode.com}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Netzke-basepack", "--main", "README.rdoc"]
@@ -26,13 +26,13 @@ Gem::Specification.new do |s|
26
26
 
27
27
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
28
28
  s.add_runtime_dependency(%q<searchlogic>, [">= 1.6.2"])
29
- s.add_runtime_dependency(%q<netzke-core>, [">= 0", "= 0.2.3"])
29
+ s.add_runtime_dependency(%q<netzke-core>, [">= 0", "= 0.2.4"])
30
30
  else
31
31
  s.add_dependency(%q<searchlogic>, [">= 1.6.2"])
32
- s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.3"])
32
+ s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.4"])
33
33
  end
34
34
  else
35
35
  s.add_dependency(%q<searchlogic>, [">= 1.6.2"])
36
- s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.3"])
36
+ s.add_dependency(%q<netzke-core>, [">= 0", "= 0.2.4"])
37
37
  end
38
38
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netzke-basepack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergei Kozlov
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-25 00:00:00 -06:00
12
+ date: 2009-01-28 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: "0"
34
34
  - - "="
35
35
  - !ruby/object:Gem::Version
36
- version: 0.2.3
36
+ version: 0.2.4
37
37
  version:
38
38
  description: Base Netzke widgets - grid, form, tree, and more
39
39
  email: sergei@writelesscode.com
@@ -51,6 +51,7 @@ extra_rdoc_files:
51
51
  - lib/netzke/border_layout_panel.rb
52
52
  - lib/netzke/column.rb
53
53
  - lib/netzke/container.rb
54
+ - lib/netzke/fields_configurator.rb
54
55
  - lib/netzke/form_panel.rb
55
56
  - lib/netzke/grid_panel.rb
56
57
  - lib/netzke/grid_panel_interface.rb
@@ -76,6 +77,7 @@ files:
76
77
  - init.rb
77
78
  - install.rb
78
79
  - javascripts/basepack.js
80
+ - javascripts/check_column.js
79
81
  - javascripts/filters.js
80
82
  - lib/app/models/netzke_form_panel_field.rb
81
83
  - lib/app/models/netzke_grid_panel_column.rb
@@ -85,6 +87,7 @@ files:
85
87
  - lib/netzke/border_layout_panel.rb
86
88
  - lib/netzke/column.rb
87
89
  - lib/netzke/container.rb
90
+ - lib/netzke/fields_configurator.rb
88
91
  - lib/netzke/form_panel.rb
89
92
  - lib/netzke/grid_panel.rb
90
93
  - lib/netzke/grid_panel_interface.rb