netzke-basepack 0.3.10 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/CHANGELOG +10 -0
  2. data/Manifest +12 -16
  3. data/Rakefile +1 -1
  4. data/TODO +3 -1
  5. data/autotest/discover.rb +3 -0
  6. data/javascripts/basepack.js +680 -52
  7. data/lib/app/models/netzke_hash_record.rb +180 -0
  8. data/lib/app/models/netzke_layout_item.rb +11 -0
  9. data/lib/netzke/ar_ext.rb +57 -34
  10. data/lib/netzke/border_layout_panel.rb +0 -1
  11. data/lib/netzke/db_fields.rb +4 -0
  12. data/lib/netzke/field_model.rb +131 -0
  13. data/lib/netzke/fields_configurator.rb +13 -5
  14. data/lib/netzke/fields_configurator_old.rb +62 -0
  15. data/lib/netzke/form_panel.rb +18 -24
  16. data/lib/netzke/form_panel_extras/interface.rb +20 -13
  17. data/lib/netzke/form_panel_extras/js_builder.rb +4 -1
  18. data/lib/netzke/grid_panel.rb +37 -40
  19. data/lib/netzke/grid_panel_extras/interface.rb +22 -18
  20. data/lib/netzke/grid_panel_extras/js_builder.rb +42 -13
  21. data/lib/netzke/property_editor_extras/helper_model.rb +2 -1
  22. data/lib/netzke/tab_panel.rb +15 -11
  23. data/netzke-basepack.gemspec +10 -10
  24. data/test/{accordion_panel_test.rb → unit/accordion_panel_test.rb} +0 -0
  25. data/test/{ar_ext_test.rb → unit/ar_ext_test.rb} +3 -9
  26. data/test/{grid_panel_test.rb → unit/grid_panel_test.rb} +0 -5
  27. data/test/{netzke_basepack_test.rb → unit/netzke_basepack_test.rb} +0 -0
  28. data/test/unit/netzke_hash_record_test.rb +52 -0
  29. data/test/unit/netzke_layout_item_test.rb +28 -0
  30. data/test/{tab_panel_test.rb → unit/tab_panel_test.rb} +0 -0
  31. metadata +30 -30
  32. data/generators/netzke_basepack/USAGE +0 -8
  33. data/generators/netzke_basepack/netzke_basepack_generator.rb +0 -8
  34. data/generators/netzke_form_panel/netzke_form_panel_generator.rb +0 -7
  35. data/generators/netzke_form_panel/templates/create_netzke_form_panel_fields.rb +0 -21
  36. data/generators/netzke_grid_panel/netzke_grid_panel_generator.rb +0 -7
  37. data/generators/netzke_grid_panel/templates/create_netzke_grid_panel_columns.rb +0 -24
  38. data/lib/app/models/netzke_form_panel_field.rb +0 -51
  39. data/lib/app/models/netzke_grid_panel_column.rb +0 -56
  40. data/lib/netzke/form_panel_extras/javascripts/xdatetime.js +0 -634
  41. data/test/app_root/db/migrate/20090102223811_create_netzke_grid_panel_columns.rb +0 -23
  42. data/test/border_layout_panel_test.rb +0 -25
@@ -9,9 +9,8 @@ module Netzke
9
9
  def initialize(*args)
10
10
  super
11
11
 
12
- config[:conditions] = {:layout_id => config[:layout].id}
13
- config[:data_class_name] = config[:layout].items_class
14
- # config[:persistent_layout] = false
12
+ NetzkeLayoutItem.widget = config[:widget].id_name
13
+ config[:data_class_name] = "NetzkeLayoutItem"
15
14
  end
16
15
 
17
16
  def initial_config
@@ -53,10 +52,19 @@ module Netzke
53
52
  end
54
53
 
55
54
  def load_defaults(params)
56
- NetzkeLayout.destroy(config[:layout].id)
57
- config[:data_class_name].constantize.create_layout_for_widget(parent.parent)
55
+ persistent_config.for_widget(config[:widget].id_name){ |p| p[:layout__columns] = config[:widget].default_db_fields }
56
+ # NetzkeLayoutItem.data = config[:widget].default_db_fields
58
57
  {}
