lipsiadmin 3.4.2 → 4.0.0

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 CHANGED
@@ -1,3 +1,9 @@
1
+ 2009-05-11
2
+ * Bumped version to 4.0.0
3
+ * Refactored backend.js so javascript in tabs are evalued after render so you can interact with tabs
4
+ * Refactored Backend.window so now you can do much more with your grids/forms. See rdoc for examples.
5
+ * Small refactor to attachment processor, now original attachments are saved without "_original_" in the filename.
6
+
1
7
  2009-05-07
2
8
  * Fixed a problem with WithoutTable
3
9
  * Removed unusued routes
@@ -78,6 +78,9 @@ module Lipsiadmin
78
78
  end.join(",")
79
79
  end
80
80
 
81
+ # Adding a name for our column
82
+ options[:name] ||= "#{@model.table_name.singularize}[#{options[:method]}]"
83
+
81
84
  # Reformat query
82
85
  if options[:method].is_a?(Symbol)
83
86
  options[:dataIndex] ||= "#{@model.table_name}.#{options[:method]}"
@@ -115,7 +115,7 @@ module Lipsiadmin
115
115
  :path => ":rails_root/public/uploads/:id_:style_:basename.:extension",
116
116
  :styles => {},
117
117
  :default_url => "/images/backend/no-image.png",
118
- :default_style => :normal,
118
+ :default_style => :original,
119
119
  :validations => {},
120
120
  :storage => :filesystem
121
121
  }
@@ -486,9 +486,9 @@ module Lipsiadmin
486
486
  interpolations = self.class.interpolations.sort{|a,b| a.first.to_s <=> b.first.to_s }
487
487
  interpolations.reverse.inject( pattern.dup ) do |result, interpolation|
488
488
  tag, blk = interpolation
