netzke-basepack 0.12.6 → 0.12.7
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.md +5 -0
- data/lib/netzke/basepack/action_column.rb +7 -1
- data/lib/netzke/basepack/data_adapters/abstract_adapter.rb +1 -1
- data/lib/netzke/basepack/data_adapters/active_record_adapter.rb +18 -16
- data/lib/netzke/basepack/form/services.rb +1 -1
- data/lib/netzke/basepack/grid/javascripts/grid.js +0 -1
- data/lib/netzke/basepack/grid/services.rb +6 -4
- data/lib/netzke/basepack/tree.rb +30 -4
- data/lib/netzke/basepack/tree/javascripts/tree.js +15 -4
- data/lib/netzke/basepack/version.rb +1 -1
- metadata +2 -2
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
# 0.12.7 - 2015-08-09
|
2
|
+
* Fix the strong_default_attrs option support
|
3
|
+
* Support column action's isDisabled option
|
4
|
+
* Store tree nodes expand/collapse state
|
5
|
+
|
1
6
|
# 0.12.6 - 2015-07-11
|
2
7
|
* Regression: show cell editor on adding/editing a record in grid
|
3
8
|
* Fix occasional autoload-related problems
|
@@ -58,7 +58,7 @@ module Netzke
|
|
58
58
|
a[:handler] = Netzke::Core::JsonLiteral.new <<-JS
|
59
59
|
function() {
|
60
60
|
var cmp = Ext.getCmp('#{js_id}'),
|
61
|
-
|
61
|
+
f = cmp.on#{a[:handler].to_s.camelize};
|
62
62
|
if (Ext.isFunction(f)) {
|
63
63
|
f.apply(cmp, arguments);
|
64
64
|
} else {
|
@@ -67,6 +67,12 @@ module Netzke
|
|
67
67
|
}
|
68
68
|
JS
|
69
69
|
|
70
|
+
a[:is_disabled] &&= Netzke::Core::JsonLiteral.new <<-JS
|
71
|
+
function() {
|
72
|
+
var cmp = Ext.getCmp('#{js_id}');
|
73
|
+
return cmp.#{a[:is_disabled].to_s.camelize(:lower)}.apply(cmp, arguments);
|
74
|
+
}
|
75
|
+
JS
|
70
76
|
a[:icon] = "#{Netzke::Core.icons_uri}/#{a[:icon]}.png" if a[:icon].is_a?(Symbol)
|
71
77
|
end
|
72
78
|
end
|
@@ -217,7 +217,7 @@ module Netzke::Basepack::DataAdapters
|
|
217
217
|
|
218
218
|
# Assigns new value to an (association) attribute in a given record
|
219
219
|
# +role+ - role provided for mass assignment protection
|
220
|
-
def set_record_value_for_attribute(record, attr, value
|
220
|
+
def set_record_value_for_attribute(record, attr, value)
|
221
221
|
end
|
222
222
|
|
223
223
|
# Returns human attribute name
|
@@ -252,21 +252,23 @@ module Netzke::Basepack::DataAdapters
|
|
252
252
|
v
|
253
253
|
end
|
254
254
|
|
255
|
-
def set_record_value_for_attribute(
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
255
|
+
def set_record_value_for_attribute(record, attr, value)
|
256
|
+
::Rails.logger.debug "\n!!! attr: #{attr.inspect}\n"
|
257
|
+
value = value.to_time_in_current_zone if value.is_a?(Date) # convert Date to Time
|
258
|
+
unless attr[:read_only]
|
259
|
+
if attr[:setter]
|
260
|
+
attr[:setter].call(record, value)
|
261
|
+
elsif record.respond_to?("#{attr[:name]}=")
|
262
|
+
::Rails.logger.debug "\n!!! value: #{value.inspect}\n"
|
263
|
+
record.send("#{attr[:name]}=", value)
|
264
|
+
elsif association_attr?(attr)
|
265
|
+
split = attr[:name].to_s.split(/\.|__/)
|
266
|
+
if attr[:nested_attribute]
|
265
267
|
# We want:
|
266
268
|
# set_value_for_attribute({:name => :assoc_1__assoc_2__method, :nested_attribute => true}, 100)
|
267
269
|
# =>
|
268
|
-
#
|
269
|
-
split.inject(
|
270
|
+
# record.assoc_1.assoc_2.method = 100
|
271
|
+
split.inject(record) { |r,m| m == split.last ? (r && r.send("#{m}=", v) && r.save) : r.send(m) }
|
270
272
|
else
|
271
273
|
if split.size == 2
|
272
274
|
# search for association and assign it to r
|
@@ -274,9 +276,9 @@ module Netzke::Basepack::DataAdapters
|
|
274
276
|
assoc_method = split.last
|
275
277
|
if assoc
|
276
278
|
if assoc.macro == :has_one
|
277
|
-
assoc_instance =
|
279
|
+
assoc_instance = record.send(assoc.name)
|
278
280
|
if assoc_instance
|
279
|
-
assoc_instance.send("#{assoc_method}=",
|
281
|
+
assoc_instance.send("#{assoc_method}=", value)
|
280
282
|
assoc_instance.save # what should we do when this fails?..
|
281
283
|
else
|
282
284
|
# what should we do in this case?
|
@@ -285,13 +287,13 @@ module Netzke::Basepack::DataAdapters
|
|
285
287
|
|
286
288
|
# set the foreign key to the passed value
|
287
289
|
# not that if a negative value is passed, we reset the association (set it to nil)
|
288
|
-
|
290
|
+
record.send("#{assoc.foreign_key}=", value.to_i < 0 ? nil : value)
|
289
291
|
end
|
290
292
|
else
|
291
293
|
logger.warn "Netzke: Association #{assoc} is not known for class #{@data_class}"
|
292
294
|
end
|
293
295
|
else
|
294
|
-
logger.warn "Netzke: Wrong attribute name: #{
|
296
|
+
logger.warn "Netzke: Wrong attribute name: #{attr[:name]}"
|
295
297
|
end
|
296
298
|
end
|
297
299
|
end
|
@@ -62,7 +62,7 @@ module Netzke
|
|
62
62
|
@record = data_class.new if @record.nil?
|
63
63
|
|
64
64
|
hsh.each_pair do |k,v|
|
65
|
-
data_adapter.set_record_value_for_attribute(@record, fields[k.to_sym].nil? ? {:name => k} : fields[k.to_sym], v
|
65
|
+
data_adapter.set_record_value_for_attribute(@record, fields[k.to_sym].nil? ? {:name => k} : fields[k.to_sym], v)
|
66
66
|
end
|
67
67
|
|
68
68
|
# did we have complete success?
|
@@ -124,22 +124,24 @@ module Netzke
|
|
124
124
|
end
|
125
125
|
|
126
126
|
def update_record(record, attrs)
|
127
|
-
# merge with strong default attirbutes
|
128
|
-
attrs.merge!(config[:strong_default_attrs]) if config[:strong_default_attrs]
|
129
|
-
|
130
127
|
attrs.each_pair do |k,v|
|
131
128
|
attr = final_columns_hash[k.to_sym]
|
132
129
|
next if attr.nil?
|
133
130
|
data_adapter.set_record_value_for_attribute(record, attr, v)
|
134
131
|
end
|
135
132
|
|
133
|
+
strong_attrs = config[:strong_default_attrs] || {}
|
134
|
+
|
135
|
+
strong_attrs.each_pair do |k,v|
|
136
|
+
data_adapter.set_record_value_for_attribute(record, {name: k.to_s}, v)
|
137
|
+
end
|
138
|
+
|
136
139
|
if record.save
|
137
140
|
{record: data_adapter.record_to_array(record, final_columns(:with_meta => true))}
|
138
141
|
else
|
139
142
|
{error: record.errors.to_a}
|
140
143
|
end
|
141
144
|
end
|
142
|
-
|
143
145
|
end
|
144
146
|
end
|
145
147
|
end
|
data/lib/netzke/basepack/tree.rb
CHANGED
@@ -2,7 +2,9 @@ module Netzke
|
|
2
2
|
module Basepack
|
3
3
|
# Ext.tree.Panel-based component with the following features:
|
4
4
|
#
|
5
|
-
# * CRUD operations
|
5
|
+
# * CRUD operations
|
6
|
+
# * Persistence of node expand/collapse state
|
7
|
+
# * (TODO) Node reordering by DnD
|
6
8
|
#
|
7
9
|
# == Simple example
|
8
10
|
#
|
@@ -11,7 +13,7 @@ module Netzke
|
|
11
13
|
# super
|
12
14
|
# c.model = "FileRecord"
|
13
15
|
# c.columns = [
|
14
|
-
# {name: :name, xtype: :treecolumn},
|
16
|
+
# {name: :name, xtype: :treecolumn}, # this column will show tree nodes
|
15
17
|
# :size
|
16
18
|
# ]
|
17
19
|
# end
|
@@ -40,7 +42,7 @@ module Netzke
|
|
40
42
|
# [root]
|
41
43
|
#
|
42
44
|
# By default, the component will pick whatever record is returned by `TreeModel.root`, and use it as the root
|
43
|
-
# record. However, sometimes the model table has multiple root records (
|
45
|
+
# record. However, sometimes the model table has multiple root records (whith `parent_id` set to `nil`), and all
|
44
46
|
# of them should be shown in the panel. To achive this, you can define the `root` config option,
|
45
47
|
# which will serve as a virtual root record for those records. You may set it to `true`, or a hash of
|
46
48
|
# attributes, e.g.:
|
@@ -49,6 +51,10 @@ module Netzke
|
|
49
51
|
#
|
50
52
|
# Note, that the root record can be hidden from the tree by specifying the `Ext.tree.Panel`'s `root_visible`
|
51
53
|
# config option set to `false`, which is probably what you want when you have multiple root records.
|
54
|
+
#
|
55
|
+
# == Persisting nodes' expand/collapse state
|
56
|
+
#
|
57
|
+
# If the model includes the `expanded` DB field, the expand/collapse state will get stored in the DB.
|
52
58
|
class Tree < Netzke::Base
|
53
59
|
NODE_ATTRS = {
|
54
60
|
boolean: %w[leaf checked expanded expandable qtip qtitle],
|
@@ -94,11 +100,23 @@ module Netzke
|
|
94
100
|
def read(params = {})
|
95
101
|
{}.tap do |res|
|
96
102
|
records = get_records(params)
|
97
|
-
res[:
|
103
|
+
res[:children] = records.map{|r| node_to_hash(r, final_columns(with_meta: true)).netzke_literalize_keys.symbolize_keys}
|
98
104
|
res[:total] = count_records(params) if config[:enable_pagination]
|
99
105
|
end
|
100
106
|
end
|
101
107
|
|
108
|
+
def node_to_hash(record, columns)
|
109
|
+
data_adapter.record_to_hash(record, columns).tap do |hash|
|
110
|
+
if is_node_expanded?(record) && record.children.count > 0
|
111
|
+
hash[:children] = record.children.map {|child| node_to_hash(child, columns).netzke_literalize_keys.symbolize_keys}
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def is_node_expanded?(record)
|
117
|
+
record.respond_to?(:expanded) && record.expanded?
|
118
|
+
end
|
119
|
+
|
102
120
|
def js_configure(c)
|
103
121
|
super
|
104
122
|
|
@@ -166,6 +184,14 @@ module Netzke
|
|
166
184
|
this.delete(:set_form_values)
|
167
185
|
end
|
168
186
|
|
187
|
+
endpoint :server_update_node_state do |params, this|
|
188
|
+
node = data_adapter.find_record(params[:id])
|
189
|
+
if node.respond_to?(:expanded)
|
190
|
+
node.expanded = params[:expanded]
|
191
|
+
data_adapter.save_record(node)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
169
195
|
protected
|
170
196
|
|
171
197
|
def bbar
|
@@ -8,12 +8,24 @@
|
|
8
8
|
|
9
9
|
delete this.root;
|
10
10
|
|
11
|
-
this.plugins = [];
|
11
|
+
this.plugins = this.plugins || [];
|
12
12
|
this.plugins.push(Ext.create('Ext.grid.plugin.CellEditing', {pluginId: 'celleditor'}));
|
13
13
|
|
14
14
|
this.callParent();
|
15
15
|
|
16
16
|
this.setDynamicActionProperties(); // enable/disable actions (buttons) depending on selection
|
17
|
+
this.getView().on('afteritemcollapse', this.handleNodeStateChange, this);
|
18
|
+
this.getView().on('afteritemexpand', this.handleNodeStateChange, this);
|
19
|
+
|
20
|
+
this.store.on('load', function(){
|
21
|
+
var root = this.getRootNode();
|
22
|
+
root.collapse();
|
23
|
+
root.expand(false);
|
24
|
+
}, this);
|
25
|
+
},
|
26
|
+
|
27
|
+
handleNodeStateChange: function(node){
|
28
|
+
this.serverUpdateNodeState({id: node.get('id'), expanded: node.isExpanded()});
|
17
29
|
},
|
18
30
|
|
19
31
|
// Process selectionchange event to enable/disable actions
|
@@ -54,8 +66,7 @@
|
|
54
66
|
netzkeBuildReader: function() {
|
55
67
|
var modelName = Netzke.modelName(this.id);
|
56
68
|
return Ext.create('Ext.data.reader.Json', {
|
57
|
-
model: modelName
|
58
|
-
rootProperty: 'data'
|
69
|
+
model: modelName
|
59
70
|
});
|
60
71
|
},
|
61
72
|
|
@@ -107,6 +118,6 @@
|
|
107
118
|
store.sync();
|
108
119
|
}
|
109
120
|
}, this);
|
110
|
-
}
|
121
|
+
},
|
111
122
|
|
112
123
|
}
|
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.12.
|
4
|
+
version: 0.12.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-08-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: netzke-core
|