59
58
  end
60
59
 
60
+ def default_db_fields_with_widget_change
61
+ NetzkeLayoutItem.widget = config[:widget].id_name
62
+ res = default_db_fields_without_widget_change
63
+ NetzkeLayoutItem.widget = id_name
64
+ res
65
+ end
66
+
67
+ alias_method_chain :default_db_fields, :widget_change
68
+
61
69
  end
62
70
  end
@@ -0,0 +1,62 @@
1
+ module Netzke
2
+ class FieldsConfigurator < GridPanel
3
+ interface :load_defaults
4
+
5
+ def self.js_base_class
6
+ GridPanel
7
+ end
8
+
9
+ def initialize(*args)
10
+ super
11
+
12
+ config[:conditions] = {:layout_id => config[:layout].id}
13
+ config[:data_class_name] = config[:layout].items_class
14
+ # config[:persistent_layout] = false
15
+ end
16
+
17
+ def initial_config
18
+ super.recursive_merge({
19
+ :name => 'columns',
20
+ :widget_class_name => "GridPanel",
21
+ :ext_config => {:title => false}
22
+ })
23
+ end
24
+
25
+ def actions
26
+ super.merge(
27
+ :defaults => {:text => 'Restore defaults'}
28
+ )
29
+ end
30
+
31
+ def bbar
32
+ super << "-" << "defaults"
33
+ end
34
+
35
+ def self.js_extend_properties
36
+ super.merge({
37
+ :defaults => <<-JS.l,
38
+ function(){
39
+ Ext.Msg.confirm('Confirm', 'Are you sure?', function(btn){
40
+ if (btn == 'yes') {
41
+ Ext.Ajax.request({
42
+ url:this.initialConfig.interface.loadDefaults,
43
+ callback:function(){
44
+ this.store.reload();
45
+ },
46
+ scope:this
47
+ })
48
+ }
49
+ }, this);
50
+ }
51
+ JS
52
+ })
53
+ end
54
+
55
+ def load_defaults(params)
56
+ NetzkeLayout.destroy(config[:layout].id)
57
+ config[:data_class_name].constantize.create_layout_for_widget(parent.parent)
58
+ {}
59
+ end
60
+
61
+ end
62
+ end
@@ -3,7 +3,6 @@ module Netzke
3
3
  # Class-level configuration with defaults
4
4
  def self.config
5
5
  set_default_config({
6
- :field_manager => "NetzkeFormPanelField",
7
6
  })
8
7
  end
9
8
 
@@ -12,9 +11,9 @@ module Netzke
12
11
  include Netzke::DbFields # database field operations
13
12
 
14
13
  # extra javascripts
15
- js_include %w{ xcheckbox xdatetime }.map{|js| "#{File.dirname(__FILE__)}/form_panel_extras/javascripts/#{js}.js"}
14
+ js_include %w{ xcheckbox }.map{|js| "#{File.dirname(__FILE__)}/form_panel_extras/javascripts/#{js}.js"}
16
15
 
17
- interface :submit, :load
16
+ interface :submit, :load, :get_cb_choices
18
17
 
19
18
  def self.widget_type
20
19
  :form
@@ -34,19 +33,18 @@ module Netzke
34
33
 
35
34
  def configuration_widgets
36
35
  res = []
36
+
37
37
  res << {
38
38
  :name => 'fields',
39
39
  :widget_class_name => "FieldsConfigurator",
40
- :ext_config => {:title => false},
41
40
  :active => true,
42
- :layout => NetzkeLayout.by_widget(id_name),
43
- :fields_for => :form
41
+ :widget => self
44
42
  } if config[:persistent_layout]
45
43
 
46
44
  res << {
47
45
  :name => 'general',
48
46
  :widget_class_name => "PropertyEditor",
49
- :widget_name => id_name,
47
+ :widget_name => id_name,
50
48
  :ext_config => {:title => false}
51
49
  }
52
50
 
@@ -67,35 +65,31 @@ module Netzke
67
65
  persistent_config[:bottom_bar] ||= config[:bbar] == false ? nil : config[:bbar] || %w{ apply }
68
66
  end