489
- result.gsub(/:#{tag}/) do |match|
490
- blk.call( self, style )
491
- end
489
+ match = blk.call(self, style)
490
+ # If we use tag original we dont want to add :original to filename or url
491
+ tag == :style && match == :original ? result.gsub(/:style_/, "") : result.gsub(/:#{tag}/, match.to_s)
492
492
  end
493
493
  end
494
494
 
data/lib/version.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Lipsiadmin
2
2
  module VERSION #:nodoc:
3
- MAJOR = 3
4
- MINOR = 4
5
- TINY = 2
3
+ MAJOR = 4
4
+ MINOR = 0
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -47,22 +47,99 @@ module Lipsiadmin
47
47
  return config.to_json
48
48
  end
49
49
 
50
+ # Open a new windows that can contain a grid that you can reuse
51
+ #
52
+ # The first argument name is used as the link text.
53
+ #
54
+ # The second argument is the url where js of grid are stored.
55
+ #
56
+ # The third argument is the name of the gird var usually gridPanel or editorGridPanel.
57
+ #
58
+ # The four argument are callbacks that may be specified:
59
+ #
60
+ # <tt>:before</tt>:: Called before request is initiated.
61
+ # <tt>:update</tt>:: Called after user press +select+ button.
62
+ # This call are performed in an handler where
63
+ # you have access to two variables:
64
+ # <tt>:win</tt>:: Backend.window
65
+ # <tt>:selections</tt>:: Records selected in the grid
66
+ #
67
+ # # Generates: <a onclick="
68
+ # # new Backend.window({
69
+ # # url: '/backend/categories.js',
70
+ # # grid: 'gridPanel',
71
+ # # listeners: {
72
+ # # selected: function(win, selections){
73
+ # # $('post_category_ids').value = selections.collect(function(s) { return s.id }).join(',');
74
+ # # $('category_names').innerHTML = selections.collect(function(s) { return s.data['categories.name'] }).join(', ');
75
+ # # }
76
+ # # }
77
+ # # }).show();
78
+ # # return false;" href="#">Select a Category</a>
79
+ #
80
+ # open_grid "Select a Category", "/backend/categories.js", "gridPanel",
81
+ # :update => "$('post_category_ids').value = selections.collect(function(s) { return s.id }).join(',');" +
82
+ # "$('category_names').innerHTML = selections.collect(function(s) { return s.data['categories.name'] }).join(', ');"
83
+ #
84
+ def open_grid(text, url, grid, options={})
85
+ options[:before] = options[:before] + ";" if options[:before]
86
+ javascript = <<-JAVASCRIPT
87
+ #{options[:before]}
88
+ new Backend.window({
89
+ url: '#{url}',
90
+ grid: '#{grid}',
91
+ listeners: {
92
+ selected: function(win, selections){
93
+ #{options[:update]}
94
+ }
95
+ }
96
+ }).show()
97
+ JAVASCRIPT
98
+ link_to_function(text, javascript)
99
+ end
100
+
50
101
  # Open a new windows that can contain a form that you can reuse
51
102
  #
52
- # Example:
53
- #
54
- # # in app/views/dossiers/_form.html.haml
55
- # %tr
56
- # %td{:style=>"width:100px"}
57
- # %b Customer:
58
- # %td
59
- # %span{:id => :account_name}=@dossier.account ? @dossier.account.full_name : "None"
60
- # =hidden_field :dossier, :account_id
61
- # =open_window "/backend/accounts.js", :id, :name, :dossier_account_id, :account_name
62
- #
63
- def open_window(url, value, display, render_value_to, render_display_to)
64
- link_to_function(image_tag("backend/new.gif", :style=>"vertical-align:bottom"),
65
- "Backend.window.open({url:'#{url}', display:'#{display}', value:'#{value}', displayField:'#{render_display_to}', valueField:'#{render_value_to}'})")
103
+ # The first argument name is used as the link text.
104
+ #
105
+ # The second argument is the url where html of form are stored.
106
+ #
107
+ # The third argument are callbacks that may be specified:
108
+ #
109
+ # <tt>:before</tt>:: Called before request is initiated.
110
+ # <tt>:update</tt>:: Called after user press +save+ button.
111
+ # This call are performed in an handler where
112
+ # you have access to one variables:
113
+ # <tt>:win</tt>:: Backend.window
114
+ #
115
+ # # Generates: <a onclick="
116
+ # # new Backend.window({
117
+ # # url: '/backend/posts/'+$('comment_post_id').value+'/edit',
118
+ # # form: true,
119
+ # # listeners: {
120
+ # # saved: function(win){
121
+ # # someFn();
122
+ # # }
123
+ # # }
124
+ # # }).show();
125
+ # # return false;" href="#">Edit Post</a>
126
+ # open_form "Edit Post", "/backend/posts/'+$('comment_post_id').value+'/edit", :update => "someFn();"
127
+ #
128
+ def open_form(text, url, options={})
129
+ options[:before] = options[:before] + ";" if options[:before]
130
+ javascript = <<-JAVASCRIPT
131
+ #{options[:before]}
132
+ new Backend.window({
133
+ url: '#{url}',
134
+ form: true,
135
+ listeners: {
136
+ saved: function(win){
137
+ #{options[:update]}
138
+ }
139
+ }
140
+ }).show()
141
+ JAVASCRIPT
142
+ link_to_function(text, javascript)
66
143
  end
67
144
 
68
145
  # This method call a remote_function and in the same time do a
@@ -56,9 +56,54 @@ module Lipsiadmin
56
56
  # # Generates: Ext.util.Format.boolRenderer
57
57
  # :renderer => :boolean
58
58
  #
59
+ # You can pass :edit_with_###
60
+ #
61
+ # # Generates: { checkbox: true }
62
+ # :editor => { :xtype => :checkbox, :someConfig => true }
63
+ # # Generates: new Ext.form.ComboBox({ someConfig => true });
64
+ # :editor => { :xtype => :combo, :someConfig => true }
65
+ # # Generates: new Ext.form.DateField({ someConfig => true });
66
+ # :editor => { :xtype => :datefield, :someConfig => true }
67
+ # # Generates: new Ext.form.NumberField({ someConfig => true });
68
+ # :editor => { :xtype => :numberfield, :someConfig => true }
69
+ # # Generates: new Ext.form.Radio({ someConfig => true });
70
+ # :editor => { :xtype => :radio, :someConfig => true }
71
+ # # Generates: new Ext.form.TextArea({ someConfig => true });
72
+ # :editor => { :xtype => :textarea, :someConfig => true }
73
+ # # Generates: new Ext.form.TextField({ someConfig => true });
74
+ # :editor => { :xtype => :textfield, :someConfig => true }
75
+ # # Generates: new Ext.form.TimeField({ someConfig => true });
76
+ # :editor => { :xtype => :timefield, :someConfig => true }
77
+ #
78
+ # Form components so are:
79
+ # ---------------------------------------
80
+ # :checkbox => Ext.form.Checkbox
81
+ # :combo => Ext.form.ComboBox
82
+ # :datefield => Ext.form.DateField
83
+ # :numberfield => Ext.form.NumberField
84
+ # :radio => Ext.form.Radio
85
+ # :textarea => Ext.form.TextArea
86
+ # :textfield => Ext.form.TextField
87
+ # :timefield => Ext.form.TimeField
88
+ #
59
89
  def add(name=nil, data=nil, options={})
60
90
  options[:header] = name if name
61
- options[:dataIndex] = data if data
91
+ options[:dataIndex] = data if date
92
+
93
+ if options[:editor]
94
+ xtype = options[:editor].delete(:xtype)
95
+ case xtype
96
+ when :checkbox then options.delete(:editor); options.merge!(:checkbox => true)
97
+ when :combo then options.merge!(:editor => l("new Ext.form.ComboBox(#{Configuration.new(options[:editor]).to_s(3)})"))
98
+ when :datefield then options.merge!(:editor => l("new Ext.form.DateField(#{Configuration.new(options[:editor]).to_s(3)})"))
99
+ when :numberfield then options.merge!(:editor => l("new Ext.form.NumberField(#{Configuration.new(options[:editor]).to_s(3)})"))
100
+ when :radio then options.merge!(:editor => l("new Ext.form.Radio(#{Configuration.new(options[:editor]).to_s(3)})"))
101
+ when :textarea then options.merge!(:editor => l("new Ext.form.TextArea(#{Configuration.new(options[:editor]).to_s(3)})"))
102
+ when :textfield then options.merge!(:editor => l("new Ext.form.TextField(#{Configuration.new(options[:editor]).to_s(3)})"))
103
+ when :timefield then options.merge!(:editor => l("new Ext.form.TimeField(#{Configuration.new(options[:editor]).to_s(3)})"))
104
+ end
105
+ end
106
+
62
107
  case options[:renderer]
63
108
  when :date then options.merge!(:renderer => l("Ext.util.Format.dateRenderer()"))
64
109
  when :datetime then options.merge!(:renderer => l("Ext.util.Format.dateTimeRenderer()"))
@@ -66,7 +111,9 @@ module Lipsiadmin
66
111
  when :us_money then options.merge!(:renderer => l("Ext.util.Format.usMoney"))
67
112
  when :boolean then options.merge!(:renderer => l("Ext.util.Format.boolRenderer"))
68
113
  end
69
- raise ComponentError, "You must provide header and dataIndex for generate a column model" if options[:header].blank? || options[:dataIndex].blank?
114
+
115
+ raise ComponentError, "You must provide header and dataIndex for generate a column model" if options[:header].blank? ||
116
+ options[:dataIndex].blank?
70
117
  config[:columns] << Configuration.new(options)
71
118
  end
72
119
  end
@@ -38,10 +38,22 @@ module Lipsiadmin
38
38
  # grid.bbar :store => grid.get_store, :pageSize => params[:limit]
39
39
  # end
40
40
  #
41
+ # # Returns:
42
+ # # var grid = new Ext.grid.EditorGridPanel({
43
+ # # clicksToEdit: 1,
44
+ # # ...
45
+ #
46
+ # page.grid :editable => true do |grid|
47
+ # grid.id "grid-posts"
48
+ # ...
49
+ #
41
50
  class Grid < Component
51
+
42
52
  def initialize(options={}, &block)#:nodoc:
43
53
  # Call Super Class for initialize configuration
44
- super("Ext.grid.GridPanel", options)
54
+ @editable = options.delete(:editable)
55
+
56
+ super("Ext.grid.#{@editable ? 'EditorGridPanel' : 'GridPanel' }", options)
45
57
 
46
58
  # Write default configuration if not specified
47
59
  config[:plugins] ||= []
@@ -255,7 +267,7 @@ module Lipsiadmin
255
267
  end
256
268
 
257
269
  if @default_tbar
258
- after << render_javascript(:grid_functions, :var => get_var, :store => config[:store], :sm => config[:sm], :tbar => config[:tbar])
270
+ after << render_javascript(:grid_functions, :var => get_var, :store => config[:store], :sm => config[:sm], :tbar => config[:tbar], :editable => @editable)
259
271
  end
260
272
 
261
273
  if config[:store]
@@ -13,6 +13,56 @@
13
13
  }
14
14
  });
