padrino-admin 0.6.3 → 0.6.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.
Files changed (91) hide show
  1. data/README.rdoc +16 -0
  2. data/VERSION +1 -1
  3. data/lib/padrino-admin.rb +24 -5
  4. data/lib/padrino-admin/access_control.rb +75 -29
  5. data/lib/padrino-admin/{ext_js/column_store.rb → column_store.rb} +31 -15
  6. data/lib/padrino-admin/config.rb +36 -0
  7. data/lib/padrino-admin/generators/actions.rb +62 -7
  8. data/lib/padrino-admin/generators/admin_app.rb +27 -26
  9. data/lib/padrino-admin/generators/admin_page.rb +20 -18
  10. data/lib/padrino-admin/generators/admin_uploader.rb +83 -0
  11. data/lib/padrino-admin/generators/app/app.rb.tt +1 -3
  12. data/lib/padrino-admin/generators/app/controllers/accounts.rb +1 -1
  13. data/lib/padrino-admin/generators/app/public/flash/swfupload.swf +0 -0
  14. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/back.gif +0 -0
  15. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/background.png +0 -0
  16. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg-content.png +0 -0
  17. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg-hd-slate.png +0 -0
  18. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg-hd.png +0 -0
  19. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg-intro.png +0 -0
  20. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg-login.png +0 -0
  21. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg-menu-slate.png +0 -0
  22. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg-menu.png +0 -0
  23. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/bg.png +0 -0
  24. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/btn-login.png +0 -0
  25. data/lib/padrino-admin/generators/app/public/images/admin/cancel.gif +0 -0
  26. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/categories.gif +0 -0
  27. data/lib/padrino-admin/generators/app/public/images/admin/close.gif +0 -0
  28. data/lib/padrino-admin/generators/app/public/images/admin/close.png +0 -0
  29. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/delete.gif +0 -0
  30. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/download.gif +0 -0
  31. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/duplicate.gif +0 -0
  32. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/edit.gif +0 -0
  33. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/export.gif +0 -0
  34. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/hd-bg.gif +0 -0
  35. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/image.gif +0 -0
  36. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/loader.gif +0 -0
  37. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/logo-loader.png +0 -0
  38. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/logo-small.png +0 -0
  39. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/new.gif +0 -0
  40. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/no-image.png +0 -0
  41. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/preview.gif +0 -0
  42. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/print.gif +0 -0
  43. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/save.gif +0 -0
  44. data/lib/padrino-admin/generators/app/public/images/{backend → admin}/support.gif +0 -0
  45. data/lib/padrino-admin/generators/app/public/images/admin/up.gif +0 -0
  46. data/lib/padrino-admin/generators/app/public/javascripts/ext.js +4 -1
  47. data/lib/padrino-admin/generators/app/public/javascripts/swfupload.js +4 -0
  48. data/lib/padrino-admin/generators/app/public/stylesheets/admin.css +25 -43
  49. data/lib/padrino-admin/generators/app/public/stylesheets/login.css +3 -3
  50. data/lib/padrino-admin/generators/app/public/stylesheets/standard.css +53 -52
  51. data/lib/padrino-admin/generators/app/views/accounts/_form.haml +1 -0
  52. data/lib/padrino-admin/generators/app/views/base/index.haml +5 -7
  53. data/lib/padrino-admin/generators/app/views/javascripts/admin.js.erb +217 -297
  54. data/lib/padrino-admin/generators/app/views/sessions/new.haml +1 -1
  55. data/lib/padrino-admin/generators/templates/{controller.rb.tt → page/controller.rb.tt} +1 -1
  56. data/lib/padrino-admin/generators/templates/{db → page/db}/seeds.rb.tt +0 -0
  57. data/lib/padrino-admin/generators/templates/{views → page/views}/_form.haml.tt +0 -0
  58. data/lib/padrino-admin/generators/templates/{views → page/views}/edit.haml.tt +0 -0
  59. data/lib/padrino-admin/generators/templates/{views → page/views}/grid.js.erb.tt +1 -1
  60. data/lib/padrino-admin/generators/templates/{views → page/views}/new.haml.tt +0 -0
  61. data/lib/padrino-admin/generators/templates/{views → page/views}/store.jml.tt +0 -0
  62. data/lib/padrino-admin/generators/templates/uploader/controller.rb +24 -0
  63. data/lib/padrino-admin/generators/templates/uploader/lib/uploader.rb +54 -0
  64. data/lib/padrino-admin/generators/templates/uploader/views/grid.js.erb +56 -0
  65. data/lib/padrino-admin/generators/templates/uploader/views/store.jml +10 -0
  66. data/lib/padrino-admin/helpers/authentication.rb +30 -19
  67. data/lib/padrino-admin/helpers/view.rb +172 -35
  68. data/lib/padrino-admin/locale/admin/en.yml +1 -0
  69. data/lib/padrino-admin/middleware/flash_middleware.rb +36 -0
  70. data/lib/padrino-admin/orm.rb +33 -0
  71. data/lib/padrino-admin/orm/abstract.rb +94 -0
  72. data/lib/padrino-admin/{adapters/ar.rb → orm/activerecord.rb} +69 -36
  73. data/lib/padrino-admin/orm/datamapper.rb +214 -0
  74. data/lib/padrino-admin/{adapters/mm.rb → orm/mongomapper.rb} +36 -20
  75. data/lib/padrino-admin/utils/literal.rb +1 -1
  76. data/padrino-admin.gemspec +62 -51
  77. data/test/fixtures/active_record.rb +14 -2
  78. data/test/fixtures/data_mapper.rb +2 -1
  79. data/test/fixtures/mongo_mapper.rb +1 -1
  80. data/test/fixtures/test_column_store.jml +1 -0
  81. data/test/helper.rb +3 -2
  82. data/test/test_access_control.rb +1 -1
  83. data/test/test_active_record.rb +56 -1
  84. data/test/test_column_store.rb +56 -10
  85. data/test/test_data_mapper.rb +67 -1
  86. metadata +58 -47
  87. data/lib/padrino-admin/adapters.rb +0 -108
  88. data/lib/padrino-admin/adapters/dm.rb +0 -147
  89. data/lib/padrino-admin/ext_js/config.rb +0 -186
  90. data/test/fixtures/test_generic.jml +0 -7
  91. data/test/fixtures/test_javascript.jml +0 -81