69
67
 
70
- # get fields from layout manager
71
- def get_fields
72
- @fields ||=
73
- if config[:persistent_layout] && layout_manager_class && field_manager_class
74
- layout = layout_manager_class.by_widget(id_name)
75
- layout ||= field_manager_class.create_layout_for_widget(self)
76
- layout.items_arry_without_hidden
77
- else
78
- default_db_fields
79
- end
68
+ def fields
69
+ @@fields ||= get_fields
80
70
  end
81
71
 
82
72
  # parameters used to instantiate the JS object
83
73
  def js_config
84
74
  res = super
85
- # we pass column config at the time of instantiating the JS class
86
- res.merge!(:fields => get_fields || config[:fields]) # first try to get columns from DB, then from config
75
+ res.merge!(:fields => fields)
87
76
  res.merge!(:data_class_name => config[:data_class_name])
88
- res.merge!(:record_data => config[:record].to_array(get_fields)) if config[:record]
77
+ res.merge!(:record_data => config[:record].to_array(fields)) if config[:record]
89
78
  res
90
79
  end
91
80
 
92
81
  protected
93
82
 
94
- def field_manager_class
95
- self.class.config[:field_manager].constantize
96
- rescue NameError
97
- nil
83
+ def get_fields
84
+ if config[:persistent_layout]
85
+ NetzkeLayoutItem.widget = id_name
86
+ NetzkeLayoutItem.data = default_db_fields if NetzkeLayoutItem.all.empty?
87
+ NetzkeLayoutItem.all
88
+ else
89
+ default_db_fields
90
+ end.map{ |r| r.reject{ |k,v| k == :id } }
98
91
  end
92
+
99
93
 
100
94
  # def available_permissions
101
95
  # %w{ read update }
@@ -10,22 +10,20 @@ module Netzke
10
10
  record = klass.find_by_id(params[:id])
11
11
  success = true
12
12
 
13
- if record.nil?
14
- record = klass.create(params)
15
- else
16
- params.each_pair do |k,v|
17
- begin
18
- record.send("#{k}=",v)
19
- rescue ArgumentError => exc
20
- flash :error => exc.message
21
- success = false
22
- break
23
- end
13
+ record = klass.new if record.nil?
14
+
15
+ params.each_pair do |k,v|
16
+ begin
17
+ record.send("#{k}=",v)
18
+ rescue StandardError => exc
19
+ flash :error => exc.message
20
+ success = false
21
+ break
24
22
  end
25
23
  end
26
24
 
27
25
  if success && record.save
28
- {:data => [record.to_array(get_fields)], :success => true}
26
+ {:data => [record.to_array(fields)], :success => true}
29
27
  else
30
28
  # flash eventual errors
31
29
  record.errors.each_full do |msg|
@@ -42,8 +40,17 @@ module Netzke
42
40
  when "next" then record = klass.next(params[:id])
43
41
  else record = klass.find(params[:id])
44
42
  end
45
- {:data => [record && record.to_array(get_fields)]}
43
+ {:data => [record && record.to_array(fields)]}
44
+ end
45
+
46
+ # Return the choices for the column
47
+ def get_cb_choices(params)
48
+ column = params[:column]
49
+ query = params[:query]
50
+
51
+ {:data => config[:data_class_name].constantize.choices_for(column, query).map{|s| [s]}}
46
52
  end
53
+
47
54
  end
48
55
  end
49
56
  end
@@ -30,7 +30,10 @@ module Netzke
30
30
  }
31
31
  delete(field.extConfig);
32
32
  Ext.apply(field, extConfig);
33
- });
33
+
34
+ field.parentConfig = config;
35
+ field.fieldConfig = field;
36
+ }, this);
34
37
  var Record = Ext.data.Record.create(recordFields);
35
38
  this.reader = new Ext.data.RecordArrayReader({root:"data"}, Record);
36
39
  JS
@@ -1,5 +1,4 @@
1
1
  require 'searchlogic'
2
- require "app/models/netzke_grid_panel_column"
3
2
 
4
3
  module Netzke
5
4
  #
@@ -16,11 +15,16 @@ module Netzke
16
15
  # * properties and column configuration
