netzke-basepack 0.12.9 → 1.0.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +75 -44
- data/Gemfile +4 -2
- data/LICENSE +2 -6
- data/README.md +22 -24
- data/javascripts/basepack.js +0 -8
- data/javascripts/{columns.js → grid/columns.js} +59 -71
- data/javascripts/grid/event_handlers.js +218 -0
- data/javascripts/netzkeremotecombo.js +5 -13
- data/javascripts/tristate.js +62 -0
- data/javascripts/xdatetime.js +8 -37
- data/lib/netzke-basepack.rb +3 -2
- data/lib/netzke/basepack.rb +1 -1
- data/lib/netzke/basepack/action_column.rb +6 -23
- data/lib/netzke/basepack/active_record.rb +0 -6
- data/lib/netzke/basepack/attr_config.rb +20 -11
- data/lib/netzke/basepack/attribute_config.rb +10 -0
- data/lib/netzke/basepack/attributes.rb +196 -0
- data/lib/netzke/basepack/column_config.rb +47 -39
- data/lib/netzke/basepack/columns.rb +127 -97
- data/lib/netzke/basepack/data_accessor.rb +7 -48
- data/lib/netzke/basepack/data_adapters/abstract_adapter.rb +15 -17
- data/lib/netzke/basepack/data_adapters/active_record_adapter.rb +111 -90
- data/lib/netzke/basepack/dynamic_tab_panel.rb +3 -5
- data/lib/netzke/basepack/dynamic_tab_panel/{javascripts → client}/dynamic_tab_panel.js +6 -5
- data/lib/netzke/basepack/field_config.rb +30 -19
- data/lib/netzke/basepack/fields.rb +22 -12
- data/lib/netzke/basepack/grid_live_search.rb +1 -4
- data/lib/netzke/basepack/grid_live_search/{javascripts → client}/grid_live_search.js +9 -7
- data/lib/netzke/basepack/item_persistence.rb +3 -3
- data/lib/netzke/basepack/item_persistence/events_plugin.rb +8 -10
- data/lib/netzke/basepack/paging_form.rb +7 -11
- data/lib/netzke/basepack/paging_form/{javascripts → client}/paging_form.js +4 -4
- data/lib/netzke/basepack/query_builder.rb +12 -10
- data/lib/netzke/basepack/query_builder/{javascripts → client}/query_builder.js +14 -12
- data/lib/netzke/basepack/record_form_window.rb +8 -8
- data/lib/netzke/basepack/search_panel.rb +4 -6
- data/lib/netzke/basepack/search_panel/{javascripts → client}/condition_field.js +13 -16
- data/lib/netzke/basepack/search_panel/{javascripts → client}/search_panel.js +7 -7
- data/lib/netzke/basepack/search_window.rb +6 -6
- data/lib/netzke/basepack/simple_app/{javascripts → client}/statusbar_ext.js +0 -0
- data/lib/netzke/basepack/version.rb +1 -1
- data/lib/netzke/form/base.rb +166 -0
- data/lib/netzke/{basepack/form/javascripts/form.js → form/base/client/base.js} +77 -38
- data/lib/netzke/form/base/client/readonly_mode.css +4 -0
- data/lib/netzke/{basepack/form/javascripts → form/base/client}/readonly_mode.js +5 -5
- data/lib/netzke/form/endpoints.rb +33 -0
- data/lib/netzke/form/services.rb +74 -0
- data/lib/netzke/grid/actions.rb +52 -0
- data/lib/netzke/grid/base.rb +289 -0
- data/lib/netzke/{basepack/grid/javascripts → grid/base/client}/advanced_search.js +5 -1
- data/lib/netzke/{basepack/grid/javascripts/grid.js → grid/base/client/base.js} +61 -53
- data/lib/netzke/{basepack/grid/javascripts → grid/base/client}/extensions.js +19 -13
- data/lib/netzke/{basepack/grid/javascripts → grid/base/client}/remember_selection.js +0 -1
- data/lib/netzke/grid/client.rb +8 -0
- data/lib/netzke/grid/components.rb +55 -0
- data/lib/netzke/grid/configuration.rb +72 -0
- data/lib/netzke/grid/endpoints.rb +99 -0
- data/lib/netzke/grid/permissions.rb +18 -0
- data/lib/netzke/grid/services.rb +141 -0
- data/lib/netzke/tree/base.rb +173 -0
- data/lib/netzke/{basepack/tree/javascripts/tree.js → tree/base/client/base.js} +55 -26
- data/lib/netzke/{basepack/tree/javascripts → tree/base/client}/extensions.js +7 -7
- data/lib/netzke/tree/endpoints.rb +34 -0
- data/lib/netzke/{basepack/viewport.rb → viewport/base.rb} +3 -3
- data/lib/netzke/{basepack/window.rb → window/base.rb} +7 -8
- data/lib/netzke/window/base/client/base.js +26 -0
- data/locales/de.yml +49 -33
- data/locales/en.yml +32 -39
- data/locales/es.yml +39 -25
- data/locales/nl.yml +39 -25
- data/locales/ru.yml +38 -25
- data/locales/uk.yml +40 -26
- data/stylesheets/basepack.css +10 -0
- metadata +48 -45
- data/javascripts/mixins/grid_event_handlers.js +0 -139
- data/lib/netzke/basepack/accordion.rb +0 -45
- data/lib/netzke/basepack/active_record/relation_extensions.rb +0 -27
- data/lib/netzke/basepack/form.rb +0 -131
- data/lib/netzke/basepack/form/endpoints.rb +0 -35
- data/lib/netzke/basepack/form/services.rb +0 -74
- data/lib/netzke/basepack/form/stylesheets/readonly_mode.css +0 -14
- data/lib/netzke/basepack/grid.rb +0 -570
- data/lib/netzke/basepack/grid/endpoints.rb +0 -111
- data/lib/netzke/basepack/grid/javascripts/edit_in_form.js +0 -51
- data/lib/netzke/basepack/grid/services.rb +0 -148
- data/lib/netzke/basepack/tab_panel.rb +0 -22
- data/lib/netzke/basepack/tab_panel/javascripts/tab_panel.js +0 -11
- data/lib/netzke/basepack/tree.rb +0 -269
- data/lib/netzke/basepack/window/javascripts/window.js +0 -26
- data/lib/netzke/basepack/wrap_lazy_loaded.rb +0 -29
@@ -3,19 +3,17 @@ module Netzke
|
|
3
3
|
# A tab panel that can load components dynamically by their class name. Components can be loaded in the current or new tab.
|
4
4
|
# For example:
|
5
5
|
#
|
6
|
-
# this.netzkeLoadComponentByClass('BookGrid', {newTab: true,
|
6
|
+
# this.netzkeLoadComponentByClass('BookGrid', {newTab: true, serverConfig: {read_only: true}});
|
7
7
|
#
|
8
8
|
class DynamicTabPanel < Netzke::Base
|
9
|
-
|
9
|
+
client_class do |c|
|
10
10
|
c.extend = "Ext.tab.Panel"
|
11
|
-
c.mixin
|
12
11
|
end
|
13
12
|
|
14
13
|
# Override this method if you need more control on what components can/cannot be loaded, or in order to access
|
15
14
|
# `client_config`
|
16
15
|
component :child do |c|
|
17
|
-
|
18
|
-
c.klass = (c.client_config[:klass] || "Netzke::Core::Panel").constantize
|
16
|
+
c.class_name = c.client_config[:class_name] || "Netzke::Core::Panel"
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
{
|
2
|
+
tabCounter: 0,
|
3
|
+
|
2
4
|
netzkeTabComponentDelivered: function(c, config) {
|
3
5
|
var tab,
|
4
6
|
i,
|
5
7
|
activeTab = this.getActiveTab(),
|
6
|
-
cmp = Ext.
|
8
|
+
cmp = Ext.create(Ext.apply(c, {closable: true}));
|
7
9
|
|
8
10
|
if (config.newTab || activeTab == null) {
|
9
11
|
tab = this.add(cmp);
|
@@ -20,10 +22,9 @@
|
|
20
22
|
netzkeLoadComponentByClass: function(klass, options) {
|
21
23
|
this.netzkeLoadComponent('child', Ext.apply(options, {
|
22
24
|
configOnly: true,
|
23
|
-
|
24
|
-
|
25
|
-
callback: this.netzkeTabComponentDelivered
|
26
|
-
scope: this,
|
25
|
+
itemId: "tab_" + this.tabCounter++,
|
26
|
+
serverConfig: Ext.apply(options.serverConfig || {}, { class_name: klass }),
|
27
|
+
callback: this.netzkeTabComponentDelivered
|
27
28
|
}));
|
28
29
|
}
|
29
30
|
}
|
@@ -1,48 +1,60 @@
|
|
1
1
|
module Netzke
|
2
2
|
module Basepack
|
3
|
-
# Takes care of automatic field configuration in {
|
3
|
+
# Takes care of automatic field configuration in {Form::Base}
|
4
4
|
class FieldConfig < AttrConfig
|
5
|
-
def
|
5
|
+
def merge_attribute(attr)
|
6
|
+
self.merge!(attr)
|
7
|
+
|
8
|
+
self.field_label = self.delete(:label) if self.has_key?(:label)
|
9
|
+
|
10
|
+
self.merge!(delete(:field_config)) if self.has_key?(:field_config)
|
11
|
+
|
12
|
+
self.merge!(editor_config) if self.has_key?(:editor_config)
|
13
|
+
|
14
|
+
self.delete(:column_config) if self.has_key?(:column_config)
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_defaults
|
6
18
|
super
|
7
19
|
|
8
|
-
self.
|
20
|
+
self.type ||= @model_adapter.attr_type(name)
|
9
21
|
|
10
|
-
set_xtype
|
22
|
+
set_xtype if xtype.nil?
|
11
23
|
|
12
|
-
self.field_label ||=
|
24
|
+
self.field_label ||= default_label
|
13
25
|
|
14
26
|
self.hidden = true if hidden.nil? && primary?
|
15
27
|
self.hide_label = hidden if hide_label.nil?
|
16
28
|
|
17
|
-
case
|
29
|
+
case type
|
18
30
|
when :boolean
|
19
|
-
configure_checkbox
|
31
|
+
configure_checkbox
|
20
32
|
when :date
|
21
|
-
configure_date_field
|
33
|
+
configure_date_field
|
22
34
|
end
|
23
35
|
end
|
24
36
|
|
25
37
|
private
|
26
38
|
|
27
|
-
def set_xtype
|
39
|
+
def set_xtype
|
28
40
|
if association?
|
29
|
-
set_xtype_for_association
|
41
|
+
set_xtype_for_association
|
30
42
|
else
|
31
|
-
self.xtype =
|
43
|
+
self.xtype = xtype_for_type(type)
|
32
44
|
end
|
33
45
|
end
|
34
46
|
|
35
|
-
def set_xtype_for_association
|
47
|
+
def set_xtype_for_association
|
36
48
|
assoc_name, method = name.split('__').map(&:to_sym)
|
37
|
-
assoc_method_type = @
|
49
|
+
assoc_method_type = @model_adapter.get_assoc_property_type(assoc_name, method)
|
38
50
|
if nested_attribute
|
39
|
-
self.xtype =
|
51
|
+
self.xtype = xtype_for_type(assoc_method_type)
|
40
52
|
else
|
41
|
-
self.xtype = assoc_method_type == :boolean ?
|
53
|
+
self.xtype = assoc_method_type == :boolean ? xtype_for_type(assoc_method_type) : :netzkeremotecombo
|
42
54
|
end
|
43
55
|
end
|
44
56
|
|
45
|
-
def
|
57
|
+
def xtype_for_type(type)
|
46
58
|
{ integer: :numberfield,
|
47
59
|
boolean: :checkboxfield,
|
48
60
|
date: :datefield,
|
@@ -53,15 +65,14 @@ module Netzke
|
|
53
65
|
}[type] || :textfield
|
54
66
|
end
|
55
67
|
|
56
|
-
def configure_checkbox
|
68
|
+
def configure_checkbox
|
57
69
|
self.checked = value
|
58
70
|
self.unchecked_value = false
|
59
71
|
self.input_value = true
|
60
72
|
end
|
61
73
|
|
62
|
-
def configure_date_field
|
74
|
+
def configure_date_field
|
63
75
|
self.submit_format = "Y-m-d"
|
64
|
-
# DEBT: why is self.format not working?? ('too few arguments')
|
65
76
|
self[:format] ||= I18n.t("date", scope: 'netzke.formats', default: "Y-m-d")
|
66
77
|
end
|
67
78
|
end
|
@@ -6,25 +6,27 @@ module Netzke
|
|
6
6
|
|
7
7
|
# Items with normalized fields (i.e. containing all the necessary attributes needed by Ext.form.Form to render a field)
|
8
8
|
def items
|
9
|
-
prepend_primary_key(config.items) ||
|
9
|
+
prepend_primary_key(config.items) || model_adapter.model_attributes
|
10
10
|
end
|
11
11
|
|
12
12
|
# Hash of fully configured fields, that are referenced in the items. E.g.:
|
13
|
-
# {
|
14
|
-
# :
|
13
|
+
# {
|
14
|
+
# role__name: {xtype: 'netzkeremotecombo', disabled: true, value: "admin"},
|
15
|
+
# created_at: {xtype: 'datetime', disabled: true, value: "2010-10-10 10:10"}
|
15
16
|
# }
|
16
17
|
def fields
|
17
18
|
@_fields ||= fields_from_items.tap do |flds|
|
18
19
|
# add primary key field if not present
|
19
|
-
primary_key =
|
20
|
+
primary_key = model_adapter.primary_key
|
20
21
|
flds[primary_key.to_sym] ||= {name: primary_key}
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
25
|
# Hash of normalized field configs extracted from :items, e.g.:
|
25
26
|
#
|
26
|
-
# {
|
27
|
-
# :
|
27
|
+
# {
|
28
|
+
# role__name: {xtype: "netzkeremotecombo"},
|
29
|
+
# password: {xtype: "passwordfield"}
|
28
30
|
# }
|
29
31
|
def fields_from_items
|
30
32
|
@fields_from_items || (normalize_config || true) && @fields_from_items
|
@@ -39,14 +41,22 @@ module Netzke
|
|
39
41
|
end
|
40
42
|
|
41
43
|
def extend_field(field)
|
42
|
-
Netzke::Basepack::FieldConfig.new(field,
|
43
|
-
|
44
|
+
Netzke::Basepack::FieldConfig.new(field, model_adapter).tap do |c|
|
44
45
|
# not binding to a model attribute
|
45
|
-
return c if c.
|
46
|
+
return c if c.bind == false
|
47
|
+
|
48
|
+
# merge in attribute
|
49
|
+
c.merge_attribute(attribute_overrides[c.name.to_sym] || {})
|
50
|
+
|
51
|
+
return nil if c.excluded
|
46
52
|
|
47
53
|
@fields_from_items[c.name.to_sym] = c
|
48
54
|
|
49
|
-
c.set_defaults
|
55
|
+
c.set_defaults
|
56
|
+
|
57
|
+
if c.type == :boolean && multiedit?
|
58
|
+
c.xtype = 'netzketristate' if c.type == :boolean
|
59
|
+
end
|
50
60
|
end
|
51
61
|
end
|
52
62
|
|
@@ -54,13 +64,13 @@ module Netzke
|
|
54
64
|
|
55
65
|
def prepend_primary_key(items)
|
56
66
|
items && items.tap do |items|
|
57
|
-
items.insert(0,
|
67
|
+
items.insert(0, model_adapter.primary_key.to_sym) if !includes_primary_key?(items)
|
58
68
|
end
|
59
69
|
end
|
60
70
|
|
61
71
|
def includes_primary_key?(items)
|
62
72
|
!!items.detect do |item|
|
63
|
-
(item.is_a?(Hash) ? item[:name] : item.to_s) ==
|
73
|
+
(item.is_a?(Hash) ? item[:name] : item.to_s) == model_adapter.primary_key
|
64
74
|
end
|
65
75
|
end
|
66
76
|
|
@@ -4,7 +4,7 @@ module Netzke
|
|
4
4
|
# attribute, and assign the search operator. The grid will be updated on changing those fields, to reflect the
|
5
5
|
# query.
|
6
6
|
#
|
7
|
-
# See Grid::LiveSearch in spec/rails_app for a usage example.
|
7
|
+
# See `Grid::LiveSearch` in spec/rails_app for a usage example.
|
8
8
|
#
|
9
9
|
# == Configuration:
|
10
10
|
#
|
@@ -23,9 +23,6 @@ module Netzke
|
|
23
23
|
# Trying to search on a *virtual* column that is *not shown* in the grid will break. A fix would require refactoring
|
24
24
|
# of +Grid::Columns+.
|
25
25
|
class GridLiveSearch < Netzke::Plugin
|
26
|
-
js_configure do |c|
|
27
|
-
c.mixin
|
28
|
-
end
|
29
26
|
end
|
30
27
|
end
|
31
28
|
end
|
@@ -1,15 +1,17 @@
|
|
1
1
|
{
|
2
|
-
init: function(){
|
3
|
-
this.
|
4
|
-
|
5
|
-
this.searchControls = this.cmp.query('field[attr]');
|
2
|
+
init: function(cmp){
|
3
|
+
this.searchControls = cmp.query('field[attr]');
|
6
4
|
|
7
5
|
Ext.each(this.searchControls, function(control){
|
6
|
+
var delay = 0;
|
7
|
+
|
8
|
+
if (control.xtype == 'textfield' || control.xtype == 'numberfield') delay = this.delay || 500;
|
9
|
+
|
8
10
|
control.on('change', Ext.Function.createBuffered(function(self){
|
9
11
|
var query = this.buildQuery();
|
10
|
-
|
11
|
-
|
12
|
-
},
|
12
|
+
cmp.getStore().getProxy().extraParams.query = [query];
|
13
|
+
cmp.netzkeReloadStore();
|
14
|
+
}, delay, this));
|
13
15
|
}, this);
|
14
16
|
},
|
15
17
|
|
@@ -11,16 +11,16 @@ module Netzke
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# Added endpoints
|
14
|
-
endpoint :region_resized do |params
|
14
|
+
endpoint :region_resized do |params|
|
15
15
|
state[:"#{params[:item]}_width"] = params[:width].to_i if params[:width]
|
16
16
|
state[:"#{params[:item]}_height"] = params[:height].to_i if params[:height]
|
17
17
|
end
|
18
18
|
|
19
|
-
endpoint :region_collapsed do |params
|
19
|
+
endpoint :region_collapsed do |params|
|
20
20
|
state[:"#{params[:item]}_collapsed"] = true
|
21
21
|
end
|
22
22
|
|
23
|
-
endpoint :region_expanded do |params
|
23
|
+
endpoint :region_expanded do |params|
|
24
24
|
state[:"#{params[:item]}_collapsed"] = false
|
25
25
|
end
|
26
26
|
end
|
@@ -2,12 +2,10 @@ module Netzke
|
|
2
2
|
module Basepack
|
3
3
|
module ItemPersistence
|
4
4
|
class EventsPlugin < Netzke::Plugin
|
5
|
-
|
5
|
+
client_class do |c|
|
6
6
|
c.init = <<-JS
|
7
|
-
function(){
|
8
|
-
|
9
|
-
|
10
|
-
this.cmp.on('afterlayout', function(){
|
7
|
+
function(cmp){
|
8
|
+
cmp.on('afterlayout', function(){
|
11
9
|
|
12
10
|
// scope of the parent panel
|
13
11
|
this.items.each(function(item, index, length){
|
@@ -18,26 +16,26 @@ module Netzke
|
|
18
16
|
|
19
17
|
if ((panel.region == 'west' || panel.region == 'east') && panel.oldSize.width != w) {
|
20
18
|
params.width = w;
|
21
|
-
this.regionResized(params);
|
19
|
+
this.server.regionResized(params);
|
22
20
|
} else if (panel.region == 'north' || panel.region == 'south' && panel.oldSize.height != h){
|
23
21
|
params.height = h;
|
24
|
-
this.regionResized(params);
|
22
|
+
this.server.regionResized(params);
|
25
23
|
}
|
26
24
|
|
27
25
|
panel.oldSize = panel.getSize();
|
28
26
|
}, this);
|
29
27
|
|
30
28
|
item.on('collapse', function(panel){
|
31
|
-
this.regionCollapsed({item: panel.itemId});
|
29
|
+
this.server.regionCollapsed({item: panel.itemId});
|
32
30
|
}, this);
|
33
31
|
|
34
32
|
item.on('expand', function(panel){
|
35
|
-
this.regionExpanded({item: panel.itemId});
|
33
|
+
this.server.regionExpanded({item: panel.itemId});
|
36
34
|
}, this);
|
37
35
|
|
38
36
|
}, this);
|
39
37
|
|
40
|
-
},
|
38
|
+
}, cmp, {single: true});
|
41
39
|
}
|
42
40
|
JS
|
43
41
|
end
|
@@ -3,7 +3,7 @@ module Netzke
|
|
3
3
|
# A Form with paging toolbar. Allows browsing and editing records one-by-one.
|
4
4
|
#
|
5
5
|
# == Configuration
|
6
|
-
# Besides +Netzke::
|
6
|
+
# Besides +Netzke::Form::Base+ config options, accepts:
|
7
7
|
# * +scope+ - specifies how the data should be filtered.
|
8
8
|
# When it's a symbol, it's used as a scope name.
|
9
9
|
# When it's a string, it's a SQL statement (passed directly to +ActiveRecord::Relation#where+).
|
@@ -19,25 +19,21 @@ module Netzke
|
|
19
19
|
# == ToDo
|
20
20
|
# * Update the number of records after form submit
|
21
21
|
class PagingForm < Form
|
22
|
-
js_configure do |c|
|
23
|
-
c.mixin
|
24
|
-
end
|
25
|
-
|
26
22
|
# override
|
27
23
|
def record
|
28
|
-
@record ||=
|
24
|
+
@record ||= model_adapter.first
|
29
25
|
end
|
30
26
|
|
31
|
-
def
|
27
|
+
def configure_client(c)
|
32
28
|
super
|
33
29
|
# Pass total records amount and the first record to the JS constructor
|
34
30
|
c.total_records = total_records
|
35
31
|
end
|
36
32
|
|
37
|
-
endpoint :get_data do |params
|
38
|
-
@record =
|
33
|
+
endpoint :get_data do |params|
|
34
|
+
@record = model_adapter.get_records(params).first
|
39
35
|
record_hash = @record && js_record_data
|
40
|
-
|
36
|
+
client.merge!(:records => record_hash && [record_hash] || [], :total => total_records(params))
|
41
37
|
end
|
42
38
|
|
43
39
|
action :search do |a|
|
@@ -59,7 +55,7 @@ module Netzke
|
|
59
55
|
protected
|
60
56
|
|
61
57
|
def total_records(params = {})
|
62
|
-
@total_records ||=
|
58
|
+
@total_records ||= model_adapter.count_records(params, [])
|
63
59
|
end
|
64
60
|
end
|
65
61
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
{
|
2
|
-
|
2
|
+
netzkeOnSearch: function(el) {
|
3
3
|
if (this.searchWindow) {
|
4
4
|
this.searchWindow.show();
|
5
5
|
} else {
|
@@ -44,10 +44,10 @@
|
|
44
44
|
// because we need to build the store for PagingToolbar that cannot be created after superclass.initComponent
|
45
45
|
// Otherwise, the things would be simpler, because this.getForm().items would already have all the fields in one place for us
|
46
46
|
this.fieldNames = [];
|
47
|
-
this.
|
47
|
+
this.netzkeExtractFields(this.items);
|
48
48
|
|
49
49
|
var store = new Ext.data.DirectStore({
|
50
|
-
directFn:
|
50
|
+
directFn: this.netzkeDirect.getData,
|
51
51
|
root: 'records',
|
52
52
|
fields: this.fieldNames.concat('meta'),
|
53
53
|
pageSize: 1
|
@@ -57,7 +57,7 @@
|
|
57
57
|
if (r.length == 0) {
|
58
58
|
this.getForm().reset();
|
59
59
|
} else {
|
60
|
-
this.
|
60
|
+
this.netzkeSetFormValues(r[0].data);
|
61
61
|
}
|
62
62
|
}, this);
|
63
63
|
|
@@ -3,20 +3,18 @@ module Netzke
|
|
3
3
|
# Search query builder used in Grid's advanced search.
|
4
4
|
# Based on Ext.tab.Panel. A new tab is created for each OR condition. Each tab contains an instance of SearchPanel which is used to build AND conditions.
|
5
5
|
class QueryBuilder < Netzke::Base
|
6
|
-
|
6
|
+
client_class do |c|
|
7
7
|
c.extend = "Ext.tab.Panel"
|
8
8
|
c.active_tab = 0
|
9
9
|
c.translate :overwrite_confirm, :overwrite_confirm_title, :delete_confirm, :delete_confirm_title
|
10
|
-
c.mixin
|
11
10
|
end
|
12
11
|
|
13
|
-
component :search_panel do |c|
|
12
|
+
component :search_panel, eager_load: true do |c|
|
14
13
|
c.klass = SearchPanel
|
15
14
|
c.model = config[:model]
|
16
15
|
c.fields = config[:fields]
|
17
16
|
c.preset_query = config[:query]
|
18
17
|
c.auto_scroll = config[:auto_scroll]
|
19
|
-
c.eager_loading = true
|
20
18
|
end
|
21
19
|
|
22
20
|
action :clear_all do |a|
|
@@ -39,13 +37,17 @@ module Netzke
|
|
39
37
|
a.icon = :accept
|
40
38
|
end
|
41
39
|
|
42
|
-
def
|
40
|
+
def configure(c)
|
41
|
+
super
|
42
|
+
c.bbar = (c.bbar || []) + [:clear_all, :reset, "->", I18n.t('netzke.basepack.query_builder.presets'), :preset_selector, :save_preset, :delete_preset ]
|
43
|
+
end
|
44
|
+
|
45
|
+
def configure_client(c)
|
43
46
|
super
|
44
47
|
c.preset_store = state[:presets].blank? ? [[[], ""]] : state[:presets].map{ |s| [s["query"], s["name"]] }
|
45
|
-
c.bbar = (config[:bbar] || []) + [:clear_all, :reset, "->", I18n.t('netzke.basepack.query_builder.presets'), :preset_selector, :save_preset, :delete_preset ]
|
46
48
|
end
|
47
49
|
|
48
|
-
endpoint :save_preset do |params
|
50
|
+
endpoint :save_preset do |params|
|
49
51
|
saved_searches = state[:presets] || []
|
50
52
|
existing = saved_searches.detect{ |s| s["name"] == params[:name] }
|
51
53
|
query = ActiveSupport::JSON.decode(params[:query])
|
@@ -55,14 +57,14 @@ module Netzke
|
|
55
57
|
saved_searches << {"name" => params[:name], "query" => query}
|
56
58
|
end
|
57
59
|
state[:presets] = saved_searches
|
58
|
-
|
60
|
+
client.netzke_notify(I18n.t('netzke.basepack.query_builder.preset_saved'))
|
59
61
|
end
|
60
62
|
|
61
|
-
endpoint :delete_preset do |params
|
63
|
+
endpoint :delete_preset do |params|
|
62
64
|
saved_searches = state[:presets]
|
63
65
|
saved_searches.delete_if{ |s| s["name"] == params[:name] }
|
64
66
|
state[:presets] = saved_searches
|
65
|
-
|
67
|
+
client.netzke_notify(I18n.t('netzke.basepack.query_builder.preset_deleted'))
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|