netzke-basepack 0.6.3 → 0.6.4
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.rdoc +17 -0
- data/README.rdoc +1 -1
- data/Rakefile +3 -0
- data/TODO.rdoc +1 -4
- data/features/form_panel.feature +2 -1
- data/features/grid_panel.feature +134 -5
- data/features/nested_attributes.feature +4 -1
- data/features/paging_form_panel.feature +41 -0
- data/features/search_in_grid.feature +20 -7
- data/features/step_definitions/form_panel_steps.rb +35 -0
- data/features/step_definitions/generic_steps.rb +20 -1
- data/features/step_definitions/grid_panel_steps.rb +63 -0
- data/features/support/env.rb +4 -0
- data/features/validations_in_grid.feature +13 -0
- data/features/virtual_attributes.feature +5 -9
- data/javascripts/basepack.js +21 -650
- data/javascripts/datetimefield.js +24 -0
- data/lib/generators/netzke/basepack_generator.rb +10 -0
- data/{generators/netzke_basepack/templates/public_assets → lib/generators/netzke/templates/assets}/ts-checkbox.gif +0 -0
- data/{generators/netzke_basepack → lib/generators/netzke}/templates/create_netzke_field_lists.rb +0 -0
- data/lib/netzke-basepack.rb +3 -41
- data/lib/netzke/active_record/attributes.rb +17 -21
- data/lib/netzke/basepack.rb +6 -1
- data/lib/netzke/basepack/data_accessor.rb +166 -0
- data/lib/netzke/basepack/form_panel.rb +69 -20
- data/lib/netzke/basepack/form_panel/fields.rb +15 -17
- data/lib/netzke/basepack/form_panel/javascripts/comma_list_cbg.js +7 -0
- data/lib/netzke/basepack/form_panel/javascripts/display_mode.js +6 -0
- data/lib/netzke/basepack/form_panel/javascripts/{main.js → form_panel.js} +42 -8
- data/lib/netzke/basepack/form_panel/javascripts/n_radio_group.js +24 -7
- data/lib/netzke/basepack/form_panel/javascripts/readonly_mode.js +52 -0
- data/lib/netzke/basepack/form_panel/services.rb +28 -2
- data/lib/netzke/basepack/form_panel/stylesheets/readonly_mode.css +14 -0
- data/lib/netzke/basepack/grid_panel.rb +151 -181
- data/lib/netzke/basepack/grid_panel/columns.rb +122 -84
- data/lib/netzke/basepack/grid_panel/javascripts/advanced_search.js +22 -27
- data/lib/netzke/basepack/grid_panel/javascripts/{main.js → grid_panel.js} +182 -108
- data/lib/netzke/basepack/grid_panel/record_form_window.rb +7 -2
- data/lib/netzke/basepack/grid_panel/services.rb +58 -39
- data/lib/netzke/basepack/paging_form_panel.rb +86 -25
- data/lib/netzke/basepack/query_builder.rb +105 -0
- data/lib/netzke/basepack/query_builder/javascripts/query_builder.js +140 -0
- data/lib/netzke/basepack/search_panel.rb +61 -44
- data/lib/netzke/basepack/search_panel/javascripts/condition_field.js +153 -0
- data/lib/netzke/basepack/search_panel/javascripts/search_panel.js +64 -0
- data/lib/netzke/basepack/search_window.rb +64 -0
- data/lib/netzke/basepack/simple_app.rb +1 -1
- data/lib/netzke/basepack/simple_app/javascripts/{main.js → simple_app.js} +0 -0
- data/lib/netzke/basepack/tab_panel.rb +1 -2
- data/lib/netzke/basepack/tab_panel/javascripts/{main.js → tab_panel.js} +0 -0
- data/lib/netzke/basepack/version.rb +1 -1
- data/locales/en.yml +71 -4
- data/netzke-basepack.gemspec +47 -22
- data/spec/active_record/attributes_spec.rb +6 -6
- data/spec/components/form_panel_spec.rb +2 -13
- data/stylesheets/datetimefield.css +54 -0
- data/test/rails_app/Gemfile +3 -3
- data/test/rails_app/Gemfile.lock +67 -57
- data/test/rails_app/README +1 -256
- data/test/rails_app/app/components/book_form.rb +1 -3
- data/test/rails_app/app/components/book_form_with_custom_fields.rb +20 -0
- data/test/rails_app/app/components/book_form_with_nested_attributes.rb +18 -0
- data/test/rails_app/app/components/book_grid.rb +3 -1
- data/test/rails_app/app/components/book_grid_loader.rb +24 -0
- data/test/rails_app/app/components/book_grid_with_custom_columns.rb +28 -0
- data/test/rails_app/app/components/book_grid_with_default_values.rb +1 -1
- data/test/rails_app/app/components/book_grid_with_virtual_attributes.rb +0 -1
- data/test/rails_app/app/components/book_paging_form_panel.rb +3 -2
- data/test/rails_app/app/components/book_presentation.rb +3 -3
- data/test/rails_app/app/components/book_query_builder.rb +8 -0
- data/test/rails_app/app/components/book_search_panel.rb +5 -0
- data/test/rails_app/app/components/book_search_panel/javascripts/i18n_de.js +6 -0
- data/test/rails_app/app/components/double_book_grid.rb +18 -0
- data/test/rails_app/app/components/form_without_model.rb +1 -1
- data/test/rails_app/app/components/paging_form_with_search.rb +39 -0
- data/test/rails_app/app/components/user_grid.rb +1 -1
- data/test/rails_app/app/models/author.rb +1 -0
- data/test/rails_app/config/application.rb +6 -1
- data/test/rails_app/config/database.yml +7 -5
- data/test/rails_app/config/environments/test.rb +1 -1
- data/test/rails_app/config/locales/de.yml +35 -0
- data/test/rails_app/config/locales/es.yml +84 -8
- data/test/rails_app/db/migrate/20101026190021_create_books.rb +2 -2
- data/test/rails_app/db/migrate/20110213213050_create_netzke_component_states.rb +20 -0
- data/test/rails_app/db/schema.rb +2 -18
- data/test/rails_app/public/netzke/basepack/ts-checkbox.gif +0 -0
- data/test/unit/active_record_basepack_test.rb +1 -1
- metadata +46 -45
- data/generators/netzke_basepack/netzke_basepack_generator.rb +0 -13
- data/lib/netzke/basepack/grid_panel/search_window.rb +0 -56
- data/lib/netzke/data_accessor.rb +0 -113
- data/lib/netzke/ext.rb +0 -7
- data/lib/netzke/fields_configurator.rb +0 -170
- data/lib/netzke/json_array_editor.rb +0 -67
- data/lib/netzke/masquerade_selector.rb +0 -53
- data/test/rails_app/app/components/some_search_panel.rb +0 -34
- data/test/rails_app/db/development_structure.sql +0 -93
- data/test/rails_app/db/migrate/20100905214933_create_netzke_preferences.rb +0 -16
|
@@ -9,8 +9,13 @@ module Netzke
|
|
|
9
9
|
:auto_height => true,
|
|
10
10
|
:fbar => [:ok.action, :cancel.action]
|
|
11
11
|
|
|
12
|
-
action :ok
|
|
13
|
-
|
|
12
|
+
action :ok do
|
|
13
|
+
{ :text => I18n.t('netzke.basepack.grid_panel.record_form_window.actions.ok')}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
action :cancel do
|
|
17
|
+
{ :text => I18n.t('netzke.basepack.grid_panel.record_form_window.actions.cancel')}
|
|
18
|
+
end
|
|
14
19
|
|
|
15
20
|
js_method :init_component, <<-JS
|
|
16
21
|
function(params){
|
|
@@ -45,30 +45,33 @@ module Netzke
|
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
endpoint :resize_column do |params|
|
|
48
|
-
raise "Called api_resize_column while not configured to do so" if config[:
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
raise "Called api_resize_column while not configured to do so" if !config[:persistence]
|
|
49
|
+
current_columns_order = state[:columns_order] || initial_columns_order
|
|
50
|
+
current_columns_order[normalize_index(params[:index].to_i)][:width] = params[:size].to_i
|
|
51
|
+
update_state(:columns_order, current_columns_order)
|
|
51
52
|
{}
|
|
52
53
|
end
|
|
53
54
|
|
|
54
55
|
endpoint :move_column do |params|
|
|
55
|
-
raise "Called api_move_column while not configured to do so" if config[:
|
|
56
|
+
raise "Called api_move_column while not configured to do so" if !config[:persistence]
|
|
56
57
|
remove_from = normalize_index(params[:old_index].to_i)
|
|
57
58
|
insert_to = normalize_index(params[:new_index].to_i)
|
|
58
|
-
column_to_move = columns.delete_at(remove_from)
|
|
59
|
-
columns.insert(insert_to, column_to_move)
|
|
60
|
-
save_columns!
|
|
61
59
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
current_columns_order = state[:columns_order] || initial_columns_order
|
|
61
|
+
|
|
62
|
+
column_to_move = current_columns_order.delete_at(remove_from)
|
|
63
|
+
current_columns_order.insert(insert_to, column_to_move)
|
|
64
|
+
|
|
65
|
+
update_state(:columns_order, current_columns_order)
|
|
66
|
+
|
|
65
67
|
{}
|
|
66
68
|
end
|
|
67
69
|
|
|
68
70
|
endpoint :hide_column do |params|
|
|
69
|
-
raise "Called api_hide_column while not configured to do so" if config[:
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
raise "Called api_hide_column while not configured to do so" if !config[:persistence]
|
|
72
|
+
current_columns_order = state[:columns_order] || initial_columns_order
|
|
73
|
+
current_columns_order[normalize_index(params[:index].to_i)][:hidden] = params[:hidden].to_b
|
|
74
|
+
update_state(:columns_order, current_columns_order)
|
|
72
75
|
{}
|
|
73
76
|
end
|
|
74
77
|
|
|
@@ -77,7 +80,7 @@ module Netzke
|
|
|
77
80
|
query = params[:query]
|
|
78
81
|
|
|
79
82
|
column = columns.detect{ |c| c[:name] == params[:column] }
|
|
80
|
-
scope = column.to_options[:scope] || column.to_options[:editor].try(:fetch, :scope)
|
|
83
|
+
scope = column.to_options[:scope] || column.to_options[:editor].try(:fetch, :scope, nil)
|
|
81
84
|
query = params[:query]
|
|
82
85
|
|
|
83
86
|
{:data => combobox_options_for_column(column, :query => query, :scope => scope, :record_id => params[:id])}
|
|
@@ -155,16 +158,36 @@ module Netzke
|
|
|
155
158
|
def get_data(*args)
|
|
156
159
|
params = args.first || {} # params are optional!
|
|
157
160
|
if !config[:prohibit_read]
|
|
158
|
-
|
|
159
|
-
|
|
161
|
+
{}.tap do |res|
|
|
162
|
+
records = get_records(params)
|
|
163
|
+
res[:data] = records.map{|r| r.to_array(columns(:with_meta => true))}
|
|
164
|
+
res[:total] = records.total_entries if config[:enable_pagination]
|
|
165
|
+
|
|
166
|
+
# provide association values for all records at once
|
|
167
|
+
# assoc_values = get_association_values(records, columns)
|
|
168
|
+
# res[:set_association_values] = assoc_values.literalize_keys if assoc_values.present?
|
|
169
|
+
end
|
|
160
170
|
else
|
|
161
171
|
flash :error => "You don't have permissions to read data"
|
|
162
|
-
{:feedback => @flash}
|
|
172
|
+
{ :feedback => @flash }
|
|
163
173
|
end
|
|
164
174
|
end
|
|
165
175
|
|
|
166
176
|
protected
|
|
167
177
|
|
|
178
|
+
# Returns all values for association columns, per column, per associated record id, e.g.:
|
|
179
|
+
# {
|
|
180
|
+
# :author__first_name => {1 => "Vladimir", 2 => "Herman"},
|
|
181
|
+
# :author__last_name => {1 => "Nabokov", 2 => "Hesse"}
|
|
182
|
+
# }
|
|
183
|
+
# This is used to display the association by the specified method instead by the foreign key
|
|
184
|
+
# def get_association_values(records, columns)
|
|
185
|
+
# columns.select{ |c| c[:name].index("__") }.each.inject({}) do |r,c|
|
|
186
|
+
# column_values = {}
|
|
187
|
+
# records.each{ |r| column_values[r.value_for_attribute(c)] = r.value_for_attribute(c, true) }
|
|
188
|
+
# r.merge(c[:name] => column_values)
|
|
189
|
+
# end
|
|
190
|
+
# end
|
|
168
191
|
def get_records(params)
|
|
169
192
|
|
|
170
193
|
# Restore params from component_session if requested
|
|
@@ -213,23 +236,6 @@ module Netzke
|
|
|
213
236
|
end
|
|
214
237
|
end
|
|
215
238
|
|
|
216
|
-
# An ActiveRecord::Relation instance encapsulating all the necessary conditions
|
|
217
|
-
def get_relation(params)
|
|
218
|
-
# make params coming from Ext grid filters understandable by meta_where
|
|
219
|
-
conditions = params[:filter] && convert_filters(params[:filter]) || {}
|
|
220
|
-
|
|
221
|
-
relation = data_class.where(conditions)
|
|
222
|
-
|
|
223
|
-
if params[:extra_conditions]
|
|
224
|
-
extra_conditions = normalize_extra_conditions(ActiveSupport::JSON.decode(params[:extra_conditions]))
|
|
225
|
-
relation = relation.extend_with_netzke_conditions(extra_conditions) if params[:extra_conditions]
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
relation = relation.extend_with(config[:scope]) if config[:scope]
|
|
229
|
-
|
|
230
|
-
relation
|
|
231
|
-
end
|
|
232
|
-
|
|
233
239
|
# Override this method to react on each operation that caused changing of data
|
|
234
240
|
def on_data_changed; end
|
|
235
241
|
|
|
@@ -277,7 +283,7 @@ module Netzke
|
|
|
277
283
|
|
|
278
284
|
# try to save
|
|
279
285
|
# modified_records += 1 if success && record.save
|
|
280
|
-
mod_records[id] = record.to_array(columns) if success && record.save
|
|
286
|
+
mod_records[id] = record.to_array(columns(:with_meta => true)) if success && record.save
|
|
281
287
|
# mod_record_ids << id if success && record.save
|
|
282
288
|
|
|
283
289
|
# flash eventual errors
|
|
@@ -316,8 +322,10 @@ module Netzke
|
|
|
316
322
|
#
|
|
317
323
|
# metawhere: :id.gt => 100, :food_name.matches => '%pizza%'
|
|
318
324
|
def convert_filters(column_filter)
|
|
325
|
+
# these are still JSON-encoded due to the migration to Ext.direct
|
|
326
|
+
column_filter=JSON.parse(column_filter)
|
|
319
327
|
res = {}
|
|
320
|
-
column_filter.
|
|
328
|
+
column_filter.each do |v|
|
|
321
329
|
assoc, method = v["field"].split('__')
|
|
322
330
|
if method
|
|
323
331
|
assoc = data_class.reflect_on_association(assoc.to_sym)
|
|
@@ -326,13 +334,14 @@ module Netzke
|
|
|
326
334
|
field = assoc.to_sym
|
|
327
335
|
end
|
|
328
336
|
|
|
329
|
-
value = v["
|
|
330
|
-
|
|
337
|
+
value = v["value"]
|
|
338
|
+
|
|
339
|
+
case v["type"]
|
|
331
340
|
when "string"
|
|
332
341
|
field = field.send :matches
|
|
333
342
|
value = "%#{value}%"
|
|
334
343
|
when "numeric", "date"
|
|
335
|
-
field = field.send :"#{v['
|
|
344
|
+
field = field.send :"#{v['comparison']}"
|
|
336
345
|
end
|
|
337
346
|
res.merge!({field => value})
|
|
338
347
|
end
|
|
@@ -345,6 +354,16 @@ module Netzke
|
|
|
345
354
|
end
|
|
346
355
|
end
|
|
347
356
|
|
|
357
|
+
def initial_columns_order
|
|
358
|
+
columns.map do |c|
|
|
359
|
+
{
|
|
360
|
+
:name => c[:name],
|
|
361
|
+
:width => c[:width],
|
|
362
|
+
:hidden => c[:hidden]
|
|
363
|
+
}
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
|
|
348
367
|
# def check_for_positive_result(res)
|
|
349
368
|
# if res[:set_form_values]
|
|
350
369
|
# # successful creation
|
|
@@ -15,6 +15,9 @@ module Netzke
|
|
|
15
15
|
# When it's a Proc, it's passed the model class, and is expected to return an ActiveRecord::Relation, e.g.:
|
|
16
16
|
#
|
|
17
17
|
# :scope => { |rel| rel.where(:id.gt => 100).order(:created_at) }
|
|
18
|
+
#
|
|
19
|
+
# == ToDo
|
|
20
|
+
# * Update the number of records after form submit
|
|
18
21
|
class PagingFormPanel < FormPanel
|
|
19
22
|
|
|
20
23
|
# override
|
|
@@ -25,17 +28,75 @@ module Netzke
|
|
|
25
28
|
# Pass total records amount and the first record to the JS constructor
|
|
26
29
|
def js_config
|
|
27
30
|
super.merge({
|
|
28
|
-
:total_records => total_records
|
|
29
|
-
:record => record.to_hash(fields)
|
|
31
|
+
:total_records => total_records
|
|
30
32
|
})
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
endpoint :get_data do |params|
|
|
34
|
-
record = get_relation.offset(params[:start].to_i).limit(1).first
|
|
35
|
-
record_hash = record &&
|
|
36
|
-
{:records => record_hash && [record_hash] || [], :total => total_records}
|
|
36
|
+
@record = get_relation(params).offset(params[:start].to_i).limit(1).first
|
|
37
|
+
record_hash = @record && js_record_data
|
|
38
|
+
{:records => record_hash && [record_hash] || [], :total => total_records(params)}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
action :search do
|
|
42
|
+
{
|
|
43
|
+
:text => I18n.t('netzke.basepack.paging_form_panel.actions.search'),
|
|
44
|
+
:tooltip => I18n.t('netzke.basepack.paging_form_panel.actions.search_tooltip'),
|
|
45
|
+
:icon => :find,
|
|
46
|
+
:select => true
|
|
47
|
+
}
|
|
37
48
|
end
|
|
38
49
|
|
|
50
|
+
def configure_bbar(c)
|
|
51
|
+
super
|
|
52
|
+
c[:bbar] << :search.action
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
js_method :on_search, <<-JS
|
|
56
|
+
function(el){
|
|
57
|
+
if (this.searchWindow) {
|
|
58
|
+
this.searchWindow.show();
|
|
59
|
+
} else {
|
|
60
|
+
this.loadComponent({name: 'search_form', callback: function(win){
|
|
61
|
+
this.searchWindow = win;
|
|
62
|
+
var currentConditionsString = this.getStore().baseParams.extra_conditions;
|
|
63
|
+
if (currentConditionsString) {
|
|
64
|
+
win.items.first().getForm().setValues(Ext.decode(currentConditionsString));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
win.items.first().on('apply', function(){
|
|
68
|
+
win.onSearch();
|
|
69
|
+
return false; // do not propagate the 'apply' event
|
|
70
|
+
}, this);
|
|
71
|
+
|
|
72
|
+
win.on('hide', function(){
|
|
73
|
+
var query = win.getQuery();
|
|
74
|
+
if (win.closeRes == 'search'){
|
|
75
|
+
this.getStore().baseParams.query = Ext.encode(query);
|
|
76
|
+
this.getStore().load();
|
|
77
|
+
}
|
|
78
|
+
el.toggle(query.length > 0); // toggle based on the state
|
|
79
|
+
}, this);
|
|
80
|
+
}, scope: this});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
JS
|
|
84
|
+
|
|
85
|
+
js_method :get_store, <<-JS
|
|
86
|
+
function(){
|
|
87
|
+
return this.store;
|
|
88
|
+
}
|
|
89
|
+
JS
|
|
90
|
+
|
|
91
|
+
js_method :after_render, <<-JS
|
|
92
|
+
function(){
|
|
93
|
+
Netzke.classes.Basepack.PagingFormPanel.superclass.afterRender.call(this);
|
|
94
|
+
|
|
95
|
+
new Ext.LoadMask(this.bwrap, Ext.apply(this.applyMask, {store: this.store}));
|
|
96
|
+
}
|
|
97
|
+
JS
|
|
98
|
+
|
|
99
|
+
|
|
39
100
|
js_method :init_component, <<-JS
|
|
40
101
|
function(){
|
|
41
102
|
|
|
@@ -44,23 +105,20 @@ module Netzke
|
|
|
44
105
|
// Otherwise, the things would be simpler, because this.getForm().items would already has all the fields in one place for us
|
|
45
106
|
this.fieldNames = [];
|
|
46
107
|
this.extractFields(this.items);
|
|
47
|
-
var fieldNames = this.fieldNames;
|
|
48
108
|
|
|
49
|
-
var store = new Ext.data.
|
|
50
|
-
|
|
109
|
+
var store = new Ext.data.DirectStore({
|
|
110
|
+
directFn: Netzke.providers[this.id].getData,
|
|
51
111
|
root: 'records',
|
|
52
|
-
fields: fieldNames,
|
|
112
|
+
fields: this.fieldNames.concat('_meta'),
|
|
53
113
|
data: {records: [this.record], total: this.totalRecords}
|
|
54
114
|
});
|
|
55
115
|
|
|
56
|
-
store.on('beforeload', function(){
|
|
57
|
-
if (!this.loadMaskCmp) this.loadMaskCmp = new Ext.LoadMask(this.bwrap, this.applyMask);
|
|
58
|
-
this.loadMaskCmp.show();
|
|
59
|
-
}, this);
|
|
60
|
-
|
|
61
116
|
store.on('load', function(st, r){
|
|
62
|
-
|
|
63
|
-
|
|
117
|
+
if (r.length == 0) {
|
|
118
|
+
this.getForm().reset();
|
|
119
|
+
} else {
|
|
120
|
+
this.setFormValues(r[0].data);
|
|
121
|
+
}
|
|
64
122
|
}, this);
|
|
65
123
|
|
|
66
124
|
this.bbar = new Ext.PagingToolbar({
|
|
@@ -70,21 +128,24 @@ module Netzke
|
|
|
70
128
|
items: ["-"].concat(this.bbar || [])
|
|
71
129
|
});
|
|
72
130
|
|
|
131
|
+
this.store = store;
|
|
132
|
+
|
|
73
133
|
Netzke.classes.Basepack.PagingFormPanel.superclass.initComponent.call(this);
|
|
74
134
|
}
|
|
75
135
|
JS
|
|
76
136
|
|
|
77
|
-
|
|
137
|
+
component :search_form do
|
|
138
|
+
{
|
|
139
|
+
:lazy_loading => true,
|
|
140
|
+
:class_name => "Netzke::Basepack::SearchWindow",
|
|
141
|
+
:model => config[:model]
|
|
142
|
+
}
|
|
143
|
+
end
|
|
78
144
|
|
|
79
|
-
|
|
80
|
-
def get_relation
|
|
81
|
-
relation = data_class.scoped
|
|
82
|
-
relation = relation.extend_with(config[:scope]) if config[:scope]
|
|
83
|
-
relation
|
|
84
|
-
end
|
|
145
|
+
protected
|
|
85
146
|
|
|
86
|
-
def total_records
|
|
87
|
-
@total_records ||= get_relation.count
|
|
147
|
+
def total_records(params = {})
|
|
148
|
+
@total_records ||= get_relation(params).count
|
|
88
149
|
end
|
|
89
150
|
|
|
90
151
|
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
module Netzke
|
|
2
|
+
module Basepack
|
|
3
|
+
class QueryBuilder < Netzke::Base
|
|
4
|
+
js_base_class "Ext.TabPanel"
|
|
5
|
+
|
|
6
|
+
js_property :active_tab, 0
|
|
7
|
+
|
|
8
|
+
js_translate :overwrite_confirm, :overwrite_confirm_title, :delete_confirm, :delete_confirm_title
|
|
9
|
+
|
|
10
|
+
js_mixin :query_builder
|
|
11
|
+
|
|
12
|
+
component :search_panel do
|
|
13
|
+
{
|
|
14
|
+
:class_name => "Netzke::Basepack::SearchPanel",
|
|
15
|
+
:model => config[:model],
|
|
16
|
+
:query => config[:query],
|
|
17
|
+
:auto_scroll => config[:auto_scroll]
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
action :clear_all do
|
|
22
|
+
{
|
|
23
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.clear_all'),
|
|
24
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.clear_all_tooltip'),
|
|
25
|
+
:icon => :cross
|
|
26
|
+
}
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
action :reset do
|
|
30
|
+
{
|
|
31
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.reset'),
|
|
32
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.reset_tooltip'),
|
|
33
|
+
:icon => :application_form
|
|
34
|
+
}
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
action :save_preset do
|
|
38
|
+
{
|
|
39
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.save_preset'),
|
|
40
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.save_preset_tooltip'),
|
|
41
|
+
:icon => :disk
|
|
42
|
+
}
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
action :delete_preset do
|
|
46
|
+
{
|
|
47
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.delete_preset'),
|
|
48
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.delete_preset_tooltip'),
|
|
49
|
+
:icon => :cross
|
|
50
|
+
}
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
action :apply do
|
|
54
|
+
{
|
|
55
|
+
:text => I18n.t('netzke.basepack.query_builder.actions.apply'),
|
|
56
|
+
:tooltip => I18n.t('netzke.basepack.query_builder.actions.apply_tooltip'),
|
|
57
|
+
:icon => :accept
|
|
58
|
+
}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def js_config
|
|
62
|
+
super.tap do |s|
|
|
63
|
+
s[:bbar] = (config[:bbar] || []) + [:clear_all.action, :reset.action, "->",
|
|
64
|
+
I18n.t('netzke.basepack.query_builder.presets'),
|
|
65
|
+
{
|
|
66
|
+
:xtype => "combo",
|
|
67
|
+
:triggerAction => "all",
|
|
68
|
+
:value => super[:load_last_preset] && last_preset.try(:fetch, "name"),
|
|
69
|
+
:store => state[:presets].blank? ? [[[], ""]] : state[:presets].map{ |s| [s["query"], s["name"]] },
|
|
70
|
+
:ref => "../presetsCombo",
|
|
71
|
+
:listeners => {:before_select => {
|
|
72
|
+
:fn => "function(combo, record){
|
|
73
|
+
var form = Ext.getCmp('#{global_id}');
|
|
74
|
+
form.buildFormFromQuery(record.data.field1);
|
|
75
|
+
}".l
|
|
76
|
+
}}
|
|
77
|
+
}, :save_preset.action, :delete_preset.action
|
|
78
|
+
]
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
endpoint :save_preset do |params|
|
|
83
|
+
saved_searches = state[:presets] || []
|
|
84
|
+
existing = saved_searches.detect{ |s| s["name"] == params[:name] }
|
|
85
|
+
query = ActiveSupport::JSON.decode(params[:query])
|
|
86
|
+
if existing
|
|
87
|
+
existing["query"].replace(query)
|
|
88
|
+
else
|
|
89
|
+
saved_searches << {"name" => params[:name], "query" => query}
|
|
90
|
+
end
|
|
91
|
+
update_state(:presets, saved_searches)
|
|
92
|
+
{:feedback => I18n.t('netzke.basepack.query_builder.preset_saved')}
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
endpoint :delete_preset do |params|
|
|
96
|
+
saved_searches = state[:presets]
|
|
97
|
+
saved_searches.delete_if{ |s| s["name"] == params[:name] }
|
|
98
|
+
update_state(:presets, saved_searches)
|
|
99
|
+
{:feedback => I18n.t('netzke.basepack.query_builder.preset_deleted')}
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|