17
16
  #
18
17
  class GridPanel < Base
19
- # Class-level configuration with defaults
18
+ # Class-level configuration and its defaults
20
19
  def self.config
21
20
  set_default_config({
22
- :column_manager => "NetzkeGridPanelColumn",
23
- :enable_filters => true
21
+ :enable_filters => true,
22
+ :config_tool_enabled_by_default => false,
23
+ :column_move_enabled_by_default => true,
24
+ :column_hide_enabled_by_default => true,
25
+ :column_resize_enabled_by_default => true,
26
+ :persistent_layout_enabled_by_default => true,
27
+ :persistent_config_enabled_by_default => true
24
28
  })
25
29
  end
26
30
 
@@ -42,7 +46,7 @@ module Netzke
42
46
 
43
47
  # define connection points between client side and server side of GridPanel.
44
48
  # See implementation of equally named methods in the GridPanelExtras::Interface module.
45
- interface :get_data, :post_data, :delete_data, :resize_column, :move_column, :get_cb_choices
49
+ interface :get_data, :post_data, :delete_data, :resize_column, :move_column, :hide_column, :get_cb_choices
46
50
 
47
51
  # widget type for DbFields
48
52
  # TODO: ugly, rethink
@@ -50,27 +54,18 @@ module Netzke
50
54
  :grid
51
55
  end
52
56
 
53
- def self.column_manager_class
54
- config[:column_manager].constantize
55
- rescue
56
- nil
57
- end
58
-
59
- def column_manager_class
60
- self.class.column_manager_class
61
- end
62
-
63
57
  # default instance-level configuration
64
58
  def initial_config
65
59
  {
66
60
  :ext_config => {
67
- :config_tool => true,
68
- :enable_column_filters => Netzke::GridPanel.config[:enable_filters],
69
- :enable_column_move => true,
70
- :enable_column_resize => true
61
+ :config_tool => self.class.config[:config_tool_enabled_by_default],
62
+ :enable_column_filters => self.class.config[:enable_filters],
63
+ :enable_column_move => self.class.config[:column_move_enabled_by_default],
64
+ :enable_column_hide => self.class.config[:column_hide_enabled_by_default],
65
+ :enable_column_resize => self.class.config[:column_resize_enabled_by_default]
71
66
  },
72
- :persistent_layout => true,
73
- :persistent_config => true
67
+ :persistent_layout => self.class.config[:persistent_layout_enabled_by_default],
68
+ :persistent_config => self.class.config[:persistent_config_enabled_by_default]
74
69
  }
75
70
  end
76
71
 
@@ -83,48 +78,40 @@ module Netzke
83
78
  res << {
84
79
  :name => 'columns',
85
80
  :widget_class_name => "FieldsConfigurator",
86
- :ext_config => {:title => false},
87
81
  :active => true,
88
- :layout => NetzkeLayout.by_widget(id_name)
82
+ :widget => self,
83
+ :persistent_layout => true
89
84
  } if config[:persistent_layout]
90
85
 
91
86
  res << {
92
87
  :name => 'general',
93
88
  :widget_class_name => "PropertyEditor",
94
- :widget_name => id_name,
89
+ :widget_name => id_name,
95
90
  :ext_config => {:title => false}
96
91
  }
97
92
 
98
93
  res
99
94
  end
100
95
 
101
- # get columns from layout manager
102
- def get_columns
103
- @columns ||=
104
- if config[:persistent_layout] && layout_manager_class && column_manager_class
105
- layout = layout_manager_class.by_widget(id_name)
106
- layout ||= column_manager_class.create_layout_for_widget(self)
107
- layout.items_arry
108
- else
109
- default_db_fields
110
- end
111
- end
112
-
113
96
  def tools
114
97
  %w{ refresh }
115
98
  end
116
99
 
117
100
  def actions