15
15
 
16
+ <% if @editable %>
17
+ <%= @var %>.on('cellmousedown', function(grid, rowIndex, colIndex, e){
18
+ var columnId = grid.getColumnModel().getColumnId(colIndex);
19
+ var column = grid.getColumnModel().getColumnById(columnId);
20
+ var t = e.getTarget();
21
+
22
+ if(column.checkbox && t.className && t.className.indexOf('x-grid3-cc-'+t.id) != -1){
23
+ e.stopEvent();
24
+ var record = grid.store.getAt(rowIndex);
25
+ var editEvent = {
26
+ grid: grid,
27
+ record: grid.store.getAt(rowIndex),
28
+ field: column.dataIndex,
29
+ value: !record.data[column.dataIndex],
30
+ originalValue: record.data[column.dataIndex],
31
+ row: rowIndex,
32
+ column: grid.getColumnModel().findColumnIndex(column.dataIndex)
33
+ };
34
+ record.set(column.dataIndex, editEvent.value);
35
+ grid.getSelectionModel().selectRow(rowIndex);
36
+ grid.fireEvent('afteredit', editEvent);
37
+ }
38
+ });
39
+
40
+
41
+ <%= @var %>.on('afteredit', function(e){
42
+ var columnId = <%= @var %>.getColumnModel().getColumnId(e.column);
43
+ var column = <%= @var %>.getColumnModel().getColumnById(columnId);
44
+
45
+ Ext.Ajax.request({
46
+ url: '<%= @base_path %>/'+e.record.id,
47
+ method: 'PUT',
48
+ params: column.name+'='+e.value,
49
+ success: function(result, request){
50
+ var resultValue = Ext.decode(result.responseText);
51
+ if (resultValue.success == true){
52
+ e.record.commit();
53
+ } else {
54
+ Ext.MessageBox.alert(Lipsiadmin.locale.alert.title, resultValue.msg);
55
+ e.record.reject();
56
+ }
57
+ },
58
+ failure: function(result, request) {
59
+ Ext.Msg.alert(Lipsiadmin.locale.alert.title, Lipsiadmin.locale.alert.msg);
60
+ e.record.reject();
61
+ }
62
+ });
63
+ });
64
+ <% end %>
65
+
16
66
  function add(){
17
67
  Backend.app.load('<%= @new_path.blank? ? "#{@base_path}/new" : @new_path %>');
18
68
  }
