skozlov-netzke-basepack 0.5.0 → 0.5.1

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/.gitignore CHANGED
@@ -2,4 +2,5 @@
2
2
  *.log
3
3
  pkg
4
4
  doc
5
+ Manifest
5
6
  test/app_root/vendor/plugins/netzke-core
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,178 @@
1
+ v0.5.1 - 2009-09-11
2
+ Fix: crash when FormPanel has no data_class_name specified.
3
+ New: DataAccessor widgets (Form/GridPanel) now let the underlying model know which widget (i.e. which instance) accesses its data. Can be useful in virtual attributes for generating widget-specific HTML.
4
+ Fix: DataAccessor widgets (Form/GridPanel) now don't crash when calculating default columns/fields for the underlying model that has polymorphic columns.
5
+ Fix: TabPanel was sending redundant "tabchange" event to server when initially instantiated.
6
+ Fix: column filters were making GridPanel crash when the column editor was set to "textarea".
7
+ Fix: dongling comma and "delete" object properties caused problems in IE and Safari.
8
+ Fix: a stand-alone TabPanel would not render the active item.
9
+ New: BasicApp: masquerading as "World". In this mode all the "touched" persistent preferences will be overwritten for all roles and users.
10
+ Impr: configuration panel's header now shows the underlying model's name for convenience.
11
+ Fix: MasqueradeSelector widget added.
12
+
13
+ v0.5.0
14
+ 2009-09-06
15
+ Major refactoring and code reorganization.
16
+ Compatibility with netzke-core v0.4.0.
17
+ New: GridPanel now supports adding/editing records in a form and extended configurable search.
18
+ New: GridPanel now can be loaded along with initial data (saves a request to the server).
19
+ New: context menu in GridPanel
20
+ New: "scopes" configuration option added to GridPanel to specify the searchlogic-compatible scope for the data.
21
+ New: "strong_default_attrs" config option added to GridPanel to specify the attributes that will be assigned to each record that is created or modified by the grid.
22
+ Usability: GridPanel's actions now get enabled/disabled according to the current selection.
23
+ Configuration panel for grids and forms now works more consistently.
24
+ New: some smart defaults for column/fields in Grid/FormPanel.
25
+ New: BasicApp supports masquerading and application-wide AJAX activity indicator.
26
+
27
+ v0.4.2
28
+ 2009-05-07
29
+ Fix: afterlayout event bind removed completely because of some tricky inconsistent behavior of Ext. BasicApp initializing code put directly into js_after_constructor.
30
+
31
+ v0.4.1
32
+ 2009-05-07
33
+ Fix: afterlayout call moved to js_after_constructor in BasicApp
34
+ Fix: cleaner persistent_config handling
35
+ New: default's configuration enabled for FormPanel on class-level
36
+ Fix: differently configured forms on the same page were showing the same columns
37
+ Fix: TableEditor was showing config-tool by default (must be hidden)
38
+
39
+ v0.4.0
40
+ 2009-05-07
41
+ Refactor: got rid of NetzkeFormPanelField and NetzkeGridPanelColumn classes along with their tables. The layout is now stored in netzke_preferences.
42
+ New: dynamic hiding of columns from column menu in GridPanel.
43
+ New: FormPanel now supports combo boxes.
44
+ Fix: config[:bbar] set to 'false' now works in grids with pagination
45
+ New: you can specify :preloaded => true in a tab config in TabPanel to preload the widget in that tab along with the TabPanel itself
46
+ New: hideBusy added to Ext.StatusBar
47
+ Fix: assigning association (a Boss to a Clerk) by virtual column (like boss__name) works now
48
+ Fix: an old bug that made GridPanel misbehave after reordering the columns
49
+
50
+ v0.3.10
51
+ BasicApp-based widgets can now introduce arbitrary layout, following the convention of defining "main-panel" and "main-toolbar" panels with layout 'fit'.
52
+
53
+ v0.3.9.1
54
+ Bug fix: (regression) appLoaded() in BasicApp gets executed again
55
+
56
+ v0.3.9
57
+ AccordionPanel tests added
58
+ TabPanel works now
59
+ AccordionPanel replaced with more intuitive TabPanel in the configuration window
60
+ Code clean-up by using "single" option to call appLoaded() on "afterlayout"
61
+ Table editor bug fix
62
+
63
+ v0.3.8
64
+ Fixing Ext's EditableItem render problem.
65
+ Filters by default enabled again in GridPanel.
66
+ GridPanel enhancement: base_params get sent along with post_data.
67
+
68
+ v0.3.7
69
+ Netzke-core version sync.
70
+ Rails 2.3.2 compatibility.
71
+
72
+ v0.3.6
73
+ Netzke-core v0.2.9 compatibility.
74
+ Cleaner handling of custom renderers in GridPanel.
75
+ New FormPanel-based PropertyEditor replaces PropertyGrid.
76
+ Xcheckbox and check-column introduced.
77
+ TODO file added.
78
+ Bug fix: in TableEditor, the grid now responses on events also after being reconfigured.
79
+ Bug fix: a couple of IE-related bugs.
80
+ Significant code clean-up.
81
+
82
+ v0.3.5
83
+ Netzke-core v0.2.8 compatibility.
84
+
85
+ v0.3.4
86
+ Quick tips added to the "tools".
87
+ Regression: the "General" configuration panel for GridPanel works again.
88
+ GridPanel: rows_per_page configuration is now read from General config panel.
89
+
90
+ v0.3.3.1
91
+ Obviously using "new" as a property name in JavaScript isn't liked by Safari. Fixed.
92
+
93
+ v0.3.3
94
+ Bug fix: application not loading the widget specified in the URL (Ext.History-related).
95
+ Some code refactoring and readability improvements.
96
+ Ext.componentCache renamed into Ext.netzke.cache.
97
+ New widget: TableEditor (a compound widget containing a grid and a form for editing table data).
98
+ BorderLayoutPanel: a function getRegionWidget(region) added to access a widget in the specified region.
99
+ Bug fix: BasicApp: FeedbackGhost now gets instantiated before BasicApp.
100
+ Clearer handling of requests to non-existing aggregatees.
101
+ Bug fix: now Ext 2.2.1 compatible.
102
+ Column operations are now handled properly when :persistent_layout is set to false.
103
+ Grid/Form fields configuration is extended with "ext_config" field which stores (in JSON-format) all the extra configuration, which gives extra flexibility to individual column/field configuration.
104
+ :persistent_layout set to false now makes a widget ignore what's in the DB.
105
+ Bug fix: AccordionPanel doesn't crash when no active item is specified.
106
+ Bug fix: redundant flash messages for GridPanel.
107
+ FeedbackGhost won't be showing anything if given an empty array.
108
+ Cleaner handling of validations in GridPanel.
109
+ FormPanel ready for the demo.
110
+
111
+ v0.3.2
112
+ Minor code restructuring.
113
+ Working on FormPanel cont'd.
114
+
115
+ v0.3.1
116
+ Added the "conditions" configuration option to GridPanel to limit the search
117
+ Basic column editor for grids has been replaced with FieldsConfigurator, which can do a bit more
118
+ Added Checkbox column/form-field type for boolean fields
119
+ "renderer" configuration option added for grid columns - any Ext.util.Format renderer can be specified there (thanks to Josh Holt for the initial idea)
120
+
121
+ v0.3.0
122
+ Added BasicApp widget - the base for a Ext.Viewport based ("application") widget with support for dynamic widget loading, browser history, authentification, and more. See the demo an http://netzke-demo.writelesscode.com
123
+
124
+ v0.2.2
125
+ Meta: updated netzke-core version (dependency)
126
+
127
+ v0.2.1
128
+ Regression: BorderLayoutPanel now restores the region sizes from the database
129
+
130
+ v0.2.0.1
131
+ Meta: updated netzke-core version (dependency)
132
+
133
+ v0.2.0
134
+ Some re-factoring and redesign along with netzke-core
135
+ Panel widget added
136
+ BorderLayoutPanel added
137
+ AccordionPanel added
138
+ Bug fix: column operations configuration misbehaving
139
+ Renamed Grid into GridPanel
140
+ Bug fix: exception was thrown at a column operation when no layout_manager was present
141
+ Reworked permission handling in GridPanel.
142
+
143
+ v0.1.4.1
144
+ Meta: updated netzke-core version (dependency)
145
+
146
+ v0.1.4
147
+ Grid#get_columns provides default columns even if none of layout_manager_class & column_manager_class are available
148
+
149
+ v0.1.3.1
150
+ Meta: updated netzke-core version (dependency)
151
+
152
+ v0.1.3
153
+ Path to javascript for grid filters corrected
154
+ Bug with creating new records in the grid fixed
155
+ Optimized away redundant sql queries when calling Grid#get_columns (sort of memoization)
156
+ README updated
157
+
158
+ v0.1.2.1
159
+ Meta: trying to succeed publishing on RubyForge
160
+
161
+ v0.1.2
162
+ Updated README with an example of stand-alone widget usage
163
+ Meta: updated netzke-core version (dependency)
164
+
165
+ v0.1.1.2
166
+ Meta: updated netzke-core version (dependency)
167
+
168
+ v0.1.1.1
169
+ Meta: github gem naming convention
170
+
171
+ v0.1.1
172
+ Cleaner exception handling while loading data to grid
173
+ Column resize & move functionality enabled by default
174
+ Column filters added
175
+
176
+ v0.1.0.1 Meta work: replacing underscore with dash in the name
177
+
178
+ v0.1.0 Initial release
data/Rakefile CHANGED
@@ -1,18 +1,3 @@
1
- # require 'echoe'
2
- #
3
- # Echoe.new("netzke-basepack") do |p|
4
- # p.author = "Sergei Kozlov"
5
- # p.email = "sergei@playcode.nl"
6
- # p.summary = "Prebuilt Netzke widgets for your RIA"
7
- # p.url = "http://playcode.nl"
8
- # p.runtime_dependencies = ["binarylogic-searchlogic >= 2.0.0", "skozlov-netzke-core >= 0.4.0"]
9
- # p.development_dependencies = []
10
- # p.test_pattern = 'test/**/*_test.rb'
11
- #
12
- # # fixing the problem with lib/*-* files being removed while doing manifest
13
- # p.clean_pattern = ["pkg", "doc", 'build/*', '**/coverage', '**/*.o', '**/*.so', '**/*.a', '**/*.log', "{ext,lib}/*.{bundle,so,obj,pdb,lib,def,exp}", "ext/Makefile", "{ext,lib}/**/*.{bundle,so,obj,pdb,lib,def,exp}", "ext/**/Makefile", "pkg", "*.gem", ".config"]
14
- # end
15
-
16
1
  begin