data/README.rdoc CHANGED
@@ -75,6 +75,22 @@ Account with role <tt>editor</tt> can manage <tt>only</tt> post/comments because
75
75
  Another good fature of Padrino admin is that when you define a <tt>Project Module</tt> role you also build the Menu Tree of the Admin.
76
76
  Trust us that in future you appreciate so much this feature.
77
77
 
78
+ === Admin Uploads
79
+
80
+ Padrino admin has a builtin upload managment that leave you to be free as possible.
81
+
82
+ fun-test$ padrino-gen admin_uploader
83
+ fun-test$ rake dm:auto:upgrade # or ar:migrate
84
+
85
+ Finish! Now you can browse into your admin and you can see a new menu called +upload+ where you can see all your uploads,
86
+ upload other file, delete ...
87
+
88
+ All upload definitions are defined in lib/uploader.rb, here you can preproces your attachments (like resize) or manage versions.
89
+
90
+ See http://github.com/jnicklas/carrierwave
91
+
92
+ ... here some example howto attach uploads to any model ...
93
+
78
94
  == Copyright
79
95
 
80
96
  Copyright (c) 2010 Padrino. See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.3
1
+ 0.6.7
data/lib/padrino-admin.rb CHANGED
@@ -4,12 +4,31 @@ require 'padrino-core'
4
4
  require 'padrino-gen'
5
5
 
6
6
  Dir[File.dirname(__FILE__) + '/padrino-admin/*.rb'].each {|file| require file }
7
- Dir[File.dirname(__FILE__) + '/padrino-admin/{helpers,adapters,ext_js,generators,utils}/*.rb'].each {|file| require file }
7
+ Dir[File.dirname(__FILE__) + '/padrino-admin/{helpers,orm,generators,middleware,utils}/*.rb'].each {|file| require file }
8
8
 
9
- Padrino::Application.send(:cattr_accessor, :access_control)
10
- Padrino::Application.send(:access_control=, Class.new(Padrino::AccessControl::Base))
9
+ ##
10
+ # We need to apply Padrino::Admin::Utils::Extensions
11
+ #
11
12
  String.send(:include, Padrino::Admin::Utils::Crypt)
12
13
  String.send(:include, Padrino::Admin::Utils::Literal)
13
14
 