118
- { :add => {:text => 'Add', :disabled => !@permissions[:create]},
119
- :edit => {:text => 'Edit', :disabled => !@permissions[:update]},
120
- :delete => {:text => 'Delete', :disabled => !@permissions[:delete]},
121
- :apply => {:text => 'Apply', :disabled => !@permissions[:update] && !@permissions[:create]}
101
+ { :add => {:text => 'Add', :disabled => !@permissions[:create]},
102
+ :edit => {:text => 'Edit', :disabled => !@permissions[:update]},
103
+ :delete => {:text => 'Delete', :disabled => !@permissions[:delete]},
104
+ :apply => {:text => 'Apply', :disabled => !@permissions[:update] && !@permissions[:create]}
122
105
  }
123
106
  end
124
107
 
125
108
  def bbar
126
109
  persistent_config[:bottom_bar] ||= config[:bbar] == false ? nil : config[:bbar] || %w{ add edit apply delete }
127
110
  end
111
+
112
+ def columns
113
+ @columns ||= get_columns
114
+ end
128
115
 
129
116
  include ConfigurationTool # it will load aggregation with name :properties into a modal window
130
117
 
@@ -133,6 +120,16 @@ module Netzke
133
120
  def available_permissions
134
121
  %w(read update create delete)
135
122
  end
123
+
124
+ def get_columns
125
+ if config[:persistent_layout]
126
+ NetzkeLayoutItem.widget = id_name
127
+ NetzkeLayoutItem.data = default_db_fields if NetzkeLayoutItem.all.empty?
128
+ NetzkeLayoutItem.all
129
+ else
130
+ default_db_fields
131
+ end
132
+ end
136
133
 
137
134
  end
138
135
  end
@@ -40,20 +40,35 @@ module Netzke
40
40
 
41
41
  def resize_column(params)
42
42
  raise "Called interface_resize_column while not configured to do so" unless config[:ext_config][:enable_column_resize]
43
- if config[:persistent_layout] && layout_manager_class
44
- l_item = layout_manager_class.by_widget(id_name).items[params[:index].to_i]
45
- l_item.width = params[:size]
46
- l_item.save!
43
+ if config[:persistent_layout]
44
+ NetzkeLayoutItem.widget = id_name
45
+ column = NetzkeLayoutItem.find(params[:index].to_i + 1)
46
+ column.width = params[:size].to_i
47
+ column.save
48
+ end
49
+ {}
50
+ end
51
+
52
+ def hide_column(params)
53
+ raise "Called interface_hide_column while not configured to do so" unless config[:ext_config][:enable_column_hide]
54
+ if config[:persistent_layout]
55
+ NetzkeLayoutItem.widget = id_name
56
+ column = NetzkeLayoutItem.find(params[:index].to_i + 1)
57
+ column.hidden = params[:hidden].to_b
58
+ column.save
47
59
  end
48
60
  {}
49
61
  end
50
62
 
51
63
  def move_column(params)
52
64
  raise "Called interface_move_column while not configured to do so" unless config[:ext_config][:enable_column_move]
53
- if config[:persistent_layout] && layout_manager_class
54
- layout_manager_class.by_widget(id_name).move_item(params[:old_index].to_i, params[:new_index].to_i)
65
+ if config[:persistent_layout]
66
+ NetzkeLayoutItem.widget = id_name
67
+ NetzkeLayoutItem.move_item(params[:old_index].to_i, params[:new_index].to_i)
55
68
  end
56
- {}
69
+
70
+ # provide the client side with the new columns order
71
+ {:columns => columns.map(&:name)}
57
72
  end
58
73
 
59
74
  # Return the choices for the column
@@ -117,19 +132,8 @@ module Netzke
117
132
 
118
133
  raise ArgumentError, "No data_class_name specified for widget '#{config[:name]}'" if !config[:data_class_name]
119
134
  records = config[:data_class_name].constantize.all(search_params.clone) # clone needed as searchlogic removes :conditions key from the hash
120
- # output_array = []
121
- columns = get_columns
122
135
  output_array = records.map{|r| r.to_array(columns)}
123
136
 
124
- # records.each do |r|
125
- # r_array = []
126
- # self.get_columns.each do |column|
127
- # r_array << r.send(column[:name])
128
- # end
129
- # output_array << r_array
130
- # output_array << r.to_array(columns)
131
- # end
132
-
133
137
  # add total_entries accessor to the result
134
138
  class << output_array
135
139
  attr :total_records, true