@@ -141,8 +141,8 @@ module Lipsiadmin
141
141
  # grid.bbar :store => grid.get_store, :pageSize => params[:limit]
142
142
  # end
143
143
  #
144
- def grid(&block)
145
- self << Lipsiadmin::Ext::Grid.new(&block)
144
+ def grid(options={}, &block)
145
+ self << Lipsiadmin::Ext::Grid.new(options, &block)
146
146
  end
147
147
  end
148
148
  end
@@ -30,6 +30,7 @@ Backend.app = function(){
30
30
  contentEl:'header',
31
31
  region:'north',
32
32
  border: false,
33
+ height: 65,
33
34
  bbar: new Ext.Toolbar({ cls:'x-toolbar-menu', items: [<%= backend_menu %>] })
34
35
  });
35
36
  }
@@ -61,12 +62,16 @@ Backend.app = function(){
61
62
  return window.location.search ? Ext.urlDecode(window.location.search.substring(1)).small : false;
62
63
  }, // small
63
64
 
65
+ toolbar: function(){
66
+ return window.location.search ? Ext.urlDecode(window.location.search.substring(1)).toolbar : false;
67
+ }, // hideToolbar
68
+
64
69
  load : function(url, cache){
65
70
  var ext = (/[.]/.exec(url)) ? /[^.]+$/.exec(url) : 'html';
66
71
  var cache = (cache && cache == true) || false;
67
72
 
68
73
  if (!cache){ Backend.cache.clear(); }
69
-
74
+
70
75
  if (ext.length == 1 && ext[0].toLowerCase() == 'js') {
71
76
  // Clean the cache
72
77
  this.clean();
@@ -81,10 +86,11 @@ Backend.app = function(){
81
86
  }
82
87
  });