14
- # Load our locales
15
- I18n.load_path += Dir["#{File.dirname(__FILE__)}/padrino-admin/locale/**/*.yml"]
15
+ ##
16
+ # We need to add to Padrino::Application a +access_control+ class
17
+ #
18
+ Padrino::Application.send(:cattr_accessor, :access_control)
19
+ Padrino::Application.send(:access_control=, Class.new(Padrino::AccessControl::Base))
20
+
21
+ ##
22
+ # If CarrierWave is defined we set the root directory
23
+ #
24
+ CarrierWave.root = Padrino.root if defined?(CarrierWave)
25
+
26
+ ##
27
+ # Load our Padrino::Admin locales
28
+ #
29
+ I18n.load_path += Dir["#{File.dirname(__FILE__)}/padrino-admin/locale/**/*.yml"]
30
+
31
+ ##
32
+ # Load our databases extensions
33
+ #
34
+ Padrino::Admin::Orm.register!
@@ -1,14 +1,14 @@
1
1
  module Padrino
2
-
2
+
3
3
  class AccessControlError < StandardError; end
4
-
4
+
5
+ ##
5
6
  # This module give to a padrino application an access control functionality like:
6
7
  #
7
8
  # class EcommerceDemo < Padrino::Application
8
9
  # enable :authentication
9
10
  # set :login_page, "/login" # or your login page
10
11
  # enable :store_location # if you want know what is the page that need authentication
11
- # set :use_orm, :active_record # or :data_mapper, :mongo_mapper
12
12
  #
13
13
  # access_control.roles_for :any do
14
14
  # role.require_login "/cart"
@@ -17,7 +17,7 @@ module Padrino
17
17
  # end
18
18
  # end
19
19
  #
20
- # In the EcommerceDemo, we <tt>only</tt> require logins for all paths that start with "/cart" like:
20
+ # In the EcommerceDemo, we +only+ require logins for all paths that start with "/cart" like:
21
21
  #
22
22
  # - "/cart/add"
23
23
  # - "/cart/empty"
@@ -30,7 +30,7 @@ module Padrino
30
30
  # - "/account/update"
31
31
  #
32
32
  # but if we call "/account/create" we don't need to be logged in our site for do that.
33
- # In EcommerceDemo example we set <tt>redirect_back_or_default</tt> so if a <tt>unlogged</tt>
33
+ # In EcommerceDemo example we set +redirect_back_or_default+ so if a +unlogged+
34
34
  # user try to access "/account/edit" will be redirected to "/login" when login is done will be
35
35
  # redirected to "/account/edit".
36
36
  #
@@ -62,9 +62,9 @@ module Padrino
62
62
  # If a user logged with role editor can:
63
63
  #
64
64
  # - Access to all paths that start with "/session" like "/sessions/{new,create}"
65
- # - Access <tt>only</tt> to paths that start with "/posts" like "/post/{new,edit,destroy}"
65
+ # - Access +only+ to paths that start with "/posts" like "/post/{new,edit,destroy}"
66
66
  #
67
- # Finally we have another good fatures, the possibility in the same time we build role build also <tt>tree</tt>.
67
+ # Finally we have another good fatures, the possibility in the same time we build role build also +tree+.
68
68
  # Figure this scenario: in my admin every account need their own menu, so an Account with role editor have
69
69
  # a menu different than an Account with role admin.
70
70
  #
@@ -123,14 +123,15 @@ module Padrino
123
123
  #
124
124
  module AccessControl
125
125
 
126
+ ##
127
+ # Method used by Padrino::Application when we register the extension
128
+ #
126
129
  def self.registered(app)
130
+ app.set :session_id, "_padrino_#{File.basename(Padrino.root)}_#{app.app_name}".to_sym
127
131
  app.helpers Padrino::Admin::Helpers
128
132
  app.before { login_required }
129
- if app.respond_to?(:use_orm)
130
- Padrino::Admin::Adapters.register(app.use_orm)
131
- else
132
- raise Padrino::ApplicationSetupError, "You must define in your app the setting :use_orm!"
133
- end
133
+ app.use Padrino::Admin::Middleware::FlashMiddleware, app.session_id # make sure that is the same of session_name in helpers
134
+ Padrino::Admin::Orm.extend_account!
134
135
  end
135
136
 
136
137
  class Base
@@ -142,8 +143,10 @@ module Padrino
142
143
  base.send(:cattr_reader, :cache)
143
144
  super
144
145
  end
145
-
146
+
147
+ ##
146
148
  # We map project modules for a given role or roles