17
2
  require 'jeweler'
18
3
  Jeweler::Tasks.new do |gemspec|
@@ -23,8 +8,33 @@ begin
23
8
  gemspec.homepage = "http://github.com/skozlov/netzke-basepack"
24
9
  gemspec.rubyforge_project = "netzke-basepack"
25
10
  gemspec.authors = ["Sergei Kozlov"]
26
- gemspec.add_dependency "skozlov-netzke-core", ">= 0.4.0"
11
+ gemspec.add_dependency "netzke-core"
12
+ gemspec.add_dependency "searchlogic"
13
+ end
14
+ Jeweler::RubyforgeTasks.new do |rubyforge|
15
+ rubyforge.doc_task = "rdoc"
27
16
  end
28
17
  rescue LoadError
29
18
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
30
19
  end
20
+
21
+ require 'rake/rdoctask'
22
+ Rake::RDocTask.new do |rdoc|
23
+ if File.exist?('VERSION')
24
+ version = File.read('VERSION')
25
+ else
26
+ version = ""
27
+ end
28
+
29
+ rdoc.rdoc_dir = 'rdoc'
30
+ rdoc.title = "netzke-basepack #{version}"
31
+ rdoc.rdoc_files.include('README*')
32
+ rdoc.rdoc_files.include('lib/**/*.rb')
33
+ end
34
+
35
+ require 'rake/testtask'
36
+ Rake::TestTask.new(:test) do |test|
37
+ test.libs << 'lib' << 'test'
38
+ test.pattern = 'test/**/*_test.rb'
39
+ test.verbose = true
40
+ end
data/TODO.rdoc CHANGED
@@ -1,6 +1,7 @@
1
1
  == Priority
