skozlov-netzke-basepack 0.1.1.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +1 -0
- data/.gitignore +5 -0
- data/LICENSE +2 -19
- data/README.rdoc +87 -0
- data/Rakefile +28 -12
- data/TODO.rdoc +7 -0
- data/VERSION +1 -0
- data/autotest/discover.rb +3 -0
- data/init.rb +0 -1
- data/javascripts/basepack.js +839 -49
- data/lib/app/models/netzke_auto_column.rb +56 -0
- data/lib/netzke/accordion_panel.rb +113 -0
- data/lib/netzke/active_record/basepack.rb +104 -0
- data/lib/netzke/active_record/data_accessor.rb +21 -0
- data/lib/netzke/basic_app.rb +325 -0
- data/lib/netzke/border_layout_panel.rb +128 -0
- data/lib/netzke/configuration_panel.rb +24 -0
- data/lib/netzke/data_accessor.rb +71 -0
- data/lib/netzke/ext.rb +6 -0
- data/lib/netzke/field_model.rb +131 -0
- data/lib/netzke/fields_configurator.rb +95 -0
- data/lib/netzke/form_panel.rb +214 -0
- data/lib/netzke/form_panel_api.rb +74 -0
- data/lib/netzke/form_panel_extras/javascripts/xcheckbox.js +82 -0
- data/lib/netzke/form_panel_js.rb +129 -0
- data/lib/netzke/grid_panel.rb +442 -0
- data/lib/netzke/grid_panel_api.rb +352 -0
- data/lib/netzke/grid_panel_extras/javascripts/check-column.js +33 -0
- data/{javascripts → lib/netzke/grid_panel_extras/javascripts}/filters.js +0 -0
- data/lib/netzke/grid_panel_extras/javascripts/rows-dd.js +280 -0
- data/lib/netzke/grid_panel_js.rb +721 -0
- data/lib/netzke/panel.rb +13 -0
- data/lib/netzke/plugins/configuration_tool.rb +121 -0
- data/lib/netzke/property_editor.rb +105 -0
- data/lib/netzke/property_editor_extras/helper_model.rb +126 -0
- data/lib/netzke/search_panel.rb +62 -0
- data/lib/netzke/tab_panel.rb +160 -0
- data/lib/netzke/table_editor.rb +118 -0
- data/lib/netzke/tree_panel.rb +73 -0
- data/lib/netzke/wrapper.rb +42 -0
- data/lib/netzke-basepack.rb +9 -15
- data/netzke-basepack.gemspec +147 -20
- data/stylesheets/basepack.css +26 -0
- data/test/app_root/app/models/book.rb +1 -1
- data/test/app_root/config/environment.rb +1 -0
- data/test/app_root/db/migrate/20081222033440_create_genres.rb +1 -0
- data/test/app_root/db/migrate/20081222035855_create_netzke_preferences.rb +1 -1
- data/test/app_root/db/migrate/20090102223630_create_netzke_layouts.rb +14 -0
- data/test/app_root/vendor/plugins/acts_as_list/README +23 -0
- data/test/app_root/vendor/plugins/acts_as_list/init.rb +3 -0
- data/test/app_root/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +256 -0
- data/test/test_helper.rb +1 -2
- data/test/unit/accordion_panel_test.rb +20 -0
- data/test/unit/active_record_basepack_test.rb +54 -0
- data/test/unit/grid_panel_test.rb +43 -0
- data/test/unit/helper_model_test.rb +30 -0
- data/test/unit/netzke_basepack_test.rb +4 -0
- data/test/unit/tab_panel_test.rb +21 -0
- metadata +96 -72
- data/CHANGELOG +0 -14
- data/Manifest +0 -65
- data/README.mdown +0 -18
- data/generators/netzke_basepack/USAGE +0 -8
- data/generators/netzke_basepack/netzke_basepack_generator.rb +0 -8
- data/generators/netzke_basepack/netzke_grid_generator.rb +0 -7
- data/generators/netzke_basepack/templates/create_netzke_grid_columns.rb +0 -21
- data/lib/app/models/netzke_grid_column.rb +0 -23
- data/lib/netzke/accordion.rb +0 -11
- data/lib/netzke/ar_ext.rb +0 -163
- data/lib/netzke/column.rb +0 -43
- data/lib/netzke/container.rb +0 -81
- data/lib/netzke/grid.rb +0 -120
- data/lib/netzke/grid_interface.rb +0 -156
- data/lib/netzke/grid_js_builder.rb +0 -276
- data/lib/netzke/preference_grid.rb +0 -43
- data/lib/netzke/properties_tool.rb +0 -66
- data/lib/netzke/property_grid.rb +0 -60
- data/test/ar_ext_test.rb +0 -39
- data/test/column_test.rb +0 -27
- data/test/grid_test.rb +0 -43
- data/test/netzke_basepack_test.rb +0 -8
@@ -0,0 +1,214 @@
|
|
1
|
+
module Netzke
|
2
|
+
# = FormPanel
|
3
|
+
#
|
4
|
+
# Represents Ext.form.FormPanel
|
5
|
+
#
|
6
|
+
# == Configuration
|
7
|
+
# * <tt>:data_class_name</tt> - name of the ActiveRecord model that provides data to this GridPanel.
|
8
|
+
# * <tt>:record</tt> - record to be displayd in the form. Takes precedence over <tt>:record_id</tt>
|
9
|
+
# * <tt>:record_id</tt> - id of the record to be displayd in the form. Also see <tt>:record</tt>
|
10
|
+
#
|
11
|
+
# In the <tt>:ext_config</tt> hash (see Netzke::Base) the following FormPanel specific options are available:
|
12
|
+
#
|
13
|
+
# * <tt>:mode</tt> - when set to <tt>:config</tt>, FormPanel loads in configuration mode
|
14
|
+
class FormPanel < Base
|
15
|
+
include Netzke::FormPanelJs # javascript (client-side)
|
16
|
+
include Netzke::FormPanelApi # API (server-side)
|
17
|
+
include Netzke::DataAccessor # some code shared between GridPanel, FormPanel, and other widgets that use database attributes
|
18
|
+
|
19
|
+
# Class-level configuration with defaults
|
20
|
+
def self.config
|
21
|
+
set_default_config({
|
22
|
+
:config_tool_available => true,
|
23
|
+
|
24
|
+
:default_config => {
|
25
|
+
:ext_config => {
|
26
|
+
:bbar => %w{ apply },
|
27
|
+
:tools => %w{ }
|
28
|
+
},
|
29
|
+
:persistent_config => false
|
30
|
+
}
|
31
|
+
})
|
32
|
+
end
|
33
|
+
|
34
|
+
# Extra javascripts
|
35
|
+
def self.include_js
|
36
|
+
[
|
37
|
+
"#{File.dirname(__FILE__)}/form_panel_extras/javascripts/xcheckbox.js"
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
api :submit, :load, :get_combobox_options
|
42
|
+
|
43
|
+
attr_accessor :record
|
44
|
+
|
45
|
+
def initialize(*args)
|
46
|
+
super
|
47
|
+
apply_helpers
|
48
|
+
@record = config[:record] || data_class && data_class.find_by_id(config[:record_id])
|
49
|
+
end
|
50
|
+
|
51
|
+
def data_class
|
52
|
+
@data_class ||= config[:data_class_name] && config[:data_class_name].constantize
|
53
|
+
end
|
54
|
+
|
55
|
+
def configuration_widgets
|
56
|
+
res = []
|
57
|
+
|
58
|
+
res << {
|
59
|
+
:name => 'fields',
|
60
|
+
:widget_class_name => "FieldsConfigurator",
|
61
|
+
:active => true,
|
62
|
+
:widget => self,
|
63
|
+
:persistent_config => true
|
64
|
+
}
|
65
|
+
|
66
|
+
res << {
|
67
|
+
:name => 'general',
|
68
|
+
:widget_class_name => "PropertyEditor",
|
69
|
+
:widget => self,
|
70
|
+
:ext_config => {:title => false}
|
71
|
+
}
|
72
|
+
|
73
|
+
res
|
74
|
+
end
|
75
|
+
|
76
|
+
def actions
|
77
|
+
{
|
78
|
+
:apply => {:text => 'Apply'}
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
def columns
|
83
|
+
@columns ||= get_columns.convert_keys{|k| k.to_sym}
|
84
|
+
end
|
85
|
+
|
86
|
+
# parameters used to instantiate the JS object
|
87
|
+
def js_config
|
88
|
+
res = super
|
89
|
+
res.merge!(:clmns => columns)
|
90
|
+
res.merge!(:data_class_name => config[:data_class_name])
|
91
|
+
res
|
92
|
+
end
|
93
|
+
|
94
|
+
# columns to be displayed by the FieldConfigurator (which is GridPanel-based)
|
95
|
+
def self.config_columns
|
96
|
+
[
|
97
|
+
{:name => :name, :type => :string, :editor => :combobox, :width => 200},
|
98
|
+
{:name => :hidden, :type => :boolean, :editor => :checkbox, :width => 40, :header => "Excl"},
|
99
|
+
{:name => :disabled, :type => :boolean, :editor => :checkbox, :width => 40, :header => "Dis"},
|
100
|
+
{:name => :xtype, :type => :string},
|
101
|
+
{:name => :value, :type => :string},
|
102
|
+
{:name => :field_label, :type => :string},
|
103
|
+
{:name => :input_type, :type => :string}
|
104
|
+
]
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.property_fields
|
108
|
+
res = [
|
109
|
+
{:name => :ext_config__title, :type => :string},
|
110
|
+
{:name => :ext_config__header, :type => :boolean, :default => true}
|
111
|
+
# {:name => :ext_config__bbar, :type => :json},
|
112
|
+
# {:name => :ext_config__prohibit_create, :type => :boolean},
|
113
|
+
# {:name => :ext_config__prohibit_update, :type => :boolean},
|
114
|
+
# {:name => :ext_config__prohibit_delete, :type => :boolean},
|
115
|
+
# {:name => :ext_config__prohibit_read, :type => :boolean}
|
116
|
+
]
|
117
|
+
|
118
|
+
res
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
# Normalized columns
|
123
|
+
def normalized_columns
|
124
|
+
@normalized_columns ||= normalize_columns(columns)
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
def get_columns
|
129
|
+
if config[:persistent_config]
|
130
|
+
persistent_config['layout__columns'] ||= default_columns
|
131
|
+
res = normalize_array_of_columns(persistent_config['layout__columns'])
|
132
|
+
else
|
133
|
+
res = default_columns
|
134
|
+
end
|
135
|
+
|
136
|
+
# merge values for each field if the record is specified
|
137
|
+
@record && res.map! do |c|
|
138
|
+
value = @record.send(normalize_column(c)[:name])
|
139
|
+
value.nil? ? c : normalize_column(c).merge(:value => value)
|
140
|
+
end
|
141
|
+
|
142
|
+
res
|
143
|
+
end
|
144
|
+
|
145
|
+
XTYPE_MAP = {
|
146
|
+
:integer => :numberfield,
|
147
|
+
:boolean => :xcheckbox,
|
148
|
+
:date => :datefield,
|
149
|
+
:datetime => :xdatetime,
|
150
|
+
:text => :textarea,
|
151
|
+
:json => :jsonfield
|
152
|
+
# :string => :textfield
|
153
|
+
}
|
154
|
+
|
155
|
+
def default_columns
|
156
|
+
# columns specified in widget's config
|
157
|
+
columns_from_config = config[:columns] && normalize_columns(config[:columns])
|
158
|
+
|
159
|
+
if columns_from_config
|
160
|
+
# reverse-merge each column hash from config with each column hash from exposed_attributes (columns from config have higher priority)
|
161
|
+
for c in columns_from_config
|
162
|
+
corresponding_exposed_column = predefined_columns.find{ |k| k[:name] == c[:name] }
|
163
|
+
c.reverse_merge!(corresponding_exposed_column) if corresponding_exposed_column
|
164
|
+
end
|
165
|
+
columns_for_create = columns_from_config
|
166
|
+
elsif predefined_columns
|
167
|
+
# we didn't have columns configured in widget's config, so, use the columns from the data class
|
168
|
+
columns_for_create = predefined_columns
|
169
|
+
else
|
170
|
+
raise ArgumentError, "No columns specified for widget '#{id_name}'"
|
171
|
+
end
|
172
|
+
|
173
|
+
columns_for_create.map! do |c|
|
174
|
+
if data_class
|
175
|
+
# Try to figure out the configuration from data class
|
176
|
+
# detect :assoc__method
|
177
|
+
if c[:name].to_s.index('__')
|
178
|
+
assoc_name, method = c[:name].to_s.split('__').map(&:to_sym)
|
179
|
+
if assoc = data_class.reflect_on_association(assoc_name)
|
180
|
+
assoc_column = assoc.klass.columns_hash[method.to_s]
|
181
|
+
assoc_method_type = assoc_column.try(:type)
|
182
|
+
if assoc_method_type
|
183
|
+
c[:xtype] ||= XTYPE_MAP[assoc_method_type] == :xcheckbox ? :xcheckbox : :combobox
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
# detect association column (e.g. :category_id)
|
189
|
+
if assoc = data_class.reflect_on_all_associations.detect{|a| a.primary_key_name.to_sym == c[:name]}
|
190
|
+
c[:xtype] ||= :combobox
|
191
|
+
assoc_method = %w{name title label id}.detect{|m| (assoc.klass.instance_methods + assoc.klass.column_names).include?(m) } || assoc.klass.primary_key
|
192
|
+
c[:name] = "#{assoc.name}__#{assoc_method}".to_sym
|
193
|
+
end
|
194
|
+
c[:hidden] = true if c[:name] == data_class.primary_key.to_sym && c[:hidden].nil? # hide ID column by default
|
195
|
+
|
196
|
+
end
|
197
|
+
|
198
|
+
# detect column type
|
199
|
+
type = c[:type] || data_class && data_class.columns_hash[c[:name].to_s].try(:type) || :string
|
200
|
+
c[:type] ||= type
|
201
|
+
|
202
|
+
c[:xtype] ||= XTYPE_MAP[type] unless XTYPE_MAP[type].nil?
|
203
|
+
|
204
|
+
# if the column is finally simply {:name => "something"}, cut it down to "something"
|
205
|
+
c.reject{ |k,v| k == :name }.empty? ? c[:name] : c
|
206
|
+
end
|
207
|
+
|
208
|
+
columns_for_create
|
209
|
+
|
210
|
+
end
|
211
|
+
|
212
|
+
include Plugins::ConfigurationTool if config[:config_tool_available] # it will load ConfigurationPanel into a modal window
|
213
|
+
end
|
214
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Netzke
|
2
|
+
module FormPanelApi
|
3
|
+
# API handling form submission
|
4
|
+
def submit(params)
|
5
|
+
data_hsh = ActiveSupport::JSON.decode(params[:data])
|
6
|
+
create_or_update_record(data_hsh)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Creates/updates a record from hash
|
10
|
+
def create_or_update_record(hsh)
|
11
|
+
klass = config[:data_class_name].constantize
|
12
|
+
@record = klass.find_by_id(hsh.delete("id"))
|
13
|
+
success = true
|
14
|
+
|
15
|
+
@record = klass.new if @record.nil?
|
16
|
+
|
17
|
+
hsh.each_pair do |k,v|
|
18
|
+
begin
|
19
|
+
@record.send("#{k}=",v)
|
20
|
+
rescue StandardError => exc
|
21
|
+
logger.debug "!!! FormPanelApi#create_or_update_record exception: #{exc.inspect}\n"
|
22
|
+
flash :error => exc.message
|
23
|
+
success = false
|
24
|
+
break
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
if success && @record.save
|
29
|
+
{:set_form_values => @record.to_array(columns)}
|
30
|
+
else
|
31
|
+
# flash eventual errors
|
32
|
+
@record.errors.each_full do |msg|
|
33
|
+
flash :error => msg
|
34
|
+
end
|
35
|
+
{:feedback => @flash}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# API handling form load
|
40
|
+
# def load(params)
|
41
|
+
# klass = config[:data_class_name].constantize
|
42
|
+
# case params[:neighbour]
|
43
|
+
# when "previous" then @record = klass.previous(params[:id])
|
44
|
+
# when "next" then @record = klass.next(params[:id])
|
45
|
+
# else @record = klass.find(params[:id])
|
46
|
+
# end
|
47
|
+
# {:data => [array_of_values]}
|
48
|
+
# end
|
49
|
+
|
50
|
+
def load(params)
|
51
|
+
record = data_class && data_class.find_by_id(params[:id])
|
52
|
+
{:set_form_values => record.to_array(columns)}
|
53
|
+
end
|
54
|
+
|
55
|
+
# API that returns options for a combobox
|
56
|
+
def get_combobox_options(params)
|
57
|
+
column = params[:column]
|
58
|
+
query = params[:query]
|
59
|
+
|
60
|
+
{:data => config[:data_class_name].constantize.options_for(column, query).map{|s| [s]}}
|
61
|
+
end
|
62
|
+
|
63
|
+
def configuration_panel__fields__get_combobox_options(params)
|
64
|
+
query = params[:query]
|
65
|
+
{:data => (predefined_columns.map{ |c| c[:name].to_s }).grep(/^#{query}/).map{ |n| [n] }}.to_nifty_json
|
66
|
+
end
|
67
|
+
|
68
|
+
# Returns array of form values according to the configured columns
|
69
|
+
def array_of_values
|
70
|
+
@record && @record.to_array(columns)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
/**
|
2
|
+
* Ext.ux.form.XCheckbox - checkbox with configurable submit values
|
3
|
+
*
|
4
|
+
* @author Ing. Jozef Sakalos
|
5
|
+
* @version $Id: Ext.ux.form.XCheckbox.js 441 2009-01-12 11:10:10Z jozo $
|
6
|
+
* @date 10. February 2008
|
7
|
+
*
|
8
|
+
*
|
9
|
+
* @license Ext.ux.form.XCheckbox is licensed under the terms of
|
10
|
+
* the Open Source LGPL 3.0 license. Commercial use is permitted to the extent
|
11
|
+
* that the code/component(s) do NOT become part of another Open Source or Commercially
|
12
|
+
* licensed development library or toolkit without explicit permission.
|
13
|
+
*
|
14
|
+
* License details: http://www.gnu.org/licenses/lgpl.html
|
15
|
+
*/
|
16
|
+
|
17
|
+
/*global Ext */
|
18
|
+
|
19
|
+
/**
|
20
|
+
* @class Ext.ux.XCheckbox
|
21
|
+
* @extends Ext.form.Checkbox
|
22
|
+
*/
|
23
|
+
Ext.ns('Ext.ux.form');
|
24
|
+
Ext.ux.form.XCheckbox = Ext.extend(Ext.form.Checkbox, {
|
25
|
+
submitOffValue:'false'
|
26
|
+
,submitOnValue:'true'
|
27
|
+
|
28
|
+
,onRender:function() {
|
29
|
+
|
30
|
+
this.inputValue = this.submitOnValue;
|
31
|
+
|
32
|
+
// call parent
|
33
|
+
Ext.ux.form.XCheckbox.superclass.onRender.apply(this, arguments);
|
34
|
+
|
35
|
+
// create hidden field that is submitted if checkbox is not checked
|
36
|
+
this.hiddenField = this.wrap.insertFirst({tag:'input', type:'hidden'});
|
37
|
+
|
38
|
+
// support tooltip
|
39
|
+
if(this.tooltip) {
|
40
|
+
this.imageEl.set({qtip:this.tooltip});
|
41
|
+
}
|
42
|
+
|
43
|
+
// update value of hidden field
|
44
|
+
this.updateHidden();
|
45
|
+
|
46
|
+
} // eo function onRender
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Calls parent and updates hiddenField
|
50
|
+
* @private
|
51
|
+
*/
|
52
|
+
,setValue:function(v) {
|
53
|
+
v = this.convertValue(v);
|
54
|
+
this.updateHidden(v);
|
55
|
+
Ext.ux.form.XCheckbox.superclass.setValue.apply(this, arguments);
|
56
|
+
} // eo function setValue
|
57
|
+
|
58
|
+
/**
|
59
|
+
* Updates hiddenField
|
60
|
+
* @private
|
61
|
+
*/
|
62
|
+
,updateHidden:function(v) {
|
63
|
+
v = undefined !== v ? v : this.checked;
|
64
|
+
v = this.convertValue(v);
|
65
|
+
if(this.hiddenField) {
|
66
|
+
this.hiddenField.dom.value = v ? this.submitOnValue : this.submitOffValue;
|
67
|
+
this.hiddenField.dom.name = v ? '' : this.el.dom.name;
|
68
|
+
}
|
69
|
+
} // eo function updateHidden
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Converts value to boolean
|
73
|
+
* @private
|
74
|
+
*/
|
75
|
+
,convertValue:function(v) {
|
76
|
+
return (v === true || v === 'true' || v == 1 || v === this.submitOnValue || String(v).toLowerCase() === 'on');
|
77
|
+
} // eo function convertValue
|
78
|
+
|
79
|
+
}); // eo extend
|
80
|
+
|
81
|
+
// register xtype
|
82
|
+
Ext.reg('xcheckbox', Ext.ux.form.XCheckbox);
|
@@ -0,0 +1,129 @@
|
|
1
|
+
module Netzke
|
2
|
+
module FormPanelJs
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
def js_base_class
|
9
|
+
"Ext.FormPanel"
|
10
|
+
end
|
11
|
+
|
12
|
+
def js_extend_properties
|
13
|
+
{
|
14
|
+
:body_style => 'padding:5px 5px 0',
|
15
|
+
:auto_scroll => true,
|
16
|
+
:label_width => 150,
|
17
|
+
:default_type => 'textfield',
|
18
|
+
# :label_align => 'top',
|
19
|
+
|
20
|
+
:init_component => <<-END_OF_JAVASCRIPT.l,
|
21
|
+
function(){
|
22
|
+
var recordFields = []; // Record
|
23
|
+
this.items = [];
|
24
|
+
var index = 0;
|
25
|
+
|
26
|
+
// Process columns
|
27
|
+
Ext.each(this.clmns, function(field){
|
28
|
+
if (typeof field == 'string') field = {name:field}; // normalize field
|
29
|
+
if (!field.hidden || field.name == 'id') {
|
30
|
+
recordFields.push({name:field.name, mapping:index++});
|
31
|
+
|
32
|
+
var defaultColumnConfig = Ext.apply({}, this.defaultColumnConfig);
|
33
|
+
var columnConfig = Ext.apply(defaultColumnConfig, field);
|
34
|
+
|
35
|
+
// apply dynamically defined properties
|
36
|
+
Ext.apply(columnConfig, {
|
37
|
+
fieldLabel: columnConfig.fieldLabel || columnConfig.name.humanize(),
|
38
|
+
hideLabel: columnConfig.hidden, // completely hide fields marked "hidden"
|
39
|
+
parentId: this.id,
|
40
|
+
name: columnConfig.name,
|
41
|
+
checked: columnConfig.xtype == "xcheckbox" ? columnConfig.value : null // checkbox state
|
42
|
+
});
|
43
|
+
|
44
|
+
this.items.push(columnConfig);
|
45
|
+
}
|
46
|
+
}, this);
|
47
|
+
|
48
|
+
var Record = Ext.data.Record.create(recordFields);
|
49
|
+
this.reader = new Ext.data.RecordArrayReader({root:"data"}, Record);
|
50
|
+
|
51
|
+
delete this.clmns; // we don't need them anymore
|
52
|
+
|
53
|
+
// Now let Ext.form.FormPanel do the rest
|
54
|
+
Ext.netzke.cache.FormPanel.superclass.initComponent.call(this);
|
55
|
+
|
56
|
+
// Apply event
|
57
|
+
this.addEvents('apply');
|
58
|
+
}
|
59
|
+
END_OF_JAVASCRIPT
|
60
|
+
|
61
|
+
# Defaults for each field
|
62
|
+
:defaults => {
|
63
|
+
# :anchor => '-20', # to leave some space for the scrollbar
|
64
|
+
:width => 180,
|
65
|
+
:listeners => {
|
66
|
+
# On "return" key, submit the form
|
67
|
+
:specialkey => {
|
68
|
+
:fn => <<-END_OF_JAVASCRIPT.l
|
69
|
+
function(field, event){
|
70
|
+
if (event.getKey() == 13) this.ownerCt.apply();
|
71
|
+
}
|
72
|
+
END_OF_JAVASCRIPT
|
73
|
+
}
|
74
|
+
}
|
75
|
+
},
|
76
|
+
|
77
|
+
:default_column_config => config_columns.inject({}){ |r, c| r.merge!({
|
78
|
+
c[:name] => c[:default]
|
79
|
+
}) },
|
80
|
+
|
81
|
+
:set_form_values => <<-END_OF_JAVASCRIPT.l,
|
82
|
+
function(values){
|
83
|
+
this.form.loadRecord(this.reader.readRecords({data:[values]}).records[0]);
|
84
|
+
}
|
85
|
+
END_OF_JAVASCRIPT
|
86
|
+
|
87
|
+
:load_record => <<-END_OF_JAVASCRIPT.l,
|
88
|
+
function(id, neighbour){
|
89
|
+
this.load({id:id});
|
90
|
+
// var proxy = new Ext.data.HttpProxy({url:this.initialConfig.api.load});
|
91
|
+
// proxy.load({id:id, neighbour:neighbour}, this.reader, function(data){
|
92
|
+
// if (data){
|
93
|
+
// this.form.loadRecord(data.records[0])
|
94
|
+
// }
|
95
|
+
// }, this)
|
96
|
+
}
|
97
|
+
END_OF_JAVASCRIPT
|
98
|
+
|
99
|
+
# :previous => <<-END_OF_JAVASCRIPT.l,
|
100
|
+
# function() {
|
101
|
+
# var currentId = this.form.getValues().id;
|
102
|
+
# this.loadRecord(currentId, 'previous');
|
103
|
+
# }
|
104
|
+
# END_OF_JAVASCRIPT
|
105
|
+
#
|
106
|
+
# :next => <<-END_OF_JAVASCRIPT.l,
|
107
|
+
# function() {
|
108
|
+
# var currentId = this.form.getValues().id;
|
109
|
+
# this.loadRecord(currentId, 'next');
|
110
|
+
# }
|
111
|
+
# END_OF_JAVASCRIPT
|
112
|
+
|
113
|
+
:apply => <<-END_OF_JAVASCRIPT.l
|
114
|
+
function() {
|
115
|
+
if (this.fireEvent('apply', this)) {
|
116
|
+
var values = this.form.getValues();
|
117
|
+
for (var k in values) {
|
118
|
+
if (values[k] == "") {delete values[k]}
|
119
|
+
}
|
120
|
+
this.submit(Ext.apply((this.baseParams || {}), {data:Ext.encode(values)}));
|
121
|
+
}
|
122
|
+
}
|
123
|
+
END_OF_JAVASCRIPT
|
124
|
+
}
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|