149
+ #
147
150
  def roles_for(*roles, &block)
148
151
  raise Padrino::AccessControlError, "Role #{role} must be present and must be a symbol!" if roles.any? { |r| !r.kind_of?(Symbol) } || roles.empty?
149
152
  raise Padrino::AccessControlError, "You can't merge :any with other roles" if roles.size > 1 && roles.any? { |r| r == :any }
@@ -157,8 +160,10 @@ module Padrino
157
160
  end
158
161
  end
159
162
 
163
+ ##
160
164
  # Returns (allowed && denied paths).
161
165
  # If an account given we also give allowed & denied paths for their role.
166
+ #
162
167
  def auths(account=nil)
163
168
  if account
164
169
  cache[account.id] ||= Auths.new(@authorizations, @mappers, account)
@@ -167,12 +172,12 @@ module Padrino
167
172
  end
168
173
  end
169
174
  end
170
- end
175
+ end # Base
171
176
 
172
- class Auths
177
+ class Auths #:nodoc:
173
178
  attr_reader :allowed, :denied, :project_modules
174
179
 
175
- def initialize(authorizations, mappers=nil, account=nil)
180
+ def initialize(authorizations, mappers=nil, account=nil) #:nodoc:
176
181
  @allowed, @denied = [], []
177
182
  unless authorizations.empty?
178
183
  @allowed = authorizations.collect(&:allowed).flatten
@@ -190,38 +195,49 @@ module Padrino
190
195
  @denied.uniq!
191
196
  end
192
197
 
198
+ ##
199
+ # Return true if the requested path (like request.path_info) is allowed.
200
+ #
193
201
  def can?(request_path)
194
202
  return true if @allowed.empty?
195
203
  request_path = "/" if request_path.blank?
