netzke-basepack 0.3.0 → 0.3.1

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.
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