2
2
  * Make column/fields configuration fool-proof
3
3
  * Introduce three-state checkbox for SearchPanel
4
+ * Add icons to buttons to actions (toolbars/menus)
4
5
 
5
6
  == One day
6
7
  * Add status bar to BasicApp
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.0
1
+ 0.5.1
@@ -89,6 +89,7 @@ Ext.util.Format.mask = function(v){
89
89
  Ext.netzke.filterMap = {
90
90
  numberfield:'Numeric',
91
91
  textfield:'String',
92
+ textarea:'String',
92
93
  xdatetime:'String',
93
94
  checkbox:'Boolean',
94
95
  combobox:'String',
@@ -150,62 +151,6 @@ Ext.netzke.JsonField = Ext.extend(Ext.form.TextField, {
150
151
 
151
152
  Ext.reg('jsonfield', Ext.netzke.JsonField);
152
153
 
153
- Ext.ns('Ext.netzke.form');
154
-
155
- Ext.netzke.form.FileWithType = Ext.extend(Ext.form.Field, {
156
- defaultAutoCreate:{tag:'input', type:'hidden'},
157
-
158
- initComponent: function(){
159
- Ext.netzke.form.FileWithType.superclass.initComponent.call(this);
160
-
161
- // this.ft = new Ext.form.ComboBox({
162
- // });
163
- this.ft = new Ext.form.TextField({
164
- name: this.name + "_filetype"
165
- });
166
- this.ft.ownerCt = this;
167
-
168
- this.f = new Ext.form.TextField({
169
- inputType:'file',
170
- name: this.name + "_file"
171
- });
172
- this.f.ownerCt = this;
173
- },
174
-
175
- onRender: function(ct, position){
176
- if(this.isRendered) {
177
- return;
178
- }
179
-
180
- // render underlying hidden field
181
- Ext.netzke.form.FileWithType.superclass.onRender.call(this, ct, position);
182
-
183
- var t; // table
184
-
185
- t = Ext.DomHelper.append(ct, {tag:'table',style:'border-collapse:collapse',children:[
186
- {tag:'tr',children:[
187
- {tag:'td', style:'padding:4px', cls:'ux-filewithtype-type'},
188
- {tag:'td', style:'padding:4px', cls:'ux-filewithtype-file'}
189
- ]}
190
- ]}, true);
191
-
192
- this.ft.render(t.child('td.ux-filewithtype-type'));
193
- this.f.render(t.child('td.ux-filewithtype-file'));
194
-
195
- this.el.dom.removeAttribute("name");
196
-
197
- //
198
- // this.tableEl = t;
199
-
200
- // we're rendered flag
201
- this.isRendered = true;
202
-
203
- // this.updateHidden();
204
- }
205
- });
206
-
207
- Ext.reg('filewithtype', Ext.netzke.form.FileWithType);
208
-
209
154
  /**
210
155
  * @class Ext.ux.form.DateTime
211
156
  * @extends Ext.form.Field
@@ -2,8 +2,20 @@ module Netzke::ActiveRecord
2
2
  # Provides extensions to those ActiveRecord-based models that provide data to the "data accessor" widgets,
3
3
  # like GridPanel, FormPanel, etc
4
4
  module DataAccessor
5
+
6
+ # Allow specify the netzke widget that requires this data. Virtual attributes may be using it to produce
7
+ # widget-dependent result.
8
+ def netzke_widget=(widget)
9
+ @netzke_widget = widget
10
+ end
11
+
12
+ def netzke_widget
13
+ @netzke_widget
14
+ end
15
+
5
16
  # Transforms a record to array of values according to the passed columns.
6
- def to_array(columns)
17
+ def to_array(columns, widget = nil)
18
+ self.netzke_widget = widget
7
19
  res = []
8
20
  for c in columns
9
21
  nc = c.is_a?(Symbol) ? {:name => c} : c
@@ -32,6 +32,8 @@ module Netzke
32
32
  elsif session[:masq_role]
33
33
  role = Role.find(session[:masq_role])
34
34
  masq = %Q{role "#{role.name}"}
35
+ elsif session[:masq_world]
36
+ masq = %Q{World}
35
37
  end
36
38
 
37
39
  [{
@@ -153,7 +155,7 @@ module Netzke
153
155
  END_OF_JAVASCRIPT
154
156
 
155
157
  # Masquerade selector window
156
- :show_masquerade_selector => <<-END_OF_JAVASCRIPT.l,
158
+ :show_masquerade_selector => <<-END_OF_JAVASCRIPT.l
157
159
  function(){
158
160
  var w = new Ext.Window({
159
161
  title: 'Masquerade as',
@@ -177,7 +179,18 @@ module Netzke
177
179
  },
178
180
  scope:this
179
181
  },{
180
- text:'Turn off masquerading',
182
+ text:'As World',
183
+ handler:function(){
184
+ Ext.Msg.confirm("Masquerading as World", "Caution! All settings that you will modify will be ovewritten for all roles and all users. Are you sure you know what you're doing?", function(btn){
185
+ if (btn === "yes") {
186
+ this.masquerade = {world:true};
187
+ w.close();
188
+ }
189
+ }, this);
190
+ },
191
+ scope:this
192
+ },{
193
+ text:'No masquerading',
181
194
  handler:function(){
182
195
  this.masquerade = {};
183
196
  w.close();
@@ -191,7 +204,7 @@ module Netzke
191
204
  scope:this
192
205
  }],
193
206
  listeners : {close: {fn: function(){
194
- this.masqAs(this.masquerade || w.getWidget().masquerade || {});
207
+ this.masqueradeAs(this.masquerade || w.getWidget().masquerade || {});
195
208
  }, scope: this}}
196
209
  });
197
210
 
@@ -201,24 +214,6 @@ module Netzke
201
214
 
202
215
  }
203
216
  END_OF_JAVASCRIPT
204
-
205
- # Masquerade as...
206
- :masq_as => <<-END_OF_JAVASCRIPT.l
207
- function(masqConfig){
208
- params = {};
209
-
210
- if (masqConfig.user) {
211
- params.user = masqConfig.user
212
- }
213
-
214
- if (masqConfig.role) {
215
- params.role = masqConfig.role
216
- }
217
-
218
- this.masqueradeAs(params);
219
-
220
- }
221
- END_OF_JAVASCRIPT
222
217
  }
223
218
  end
224
219
  end
@@ -260,7 +255,7 @@ module Netzke
260
255
 
261
256
  if session[:netzke_just_logged_in] || session[:netzke_just_logged_out]
262
257
  session[:config_mode] = false
263
- session[:masq_user] = session[:masq_roles] = nil
258
+ session[:masq_world] = session[:masq_user] = session[:masq_roles] = nil
264
259
  end
265
260
 
266
261
  strong_children_config.deep_merge!({:ext_config => {:mode => :config}}) if session[:config_mode]
@@ -316,6 +311,7 @@ module Netzke
316
311
  api :masquerade_as
317
312
  def masquerade_as(params)
318
313
  session = Netzke::Base.session
314
+ session[:masq_world] = params[:world]
319
315
  session[:masq_role] = params[:role]
320
316
  session[:masq_user] = params[:user]
321
317
  {:js => "window.location.reload()"}
@@ -1,5 +1,5 @@
1
1
  module Netzke
2
- # TabPanel-based widget that wraps-up "conifuration widgets" that each widget can define
2
+ # TabPanel-based widget that wraps-up "configuration widgets" that each widget can define
3
3
  # (along) with including the Plugins::ConfigurationTool tool.
4
4
  class ConfigurationPanel < TabPanel
5
5
  api :commit
@@ -24,7 +24,7 @@ module Netzke
24
24
  def predefined_columns
25
25
  helper_module = "Netzke::Helpers::#{short_widget_class_name}#{data_class.name}".constantize rescue nil
26
26
 
27
- data_class_columns = data_class.column_names.map(&:to_sym)
27
+ data_class_columns = data_class && data_class.column_names.map(&:to_sym) || []
28
28
 
29
29
  if helper_module
30
30
  exposed_attributes = helper_module.respond_to?(:exposed_attributes) ? normalize_array_of_columns(helper_module.exposed_attributes) : nil
@@ -26,7 +26,7 @@ module Netzke
26
26
  end
27
27
 
28
28
  if success && @record.save
29
- {:set_form_values => @record.to_array(columns)}
29
+ {:set_form_values => array_of_values}
30
30
  else
31
31
  # flash eventual errors
32
32
  @record.errors.each_full do |msg|
@@ -48,8 +48,8 @@ module Netzke
48
48
  # end
49
49
 
50
50
  def load(params)
51
- record = data_class && data_class.find_by_id(params[:id])
52
- {:set_form_values => record.to_array(columns)}
51
+ @record = data_class && data_class.find_by_id(params[:id])
52
+ {:set_form_values => array_of_values}
53
53
  end
54
54
 
55
55
  # API that returns options for a combobox
@@ -67,7 +67,7 @@ module Netzke
67
67
 
68
68
  # Returns array of form values according to the configured columns
69
69
  def array_of_values
70
- @record && @record.to_array(columns)
70
+ @record && @record.to_array(columns, self)
71
71
  end
72
72
 
73
73
  end
@@ -385,7 +385,7 @@ module Netzke
385
385
  # detect ActiveRecord column type (if the column is "real") or fall back to :virtual
386
386
  type = (data_class.columns_hash[c[:name].to_s] && data_class.columns_hash[c[:name].to_s].type) || :virtual
387
387
 
388
- # detect :assoc__method
388
+ # detect :assoc__method columns
389
389
  if c[:name].to_s.index('__')
390
390
  assoc_name, method = c[:name].to_s.split('__').map(&:to_sym)
391
391
  if assoc = data_class.reflect_on_association(assoc_name)
@@ -399,7 +399,8 @@ module Netzke
399
399
  end
400
400
 
401
401
  # detect association column (e.g. :category_id)
402
- if assoc = data_class.reflect_on_all_associations.detect{|a| a.primary_key_name.to_sym == c[:name]}
402
+ assoc = data_class.reflect_on_all_associations.detect{|a| a.primary_key_name.to_sym == c[:name]}
403
+ if assoc && !assoc.options[:polymorphic]
403
404
  c[:editor] ||= :combobox
404
405
  assoc_method = %w{name title label id}.detect{|m| (assoc.klass.instance_methods + assoc.klass.column_names).include?(m) } || assoc.klass.primary_key
405
406
  c[:name] = "#{assoc.name}__#{assoc_method}".to_sym
@@ -410,13 +411,10 @@ module Netzke
410
411
 
411
412
  # default editor, dependent on column type
412
413
  c[:editor] ||= TYPE_EDITOR_MAP[type] unless TYPE_EDITOR_MAP[type].nil?
413
-
414
414
  # narrow column for checkbox
415
415
  c[:width] ||= 50 if c[:editor] == :checkbox
416
-
417
416
  # wider column for xdatetime
418
417
  c[:width] ||= 120 if c[:editor] == :xdatetime
419
-
420
418
  # hide ID column
421
419
  c[:hidden] = true if c[:name] == data_class.primary_key.to_sym && c[:hidden].nil?
422
420
 
@@ -21,7 +21,7 @@ module Netzke
21
21
  def get_data(params = {})
22
22
  if !ext_config[:prohibit_read]
23
23
  records = get_records(params)
24
- {:data => records.map{|r| r.to_array(normalized_columns)}, :total => ext_config[:enable_pagination] && records.total_entries}
24
+ {:data => records.map{|r| r.to_array(normalized_columns, self)}, :total => ext_config[:enable_pagination] && records.total_entries}
25
25
  else
26
26
  flash :error => "You don't have permissions to read data"
27
27
  {:feedback => @flash}
@@ -149,7 +149,7 @@ module Netzke
149
149
 
150
150
  # try to save
151
151
  # modified_records += 1 if success && record.save
152
- mod_records[id] = record.to_array(columns) if success && record.save
152
+ mod_records[id] = record.to_array(columns, self) if success && record.save
153
153
  # mod_record_ids << id if success && record.save
154
154
 
155
155
  # flash eventual errors
@@ -273,7 +273,7 @@ module Netzke
273
273
 
274
274
  :update => <<-END_OF_JAVASCRIPT.l,
275
275
  function(){
276
- this.refresh();
276
+ this.store.reload();
277
277
  }
278
278
  END_OF_JAVASCRIPT
279
279
 
@@ -0,0 +1,53 @@
1
+ module Netzke
2
+ class MasqueradeSelector < TabPanel
3
+
4
+ def items
5
+ @items ||= [{
6
+ :name => "roles",
7
+ :active => true,
8
+ :widget_class_name => "GridPanel",
9
+ :data_class_name => 'Role',
10
+ :columns => [:id, :name],
11
+ :ext_config => {
12
+ :header => false,
13
+ :bbar => ['search']
14
+ }
15
+ },{
16
+ :name => "users",
17
+ :preloaded => true,
18
+ :widget_class_name => "GridPanel",
19
+ :data_class_name => 'User',
20
+ :ext_config => {
21
+ :header => false,
22
+ :rows_per_page => 10,
23
+ :bbar => ['search']
24
+ },
25
+ :columns => [:id, :login]
26
+ }]
27
+ end
28
+
29
+ def self.js_extend_properties
30
+ {
31
+ :after_constructor => <<-END_OF_JAVASCRIPT.l,
32
+ function(){
33
+ this.items.each(function(tab){
34
+ tab.on('add', function(ct, cmp){
35
+ cmp.on('rowclick', this.rowclickHandler, this);
36
+ }, this);
37
+ }, this);
38
+ }
39
+ END_OF_JAVASCRIPT
40
+
41
+ :rowclick_handler => <<-END_OF_JAVASCRIPT.l
42
+ function(grid, rowIndex, e){
43
+ var mode = grid.id.split("__").pop();
44
+ var normMode = mode === 'users' ? 'user' : 'role';
45
+ this.masquerade = {};
46
+ this.masquerade[normMode] = grid.store.getAt(rowIndex).get('id');
47
+ }
48
+ END_OF_JAVASCRIPT
49
+ }
50
+ end
51
+
52
+ end
53
+ end
@@ -31,7 +31,7 @@ module Netzke::Plugins
31
31
  :gear => <<-END_OF_JAVASCRIPT.l
32
32
  function(){
33
33
  var w = new Ext.Window({
34
- title:'Config',
34
+ title:'Config - '+ this.dataClassName,
35
35
  layout:'fit',
36
36
  modal:true,
37
37
  width: Ext.lib.Dom.getViewWidth() *0.9,
@@ -66,7 +66,7 @@ module Netzke
66
66
  a
67
67
  end
68
68
 
69
- def to_array(columns)
69
+ def to_array(columns, widget = nil)
70
70
  res = []
71
71
  for c in columns
72
72
  method = c.is_a?(Symbol) ? c : c[:name]
@@ -22,11 +22,28 @@ module Netzke
22
22
  :id_delimiter => "___", # the default was "__", which conflicts with Netzke's double underscore notation
23
23
  :defaults => {:layout => 'fit'}, # all tabs will be Ext.Panel-s with layout 'fit' ("fit-panels")
24
24
 
25
- :init_component => <<-END_OF_JAVASCRIPT.l,
26
- function(){
27
- Ext.netzke.cache.#{short_widget_class_name}.superclass.initComponent.call(this);
25
+ :render => <<-END_OF_JAVASCRIPT.l,
26
+ function(el){
27
+ Ext.netzke.cache.#{short_widget_class_name}.superclass.render.call(this, el);
28
28
 
29
- this.on('tabchange', function(self, tab){this.loadItemWidget(tab)}, this);
29
+ // We do this all in +render+ because only at this moment the activeTab is actually activated
30
+ var activeTab = this.getActiveTab();
31
+ this.loadWidgetInto(activeTab);
32
+ this.on('tabchange', this.onTabChange, this);
33
+ }
34
+ END_OF_JAVASCRIPT
35
+
36
+ :load_widget_into => <<-END_OF_JAVASCRIPT.l,
37
+ function(fitPanel){
38
+ var preloadedItemConfig = this[fitPanel.widget.camelize(true)+"Config"];
39
+ if (preloadedItemConfig){
40
+ // preloaded widget only needs to be instantiated, as its class and configuration have already been loaded
41
+ fitPanel.add(new Ext.netzke.cache[preloadedItemConfig.widgetClassName](preloadedItemConfig));
42
+ fitPanel.doLayout();
43
+ } else {
44
+ // load the widget from the server
45
+ this.loadAggregatee({id:fitPanel.widget, container:fitPanel.id});
46
+ }
30
47
  }
31
48
  END_OF_JAVASCRIPT
32
49
 
@@ -58,27 +75,20 @@ module Netzke
58
75
  }
59
76
  END_OF_JAVASCRIPT
60
77
 
61
- # loads widget into the panel if it wasn't loaded yet
62
- :load_item_widget => <<-END_OF_JAVASCRIPT.l
63
- function(panel) {
64
- if (!panel.getWidget()) {
65
- if (preloadedItemConfig = this.initialConfig[panel.widget.camelize()+"Config"]){
66
- // preloaded widget only needs to be instantiated, as its class and configuration have already been loaded
67
- panel.add(new Ext.netzke.cache[preloadedItemConfig.widgetClassName](preloadedItemConfig));
68
- panel.doLayout(); // always needed after adding a component
69
- } else {
70
- // load the widget from the server
71
- this.loadAggregatee({id:panel.widget, container:panel.id});
72
- }
78
+ :on_tab_change => <<-END_OF_JAVASCRIPT.l
79
+ function(self, tab) {
80
+ // load widget into the panel if it wasn't loaded yet
81
+ if (!tab.getWidget()) {
82
+ this.loadWidgetInto(tab);
73
83
  }
74
84
 
75
- // inform the server about active tab changed
76
- this.apiActivateTab({tab:panel.widget});
85
+ // inform the server about active tab change
86
+ this.apiActivateTab({tab:tab.widget});
77
87
 
78
88
  // call "update" on the widget
79
- if (panel.outdated) {
80
- delete panel.outdated;
81
- var widget = panel.getWidget();
89
+ if (tab.outdated) {
90
+ tab.outdated = false;
91
+ var widget = tab.getWidget();
82
92
  if (widget && widget.update) {widget.update.call(widget)};
83
93
  }
84
94
  }
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{netzke-basepack}
8
- s.version = "0.5.0"
8
+ s.version = "0.5.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Sergei Kozlov"]
12
- s.date = %q{2009-09-06}
12
+ s.date = %q{2009-09-11}
13
13
  s.description = %q{Pre-built Netzke widgets for your RIA}
14
14
  s.email = %q{sergei@playcode.nl}
15
15
  s.extra_rdoc_files = [
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".autotest",
21
21
  ".gitignore",
22
+ "CHANGELOG.rdoc",
22
23
  "LICENSE",
23
24
  "README.rdoc",
24
25
  "Rakefile",
@@ -50,6 +51,7 @@ Gem::Specification.new do |s|
50
51
  "lib/netzke/grid_panel_extras/javascripts/filters.js",
51
52
  "lib/netzke/grid_panel_extras/javascripts/rows-dd.js",
52
53
  "lib/netzke/grid_panel_js.rb",
54
+ "lib/netzke/masquerade_selector.rb",
53
55
  "lib/netzke/panel.rb",
54
56
  "lib/netzke/plugins/configuration_tool.rb",
55
57
  "lib/netzke/property_editor.rb",
@@ -155,11 +157,14 @@ Gem::Specification.new do |s|
155
157
  s.specification_version = 3
156
158
 
157
159
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
158
- s.add_runtime_dependency(%q<skozlov-netzke-core>, [">= 0.4.0"])
160
+ s.add_runtime_dependency(%q<netzke-core>, [">= 0"])
161
+ s.add_runtime_dependency(%q<searchlogic>, [">= 0"])
159
162
  else
160
- s.add_dependency(%q<skozlov-netzke-core>, [">= 0.4.0"])
163
+ s.add_dependency(%q<netzke-core>, [">= 0"])
164
+ s.add_dependency(%q<searchlogic>, [">= 0"])
161
165
  end
162
166
  else
163
- s.add_dependency(%q<skozlov-netzke-core>, [">= 0.4.0"])
167
+ s.add_dependency(%q<netzke-core>, [">= 0"])
168
+ s.add_dependency(%q<searchlogic>, [">= 0"])
164
169
  end
165
170
  end
@@ -3,7 +3,7 @@ class CreateNetzkePreferences < ActiveRecord::Migration
3
3
  create_table :netzke_preferences do |t|
4
4
  t.string :name
5
5
  t.string :pref_type
6
- t.string :value
6
+ t.text :value
7
7
  t.integer :user_id
8
8
  t.integer :role_id
9
9
  t.string :widget_name
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skozlov-netzke-basepack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergei Kozlov
@@ -9,18 +9,28 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-06 00:00:00 -07:00
12
+ date: 2009-09-11 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: skozlov-netzke-core
16
+ name: netzke-core
17
17
  type: :runtime
18
18
  version_requirement:
19
19
  version_requirements: !ruby/object:Gem::Requirement
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 0.4.0
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: searchlogic
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
24
34
  version:
25
35
  description: Pre-built Netzke widgets for your RIA
26
36
  email: sergei@playcode.nl
@@ -34,6 +44,7 @@ extra_rdoc_files:
34
44
  files:
35
45
  - .autotest
36
46
  - .gitignore
47
+ - CHANGELOG.rdoc
37
48
  - LICENSE
38
49
  - README.rdoc
39
50
  - Rakefile
@@ -65,6 +76,7 @@ files:
65
76
  - lib/netzke/grid_panel_extras/javascripts/filters.js
66
77
  - lib/netzke/grid_panel_extras/javascripts/rows-dd.js
67
78
  - lib/netzke/grid_panel_js.rb
79
+ - lib/netzke/masquerade_selector.rb
68
80
  - lib/netzke/panel.rb
69
81
  - lib/netzke/plugins/configuration_tool.rb
70
82
  - lib/netzke/property_editor.rb