196
204
  @allowed.any? { |path| request_path =~ /^#{path}/ } && !cannot?(request_path)
197
205
  end
198
206
 
207
+ ##
208
+ # Return true if the requested path (like request.path_info) is +not+ allowed.
209
+ #
199
210
  def cannot?(request_path)
200
211
  return false if @denied.empty?
201
212
  request_path = "/" if request_path.blank?
202
213
  @denied.any? { |path| request_path =~ /^#{path}/ }
203
214
  end
204
-
205
- end
215
+ end # Auths
206
216
 
207
217
  class Authorization
208
218
  attr_reader :allowed, :denied
209
219
 
210
- def initialize(&block)
220
+ def initialize(&block) #:nodoc:
211
221
  @allowed = []
212
222
  @denied = []
213
223
  yield self
214
224
  end
215
225
 
226
+ ##
227
+ # Allow a specified path
228
+ #
216
229
  def allow(path)
217
230
  @allowed << path unless @allowed.include?(path)
218
231
  end
219
232
 
233
+ ##
234
+ # Deny a specified path
235
+ #
220
236
  def require_login(path)
221
237
  @denied << path unless @denied.include?(path)
222
238
  end
223
239
  alias :deny :require_login
224
- end
240
+ end # Authorization
225
241
 
226
242
  class Mapper
227
243
  attr_reader :project_modules, :roles, :denied
@@ -235,75 +251,95 @@ module Padrino
235
251
  yield(self, @account)
236
252
  end
237
253
 
254
+ ##
238
255
  # Create a new project module
256
+ #
239
257
  def project_module(name, path=nil, &block)
240
258
  @project_modules << ProjectModule.new(name, path, &block)
241
259
  end
242
260
 
261
+ ##
243
262
  # Globally allow an paths for the current role
263
+ #
244
264
  def allow(path)
245
265
  @allowed << path unless @allowed.include?(path)
246
266
  end
247
267
 
268
+ ##
248
269
  # Globally deny an pathsfor the current role
270
+ #
249
271
  def deny(path)
250
272
  @denied << path unless @allowed.include?(path)
251
273
  end
252
274
 
275
+ ##
253
276
  # Return true if role is included in given roles
277
+ #
254
278
  def allowed?
255
279
  @roles.any? { |r| r == @account.role.to_s.downcase.to_sym }
256
280
  end
257
281
 
282
+ ##
258
283
  # Return allowed paths
284
+ #
259
285
  def allowed
260
286
  @project_modules.each { |pm| @allowed.concat(pm.allowed) }
261
287
  @allowed.uniq
262
288
  end
263
- end
289
+ end # Mapper
264
290
 
265
291
  class ProjectModule
266
292
  attr_reader :name, :menus, :path
267
293
 
268
- def initialize(name, path=nil, options={}, &block)#:nodoc:
294
+ def initialize(name, path=nil, options={}, &block) #:nodoc:
269
295
  @name = name
270
296
  @options = options
271
297
  @allowed = []
272
298
  @menus = []
273
299
  @path = path
274
300
  @allowed << path if path
275
- yield self
301
+ yield self if block_given?
276
302
  end
277
303
 
304
+ ##
278
305
  # Build a new menu and automaitcally add the action on the allowed actions.
306
+ #
279
307
  def menu(name, path=nil, options={}, &block)
280
308
  @menus << Menu.new(name, path, options, &block)
281
309
  end
282
310
 
311
+ ##
283
312
  # Return allowed controllers
313
+ #
284
314
  def allowed
285
315
  @menus.each { |m| @allowed.concat(m.allowed) }
286
316
  @allowed.uniq
287
317
  end
288
318
 
319
+ ##
289
320
  # Return the original name or try to translate or humanize the symbol
321
+ #
290
322
  def human_name
291
323
  @name.is_a?(Symbol) ? I18n.t("admin.menus.#{@name}", :default => @name.to_s.humanize) : @name
292
324
  end
293
325
 
326
+ ##
294
327
  # Return symbol for the given project module
328
+ #
295
329
  def uid
296
330
  @name.to_s.downcase.gsub(/[^a-z0-9]+/, '').gsub(/-+$/, '').gsub(/^-+$/, '').to_sym
297
331
  end
298
332
 
333
+ ##
299
334
  # Return ExtJs Config for this project module
335
+ #
300
336
  def config
301
337
  options = @options.merge(:text => human_name)
302
338
  options.merge!(:menu => @menus.collect(&:config)) if @menus.size > 0
303
- options.merge!(:handler => ExtJs::Variable.new("function(){ Admin.app.load('#{path}') }")) if @path
339
+ options.merge!(:handler => Padrino::Admin::Config::Variable.new("function(){ Admin.app.load('#{path}') }")) if @path
304
340
  options
305
341
  end
306
- end
342
+ end # ProjectModule
307
343
 
308
344
  class Menu
309
345
  attr_reader :name, :options, :items, :path
@@ -318,38 +354,48 @@ module Padrino
318
354
  yield self if block_given?
319
355
  end
320
356
 
357
+ ##
321
358
  # Add a new submenu to the menu
359
+ #
322
360
  def add(name, path=nil, options={}, &block)
323
361
  @items << Menu.new(name, path, options, &block)
324
362
  end
325
363
 
364
+ ##
326
365
  # Return allowed controllers
366
+ #
327
367
  def allowed
328
368
  @items.each { |i| @allowed.concat(i.allowed) }
329
369
  @allowed.uniq
330
370
  end
331
371
 
372
+ ##
332
373
  # Return the original name or try to translate or humanize the symbol
374
+ #
333
375
  def human_name
334
376
  @name.is_a?(Symbol) ? I18n.t("admin.menus.#{@name}", :default => @name.to_s.humanize) : @name
335
377
  end
336
378
 
379
+ ##
337
380
  # Return a unique id for the given project module
381
+ #
338
382
  def uid
339
383
  @name.to_s.downcase.gsub(/[^a-z0-9]+/, '').gsub(/-+$/, '').gsub(/^-+$/, '').to_sym
340
384
  end
341
385
 
386
+ ##
342
387
  # Return ExtJs Config for this menu
388
+ #
343
389
  def config
344
390
  if @path.blank? && @items.empty?
345
391
  options = human_name
346
392
  else
347
393
  options = @options.merge(:text => human_name)
348
394
  options.merge!(:menu => @items.collect(&:config)) if @items.size > 0
349
- options.merge!(:handler => ExtJs::Variable.new("function(){ Admin.app.load('#{path}') }")) if @path
395
+ options.merge!(:handler => "function(){ Admin.app.load('#{path}') }".to_l) if @path
350
396
  end
351
397
  options
352
398
  end
353
- end
354
- end
355
- end
399
+ end # Menu
400
+ end # AccessControl
401
+ end # Padrino
@@ -1,6 +1,8 @@
1
1
  module Padrino
2
- module ExtJs
2
+ module Admin
3
+ ##
3
4
  # Return column config, and store config/data for ExtJS ColumnModel and Store
5
+ #
4
6
  class ColumnStore
5
7
  attr_reader :data
6
8
 
@@ -18,7 +20,7 @@ module Padrino
18
20
  # Try to reformat the dataIndex
19
21
  data_indexes = Array(column["dataIndex"]).collect do |data_index|
20
22
  if data_index =~ /\./ # if we have some like categories.names we use this
21
- cols = data_index.split(".")
23
+ cols = data_index.split(".").collect(&:singularize)
22
24
  column["name"] ||= cols[0] + "[" + cols[1..-1].join("][") + "]" # accounts.name will be => accounts[name]
23
25
  else
24
26
  column["name"] ||= "#{table_name.singularize}[#{data_index}]"
@@ -34,6 +36,7 @@ module Padrino
34
36
  column["mapping"] ||= column["name"].sub(/\[/,"_").sub(/\]$/, "").sub(/\]\[/,"_")
35
37
 
36
38
  # Now is necessary for our columns an ID
39
+ #
37
40
  # TODO: check duplicates here
38
41
  column["id"] = column["mapping"]
39
42
 
@@ -42,8 +45,12 @@ module Padrino
42
45
  end
43
46
  end
44
47
 
48
+ ##
45
49
  # Return an array config for build an Ext.grid.ColumnModel() config
46
- def column_fields
50
+ #
51
+ # If +json+ false we return the Hash object, else a JSON pretty printed string
52
+ #
53
+ def column_fields(json=true)
47
54
  data = @data.map do |data|
48
55
  data = data.dup
49
56
  editor = parse_column_editor(data.delete("editor"))
@@ -54,21 +61,27 @@ module Padrino
54
61
  data.delete("mapping")
55
62
  data
56
63
  end
57
- JSON.pretty_generate(data)
64
+ json ? JSON.pretty_generate(data) : data
58
65
  end
59
66
 
67
+ ##
60
68
  # Return an array config for build an Ext.data.GroupingStore()
61
- def store_fields
69
+ #
70
+ # If +json+ false we return the Hash object, else a JSON pretty printed string
71
+ #
72
+ def store_fields(json=true)
62
73
  data = @data.map do |data|
63
74
  type = parse_store_renderer(data["renderer"])
64
75
  hash = { :name => data["dataIndex"] , :mapping => data["mapping"] }
65
76
  hash.merge!(type) if type
66
77
  hash
67
78
  end
68
- JSON.pretty_generate(data)
79
+ json ? JSON.pretty_generate(data) : data
69
80
  end
70
81
 
82
+ ##
71
83
  # Return data for a custom collection for the ExtJS Ext.data.GroupingStore() json
84
+ #
72
85
  def store_data_from(collection)
73
86
  collection.map do |c|
74
87
  @data.dup.inject({ "id" => c.id }) do |options, data|
@@ -78,20 +91,24 @@ module Padrino
78
91
  end
79
92
  end
80
93
 
94
+ ##
81
95
  # Return a searched and paginated data collection for the ExtJS Ext.data.GroupingStore() json
82
96
  # You can pass options like:
83
97
  #
84
- # Examples
98
+ # If options has key +json+ false we return the Hash object, else a JSON string
99
+ #
100
+ # Examples:
85
101
  #
86
- # store_data(params, :conditions => "found = 1")
87
102
  # store_data(params, :include => :posts)
88
103
  #
89
104
  def store_data(params={}, options={})
90
105
  # Some can tell me that this method made two identical queries one for count one for paginate.
91
106
  # We don't use the select count because in some circumstances require much time than select *.
92
- params[:limit] ||= 50
93
- collection = @model.ext_search(params, options)
94
- { :results => store_data_from(collection.records), :count => collection.count }.to_json
107
+ params[:limit] ||= 50
108
+ json = params.has_key?(:json) ? params.delete(:json) : true
109
+ collection = @model.ext_search(params, options)
110
+ result = { :results => store_data_from(collection.records), :count => collection.count }
111
+ json ? result.to_json : result
95
112
  end
96
113
 
97
114
  private
@@ -134,7 +151,6 @@ module Padrino
134
151
  when "upcase" then { :renderer => "Ext.util.Format.uppercase".to_l }
135
152
  end
136
153
  end
137
-
138
- end
139
- end
140
- end
154
+ end # ColumnStore
155
+ end # Admin
156
+ end # Padrino