83
88
  } else if (ext == 'html'){
84
- this.contentDynamic.getUpdater().update({ url: url, headers: { 'Accept': 'text/html, text/javascript, application/xml, text/xml, */*' } });
89
+ this.contentDynamic.getUpdater().update({ url: url, scripts: false, headers: { 'Accept': 'text/html, text/javascript, application/xml, text/xml, */*' } });
85
90
  } else {
86
91
  Ext.Msg.alert(Backend.locale.messages.alert.title, Backend.locale.messages.alert.message);
87
92
  }
93
+ this.contentDynamic.addEvents('inspection');
88
94
  }, // load
89
95
 
90
96
  back: function(){
@@ -106,6 +112,7 @@ Backend.app = function(){
106
112
  clean : function(){
107
113
  this.mask();
108
114
  this.contentDynamic.body.update('');
115
+ this.contentDynamic.items.each(function(i){ i.destroy(); });
109
116
  this.contentDynamic.removeAll(true);
110
117
  this.contentDynamic.doLayout();
111
118
  }, // clean
@@ -113,9 +120,6 @@ Backend.app = function(){
113
120
  addItem : function(item){
114
121
  this.contentDynamic.add(item);
115
122
  this.contentDynamic.doLayout();
116
- if (this.smallView()){
117
- window.parent.Backend.window.item = item;
118
- }
119
123
  }, // addItem
120
124
 
121
125
  submitForm : function(){
@@ -148,7 +152,12 @@ Backend.app = function(){
148
152
  if (tabs.elements.length > 0){
149
153
  // Build Tabs
150
154
  var items = tabs.elements.collect(function(tab){
151
- return { id: tab.id, contentEl: tab.id, title: tab.title };
155
+ var editable = tab.getAttribute('htmleditor');
156
+ if (editable) {
157
+ return { id: tab.id, autoScroll:false, title: tab.title, items: { xtype: 'htmleditor', id: editable, enableFont: false, value: tab.getAttribute('value') } };
158
+ } else {
159
+ return { id: tab.id, contentEl: tab.id, title: tab.title };
160
+ }
152
161
  });
153
162
 
154
163
  // Get ActiveTab
@@ -156,29 +165,69 @@ Backend.app = function(){
156
165
 
157
166
  // Get The container, this code is redundant, but is a trick for ie.
158
167
  var container = Ext.get(tabs.elements[0].id).parent().id;
159
-
160
- // Build TabPanel
161
- var tabPanel = new Ext.TabPanel({
168
+
169
+ var tabConfig = {
162
170
  applyTo: container,
163
171
  layoutOnTabChange:true,
164
172
  activeTab: activeTab,
165
173
  border:false,
166
174
  region:'center',
167
175
  items: items,
168
- bbar: [{
169
- text: Backend.locale.buttons.back,
170
- cls: 'x-btn-text-icon back',
171
- handler: Backend.app.back
172
- }, '->',{
173
- text: Backend.locale.buttons.save,
174
- cls: 'x-btn-text-icon save',
175
- handler: Backend.app.submitForm
176
- }],
177
176
  defaults: { autoScroll:true, layout:'fit' }
178
- });
177
+ }
179
178
 
179
+ if (this.toolbar()!="1"){
180
+ Ext.apply(tabConfig, {
181
+ bbar: [{
182
+ text: Backend.locale.buttons.back,
183
+ cls: 'x-btn-text-icon back',
184
+ handler: Backend.app.back
185
+ }, '->',{
186
+ text: Backend.locale.buttons.save,
187
+ cls: 'x-btn-text-icon save',
188
+ handler: Backend.app.submitForm
189
+ }]
190
+ });
191
+ }
192
+
193
+ // Build TabPanel
194
+ var tabPanel = new Ext.TabPanel(tabConfig);
180
195
  this.addItem(tabPanel);
196
+ // Need to use this because some times we add tabs from inline scripts
197
+ tabPanel.on('add', function(){ tabPanel.setActiveTab(activeTab) });
198
+ }
199
+
200
+ // Now we can load scripts
201
+ var html = el.dom.innerHTML;
202
+ var id = Ext.id();
203
+ var dom = this.contentDynamic.body.dom;
204
+
205
+ var hd = document.getElementsByTagName("head")[0];
206
+ var re = /(?:<script([^>]*)?>)((\n|\r|.)*?)(?:<\/script>)/ig;
207
+ var srcRe = /\ssrc=([\'\"])(.*?)\1/i;
208
+ var typeRe = /\stype=([\'\"])(.*?)\1/i;
209
+
210
+ var match;
211
+ while(match = re.exec(html)){
212
+ var attrs = match[1];
213
+ var srcMatch = attrs ? attrs.match(srcRe) : false;
214
+ if(srcMatch && srcMatch[2]){
215
+ var s = document.createElement("script");
216
+ s.src = srcMatch[2];
217
+ var typeMatch = attrs.match(typeRe);
218
+ if(typeMatch && typeMatch[2]){
219
+ s.type = typeMatch[2];
220
+ }
221
+ hd.appendChild(s);
222
+ }else if(match[2] && match[2].length > 0){
223
+ if(window.execScript) {
224
+ window.execScript(match[2]);
225
+ } else {
226
+ window.eval(match[2]);
227
+ }
228
+ }
181
229
  }
230
+
182
231
  this.unmask();
183
232
  },//inspectContent
184
233
 
@@ -267,63 +316,64 @@ Backend.app = function(){
267
316
  } // return
268
317
  }();
269
318
 
270
- Backend.window = function(){
271
- return {
272
- current: undefined, // currentWindow
273
- item: undefined, // item
274
- config: undefined, // config
275
- open: function(config){
276
- if (this.current) { this.current.close(); }
277
- this.config = config;
278
- this.current = new Ext.Window({
279
- width: 700,
280
- height: 300,
281
- layout: 'fit',
282
- autoScroll: true,
283
- modal: true,
284
- resizable: true,
285
- maximizable: true,
286
- bodyStyle: 'background-color:#FFF',
287
- buttons:[{
288
- text: Backend.locale.buttons.close,
289
- handler: this.close
290
- },{
291
- text: Backend.locale.buttons.select,
292
- handler: this.select
293
- }],
294
- html: '<iframe id="'+Ext.id('','iframe-')+'" src="/backend/base/?small=1&load='+config.url+'" frameBorder="0" width="100%" height="100%" />'
295
- });
296
- this.current.show();
297
- return this.current
298
- }, // open
299
-
300
- close: function(){
301
- if (Backend.window.current){
302
- Backend.window.current.close();
303
- Backend.window.item = undefined;
304
- Backend.window.config = undefined;
305
- }
306
- }, // close
307
-
308
- select: function(){
309
- try {
310
- var selected = Backend.window.item.getSelectionModel().getSelected();
311
- var config = Backend.window.config;
312
- var name = selected.data[config.display];
313
- if (config.value=='id'){
314
- var id = selected.id;
315
- } else {
316
- var id = selected.data[config.value];
317
- }
318
- $(config.displayField).update(name);
319
- $(config.valueField).value = id;
320
- Backend.window.close();
321
- } catch(e) {
322
- Ext.Msg.alert(Backend.locale.messages.alert.title, Backend.locale.messages.alert.notSelected);
323
- }
324
- } // select
325
- } // return
326
- }();
319
+ Backend.window = Ext.extend(Ext.Window, {
320
+ width: 700,
321
+ height: 300,
322
+ layout: 'fit',
323
+ autoScroll: true,
324
+ modal: true,
325
+ maximizable: true,
326
+ bodyStyle: 'background-color:#FFF',
327
+ grid: undefined,
328
+ form: false,
329
+ url: '',
330
+ iframeId: Ext.id('','iframe-'),
331
+ initComponent : function(){
332
+ Backend.window.superclass.initComponent.call(this);
333
+ this.addEvents('selected');
334
+ this.addEvents('saved');
335
+ this.addButton({
336
+ text: Backend.locale.buttons.close,
337
+ handler: this[this.closeAction].createDelegate(this, [])
338
+ });
339
+ if (this.grid){
340
+ this.addButton({
341
+ text: Backend.locale.buttons.select,
342
+ handler: this.closeWithSelections.createDelegate(this, [])}
343
+ );
344
+ }
345
+ if (this.form){
346
+ this.addButton({
347
+ text: Backend.locale.buttons.save,
348
+ handler: this.saveForm.createDelegate(this, [])}
349
+ );
350
+ }
351
+ this.html = '<iframe id="'+this.iframeId+'" src="/backend/base/?small=1&toolbar='+(this.form?1:0)+'&load='+this.url+'" frameBorder="0" width="100%" height="100%" />';
352
+ }, // initComponent
353
+
354
+ afterShow : function(afterShow){
355
+ Backend.window.superclass.afterShow.call(this);
356
+ this.contentWindow = Ext.fly(this.iframeId).dom.contentWindow;
357
+ }, // onRender
358
+
359
+ getSelections: function(){
360
+ return this.contentWindow[this.grid].getSelectionModel().getSelections();
361
+ }, // getSelections
362
+
363
+ closeWithSelections: function(){
364
+ if (this.getSelections().length > 0){
365
+ this.fireEvent('selected', this, this.getSelections());
366
+ this[this.closeAction]();
367
+ } else {
368
+ Ext.Msg.alert(Backend.locale.messages.alert.title, Backend.locale.messages.alert.notSelected);
369
+ }
370
+ }, // closeWithSelections
371
+
372
+ saveForm: function(){
373
+ this.contentWindow.Backend.app.submitForm();
374
+ this.fireEvent('saved', this);
375
+ } // saveForm
376
+ });
327
377
 
328
378
  Backend.cache = function(){
329
379
  return {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lipsiadmin
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.2
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Davide D'Agostino
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-07 00:00:00 +02:00
12
+ date: 2009-05-11 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency