bootstrap_admin 0.0.15 → 0.0.17

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 (28) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +129 -31
  3. data/app/assets/stylesheets/bootstrap_overrides.css.scss +1 -0
  4. data/app/helpers/bootstrap_admin/menu_helper.rb +1 -1
  5. data/app/helpers/bootstrap_admin_helper.rb +22 -4
  6. data/app/views/defaults/_form.html.haml +1 -1
  7. data/app/views/defaults/_paginator.html.haml +3 -2
  8. data/app/views/defaults/edit.html.haml +1 -1
  9. data/app/views/defaults/new.html.haml +1 -1
  10. data/bootstrap_admin.gemspec +3 -2
  11. data/config/initializers/simple_form.rb +1 -1
  12. data/lib/bootstrap_admin/controller_helpers.rb +5 -2
  13. data/lib/bootstrap_admin/version.rb +1 -1
  14. data/lib/bootstrap_admin.rb +7 -0
  15. data/lib/generators/bootstrap_admin/{USAGE → install/USAGE} +0 -0
  16. data/lib/generators/bootstrap_admin/{install_generator.rb → install/install_generator.rb} +5 -0
  17. data/lib/generators/bootstrap_admin/{templates → install/templates}/bootstrap_admin.rb +0 -0
  18. data/lib/generators/bootstrap_admin/{templates → install/templates}/bootstrap_admin_menu.yml +0 -0
  19. data/lib/generators/bootstrap_admin/{templates → install/templates}/en_bootstrap_admin.yml +0 -0
  20. data/lib/generators/bootstrap_admin/override_views/USAGE +24 -0
  21. data/lib/generators/bootstrap_admin/override_views/override_views_generator.rb +61 -0
  22. data/vendor/assets/javascripts/bootstrap.js +379 -124
  23. data/vendor/assets/javascripts/bootstrap.min.js +2 -2
  24. data/vendor/assets/stylesheets/bootstrap-responsive.css +26 -5
  25. data/vendor/assets/stylesheets/bootstrap-responsive.min.css +4 -4
  26. data/vendor/assets/stylesheets/bootstrap.css +510 -236
  27. data/vendor/assets/stylesheets/bootstrap.min.css +4 -4
  28. metadata +39 -36
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c48b519fd799851de6a334d3ddd7f642546d29a5
4
+ data.tar.gz: cb2011b030732ad0de90b95853a0060dd7bc29ad
5
+ SHA512:
6
+ metadata.gz: c942b58bae975618c33212ed9b77f5df2cfde6c4249276be317159f3af18c5a9147eee4cf964b2c05465a4273cf5bb6de735276506d2ef319f06fe3e1e4e1874
7
+ data.tar.gz: fe1f3cad48919d74f0d865dc2262a457a1869a4632c3304d1920f4e252c31a17bc4e8a4222c9e53b2d11fd06ed13622b46bfe384c3fa4c1aaa1fdfbac329017b
data/README.md CHANGED
@@ -94,7 +94,45 @@ And BAM, ready to roll!!
94
94
 
95
95
  ## Configuring Bootstrap Admin - Initializer
96
96
 
97
- TODO
97
+ This is were you can configure the global options for bootstrap admin.
98
+
99
+ For now there are only a few options:
100
+
101
+ * `admin_namespace` - a String defining the name of the namespace to be used
102
+ * `paginator_page_size`- an Integer defining the page size for all bootstrap_admin index actions
103
+ * `ui_styles` - an Hash that defines CSS classes to be used on certain elements
104
+
105
+ For now `ui_styles` should contain an hash with more or less the following structure:
106
+ ```ruby
107
+ config.ui_styles = {
108
+ index: %w(table-bordered table-striped)
109
+ }
110
+ ```
111
+ The index ui_styles will be used on the index table.
112
+ On future releases, this hash will be extended and taken into account for other situations.
113
+
114
+ ### Example of a Bootstrap Admin Initializer
115
+
116
+ ```ruby
117
+ BootstrapAdmin.setup do |config|
118
+
119
+ # ==> Admin namespace configuration
120
+ # Configure namespace used for the scope of this admin
121
+ # Default value: :admin
122
+ config.admin_namespace = "backoffice"
123
+
124
+ # ==> Paginator configuration
125
+ # Configure the number of results shown per page by the paginator.
126
+ # Default value: 10
127
+ config.paginator_page_size = 6
128
+
129
+ # ==> UI Styles
130
+ # Configure the css class names that each action wrapper will have
131
+ # Default value: {index: %w(table-bordered table-striped)}
132
+ config.ui_styles[:index] << "my_awesome_style_class"
133
+
134
+ end
135
+ ```
98
136
 
99
137
  ## Admin Menu
100
138
 
@@ -103,51 +141,65 @@ If you want to customize the bootstrap_admin menu, you can edit the `config/boot
103
141
  So, to customize the menu, you must supply a list of menu entries.<br/>
104
142
  On each entry you can use this set of options:
105
143
 
106
- * `:label` - the label that will be presented in the menu. This can be either:
107
- * **Symbol** - Will be passed to I18n for translation
108
- * **String** - Will be used directly
109
- * `:class` - the css class to apply to the item
110
- * `:url` - the url to be used on the item link.
111
144
  * `:item` - one of 3 things:
112
145
  * **String**: must be a name of a model (it will be used to build the link url and the label if not supplied)
113
146
  * **List**: This will tell bootstrap_admin that the item is in fact a dropdown menu. **In this case `:label` must be supplied.**
114
147
  * **Symbol**: currently only `:divider` is supported and produces a division between dropdown elements.
148
+ * `:label` - the label that will be presented in the menu. This can be either:
149
+ * **Symbol** - Will be passed to I18n for translation
150
+ * **String** - Will be used directly
151
+ * By default (when not supplied), the label will be the `:item` human name.
152
+ * `:namespace` - if your model (`:item`) is under a namespace, then you should declare it on this option
153
+ * `:class` - the css class to apply to the item
154
+ * `:url` - the url to be used on the item link.
155
+ * `:controller` - the controller to be used on the item link.
115
156
 
116
157
  ### Example
117
158
 
118
- # Item based on a model
119
- - :item: Document
120
-
121
- # Item based on a model with a custom label and css class
122
- - :item: Author
123
- :label: The guys who write things
124
- :class: really_bold
125
-
126
- # Item based on a model with a custom url
127
- - :item: Search
128
- :url: "https://google.com"
129
-
130
- # Dropdown menu item with several options and a divider
131
- - :label: :user_admin # this will be called as I18n.t(:user_admin)
132
- :url: "#"
133
- :item:
134
- - :item: Role
135
- - :item: :divider
136
- - :item: User
137
- :label: Dudes
159
+ ```yaml
160
+ # Item based on a model
161
+ - :item: Document
162
+
163
+ # Item based on a model, with non-default controller
164
+ - :item: NewsArticle
165
+ :controller: admin/news
166
+
167
+ # Item based on a namespaced model (Blog::Entry)
168
+ - :item: Entry
169
+ :namespace: Blog
170
+
171
+ # Item based on a model with a custom label and css class
172
+ - :item: Author
173
+ :label: The guys who write things
174
+ :class: really_bold
175
+
176
+ # Item based on a model with a custom url
177
+ - :item: Search
178
+ :url: "https://google.com"
179
+
180
+ # Dropdown menu item with several options and a divider
181
+ - :label: :user_admin # this will be called as I18n.t(:user_admin)
182
+ :url: "#"
183
+ :item:
184
+ - :item: Role
185
+ - :item: :divider
186
+ - :item: User
187
+ :label: Dudes
188
+ ```
138
189
 
139
190
  ## Configuring the Controller
140
191
 
141
192
  By default, bootstrap\_admin will use the fields defined as accessible on the model matching the name of the controller it is working on to build all markup. Also, by default, bootstrap\_admin will respond to `html` and `json` formats.
142
- If you want to override this behaviour, the controller macro allows you to pass a block that will be used to configure how bootstrap\_admin will behave.
193
+ If you want to override this behavior, the controller macro allows you to pass a block that will be used to configure how bootstrap\_admin will behave.
143
194
 
144
195
  ### Configuring which fields to use
145
196
 
146
- To override the default behaviour, you can use the following configurators:
197
+ To override the default behavior, you can use the following configurators:
147
198
 
148
199
  * `index_fields` - the fields to be used on the index action
149
200
  * `show_fields` - the fields to be used on the show action
150
201
  * `form_fields` - the fields to be used on all form actions (new, edit, etc..)
202
+ * `action_fields` - the fields to be used on all actions. This will only be used when the specific action fields aren't defined.
151
203
  * `searchable_fields` - the fields to be used while searching
152
204
 
153
205
  To use these configurators, you pass a block to the bootstrap\_admin macro like so:
@@ -161,6 +213,28 @@ bootstrap_admin do |config|
161
213
  end
162
214
  ```
163
215
 
216
+ ### Configuring the action links available
217
+
218
+ Imagine that for some reason you don't have the need to create new records on a given scaffold. Then, there really shouldn't be a button/link to the new record form...
219
+ In order to configure which action links should be shown on a given scaffold, you can use the `available_actions` configurator:
220
+
221
+ ```ruby
222
+ bootstrap_admin do |config|
223
+ config.available_actions = [:show, :new]
224
+ end
225
+ ```
226
+
227
+ With this setting, then your scaffold would only show the link to show on each record and the link to the new record form.
228
+
229
+ By default the available_actions are:
230
+
231
+ * `:new` - collection-wise link to the new record form
232
+ * `:show` - member-wise link to show the record
233
+ * `:edit` - member-wise link to the edit record form
234
+ * `:destroy` - member-wise link to destroy the record
235
+
236
+ No other actions will be taken into account.
237
+
164
238
  ### Configuring response formats
165
239
 
166
240
  bootstrap\_admin also allows you to define to which formats will your controller respond to using the `responder_formats` configurator like so:
@@ -171,6 +245,18 @@ bootstrap_admin do |config|
171
245
  end
172
246
  ```
173
247
 
248
+ ### Configuring which model to use
249
+
250
+ Sometimes you need a controller to handle a model that has a completely different name from the controller. On those cases, bootstrap\_admin allows you to configure the name of the model to use:
251
+
252
+ ```ruby
253
+ class NewsController < AdminController
254
+ bootstrap_admin do |config|
255
+ config.model_name = "NewsArticle"
256
+ end
257
+ end
258
+ ```
259
+
174
260
  ## Configuring the Routes
175
261
 
176
262
  TODO
@@ -203,7 +289,7 @@ def title record
203
289
  end
204
290
  ```
205
291
 
206
- If, on the other hand you need to use diferent code to display diferent actions, then your helper must:
292
+ If, on the other hand you need to use different code to display different actions, then your helper must:
207
293
 
208
294
  * Be named `<action>_<field>`
209
295
  * Accept one argument - the model instance we are displaying
@@ -220,10 +306,12 @@ end
220
306
 
221
307
  #### Overriding field on `form` actions (`new`, `edit`, etc..)
222
308
 
223
- To override the field usage on a form action, your helper must:
309
+ This is similar to the overriding done for the `show` and/or `index` actions.
310
+
311
+ If all your form actions (`new`, `edit`, etc..) can use the same code, then your helper must:
224
312
 
225
313
  * Be named `form_<field>`
226
- * Accept one argument - the form for the model instance
314
+ * Accept one argument - the form builder for the model
227
315
 
228
316
  ```ruby
229
317
  def form_title form
@@ -232,6 +320,16 @@ end
232
320
  ```
233
321
  You can use `form.object` to get the object to which the form is for.
234
322
 
323
+ But if you need to use different code on each action, then you can build helpers that must:
324
+
325
+ * Be named `<action>_form_<field>`
326
+ * Accept one argument - the form builder for the model
327
+
328
+ ```ruby
329
+ def new_form_title form
330
+ form.input(:title)
331
+ end
332
+ ```
235
333
 
236
334
  ### Overriding the views
237
335
 
@@ -98,6 +98,7 @@ input[type="color"],
98
98
 
99
99
  .pagination {
100
100
  margin: 0;
101
+ float: right;
101
102
  }
102
103
 
103
104
  .pagination ul > li > a,
@@ -32,7 +32,7 @@ module BootstrapAdmin::MenuHelper
32
32
  "- :item: #{ename}"
33
33
  end.join("\n")
34
34
 
35
- @bootstrap_admin_menu_items = YAML.load(yml_menu)
35
+ @bootstrap_admin_menu_items = YAML.load(yml_menu) || []
36
36
  end
37
37
 
38
38
  # =============================================================================
@@ -134,8 +134,8 @@ module BootstrapAdminHelper
134
134
  defaults = {:controller => params[:controller]}.merge options
135
135
 
136
136
  ctrl_namespace = defaults[:controller].split("/").first
137
- # Fix for engines with shared namespace for some reason main_app.url_for doesn't find the route without this "/"
138
- # It consider the route inside of engine instead of main app.
137
+ # Fix for engines with shared namespace for some reason main_app.url_for doesn't find the route without this "/"
138
+ # It consider the route inside of engine instead of main app.
139
139
  defaults[:controller] = "/#{defaults[:controller]}"
140
140
 
141
141
  if instance_eval "defined? #{ctrl_namespace}"
@@ -171,7 +171,7 @@ module BootstrapAdminHelper
171
171
  end
172
172
 
173
173
  # =====
174
- def index_default_actions
174
+ def index_default_actions
175
175
  if available_actions.include? :new
176
176
  model_klass = model_for controller
177
177
  link_to([:new, model_klass], bootstrap_url_for(:action => :new), :class => 'btn btn-primary').html_safe
@@ -243,7 +243,11 @@ module BootstrapAdminHelper
243
243
  bootstrap_admin_config.send("action_fields") ||
244
244
  model_klass.accessible_attributes.
245
245
  reject(&:blank?).
246
- map{|att| real_attribute_name att }
246
+ map{|att| real_attribute_name att }.
247
+ reject do |att|
248
+ att.to_s =~ /(.+)_attributes/ &&
249
+ model_klass.reflect_on_all_associations.map(&:name).include?($1.to_sym)
250
+ end
247
251
 
248
252
  @attributes = fields.map do |att|
249
253
  BootstrapAdmin::Attribute.new att,
@@ -252,6 +256,20 @@ module BootstrapAdminHelper
252
256
  end
253
257
  end
254
258
 
259
+ # =============================================================================
260
+ # Tries to render the action/partial "namespaced" with the current action name
261
+ # if it fails, then simply calls render with whatever args that got passed in.
262
+ #
263
+ # Ex:
264
+ # # on get to '/admin/some_resource/new'
265
+ # render_with_fallback 'form' # this will to render 'new_form', if it fails,
266
+ # # then it will just call "render 'form'"
267
+ def render_with_fallback *args
268
+ render "#{params[:action]}_#{args.first}", *args[1..-1]
269
+ rescue ActionView::MissingTemplate
270
+ render *args
271
+ end
272
+
255
273
  # =============================================================================
256
274
  # def render_attribute name, type = :index
257
275
  # # content_tag :td do
@@ -2,7 +2,7 @@
2
2
  = simple_form_for *bootstrap_form_url(model_instance) do |f|
3
3
  = f.error_notification
4
4
 
5
- = render "form_fields", :form => f
5
+ = render_with_fallback "form_fields", :form => f
6
6
 
7
7
  .actions
8
8
  = yield :actions
@@ -1,6 +1,7 @@
1
- .pagination{:style=>"float:right"}
1
+ .clear
2
+ .pagination
2
3
  %ul
3
4
  = paginator_previous paginator
4
5
  = paginator_pages paginator
5
6
  = paginator_next paginator
6
- .clear
7
+ .clear
@@ -1,3 +1,3 @@
1
1
  %h1.dotted= t('helpers.submit.edit', :model => model_for(controller).model_name.human) + " - #{model_instance_for(controller)}"
2
2
 
3
- = render 'form'
3
+ = render_with_fallback 'form'
@@ -1,3 +1,3 @@
1
1
  %h1.dotted= t 'helpers.submit.new', :model => model_for(controller).model_name.human
2
2
 
3
- = render 'form'
3
+ = render_with_fallback 'form'
@@ -17,9 +17,10 @@ Gem::Specification.new do |gem|
17
17
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
18
  gem.require_paths = ["lib"]
19
19
 
20
- gem.add_runtime_dependency %q<rails>, [">= 3.1.0"]
21
- gem.add_runtime_dependency %q<simple_form>, [">= 2.0.0"]
20
+ gem.add_runtime_dependency %q<rails>, ">= 3.1.0"
21
+ gem.add_runtime_dependency %q<simple_form>, ">= 2.0.0"
22
22
  gem.add_runtime_dependency %q<haml>
23
23
  gem.add_runtime_dependency %q<coffee-rails>
24
24
  gem.add_runtime_dependency %q<jquery-rails>
25
+ gem.add_runtime_dependency %q<responders>
25
26
  end
@@ -29,6 +29,6 @@ SimpleForm.setup do |config|
29
29
  wrapper.use :label
30
30
  end
31
31
 
32
- SimpleForm.form_class = "form-stacked"
32
+ SimpleForm.default_form_class = "form-stacked"
33
33
  SimpleForm.browser_validations = false
34
34
  end
@@ -39,9 +39,12 @@ module BootstrapAdmin
39
39
  private
40
40
  # =============================================================================
41
41
  def add_bootstrap_admin_viewpath
42
+ view_matcher_format = ":action{.:locale,}{.:formats,}{.:handlers,}"
43
+ bootstrap_admin_app_viewpath = "#{Rails.root}/app/views/#{BootstrapAdmin.admin_namespace}/defaults"
42
44
  bootstrap_admin_viewpath = File.expand_path("../../../app/views/defaults", __FILE__)
43
- self.view_paths << ActionView::FileSystemResolver.new(
44
- bootstrap_admin_viewpath, ":action{.:locale,}{.:formats,}{.:handlers,}")
45
+
46
+ self.view_paths << ActionView::FileSystemResolver.new(bootstrap_admin_app_viewpath, view_matcher_format)
47
+ self.view_paths << ActionView::FileSystemResolver.new(bootstrap_admin_viewpath, view_matcher_format)
45
48
  end
46
49
 
47
50
  end # module ClassMethods
@@ -1,3 +1,3 @@
1
1
  module BootstrapAdmin
2
- VERSION = "0.0.15"
2
+ VERSION = "0.0.17"
3
3
  end
@@ -22,6 +22,13 @@ module BootstrapAdmin
22
22
  class BootstrapAdminEngine < Rails::Engine
23
23
  config.autoload_paths << File.expand_path("../../app/helpers", __FILE__)
24
24
  end
25
+
26
+ # =============================================================================
27
+ # Returns the gem root dir
28
+ def self.root_dir
29
+ File.expand_path("../..", __FILE__)
30
+ end
31
+
25
32
  # =============================================================================
26
33
  # Defines the namespace where all the "bootstrap_admin" magic happens
27
34
  mattr_accessor :admin_namespace
@@ -17,6 +17,11 @@ module BootstrapAdmin
17
17
  copy_file "en_bootstrap_admin.yml", "config/locales/en_bootstrap_admin.yml"
18
18
  end
19
19
 
20
+ def append_to_assets
21
+ append_file "config/initializers/assets.rb",
22
+ "Rails.application.config.assets.precompile += %w( admin.css admin.js )"
23
+ end
24
+
20
25
  def asset_configuration
21
26
  empty_directory "app/assets/javascripts/#{namespace_parsed}"
22
27
  create_file "app/assets/javascripts/#{namespace_parsed}.js" do
@@ -0,0 +1,24 @@
1
+ Description:
2
+ Allows you to override the default views for all bootstrap_admin actions, either globally or resource specific.
3
+ If you choose to override globally, then all views for all resources will be overridden.
4
+ If you choose to override for a specific resource, then your overrides will only affect that resources' views.
5
+
6
+ Example:
7
+ $ rails g bootstrap_admin:override_views defaults
8
+ This will:
9
+ 1) Create app/views/admin/defaults folder
10
+ 2) Copy all of bootstrap_admin default views to that folder for you to tweak
11
+ From there on, all resources will use these views.
12
+
13
+ $ rails g bootstrap_admin:override_views defaults index new
14
+ This will:
15
+ 1) Create app/views/admin/defaults folder
16
+ 2) Copy all index and new related views to that folder for you to tweak
17
+ From there on, all resources will use these views to render index or new actions.
18
+
19
+ $ rails g bootstrap_admin:override_views books
20
+ This will:
21
+ 1) Create app/views/admin/books folder (if it doesn't exist already)
22
+ 2) Copy all of bootstrap_admin default views to that folder for you to tweak
23
+ From there on, only book resources will use these views.
24
+
@@ -0,0 +1,61 @@
1
+ module BootstrapAdmin
2
+ module Generators
3
+ class OverrideViewsGenerator < Rails::Generators::Base
4
+ # =============================================================================
5
+ argument :resource, :type => :string,
6
+ :default => "defaults",
7
+ :banner => "defaults or <resource>"
8
+
9
+ # =============================================================================
10
+ argument :actions, :type => :array,
11
+ :optional => true,
12
+ :banner => "index show edit ...",
13
+ :default => %w(index show new edit)
14
+
15
+ # =============================================================================
16
+ class_option :namespace, :type => :string,
17
+ :default => "admin",
18
+ :desc => "Namespace used by the bootstrap_admin"
19
+
20
+ source_root File.expand_path("../templates", __FILE__)
21
+
22
+ # =============================================================================
23
+ def copy_views
24
+ folder_base = "#{Rails.root}/app/views/#{BootstrapAdmin.admin_namespace}"
25
+ target_dir = if "defaults" == resource
26
+ "#{folder_base}/defaults" # global view folder
27
+ else
28
+ "#{folder_base}/#{resource.tableize}" # resource view folder
29
+ end
30
+
31
+ empty_directory target_dir
32
+ _copy_views_ target_dir, actions
33
+ end
34
+
35
+ # =============================================================================
36
+ protected
37
+ VIEW_DEPENDENCIES = {
38
+ "index" => ['index', '_index', '_paginator', '_search_box'],
39
+ "show" => ['show' , '_show'],
40
+ "new" => ['new' , ['_form', '_new_form'] , ['_form_fields', '_new_form_fields' ]],
41
+ "edit" => ['edit' , ['_form', '_edit_form'], ['_form_fields', '_edit_form_fields']],
42
+ "new_and_edit" => ['new' , 'edit', '_form', '_form_fields']
43
+ }
44
+
45
+ def _copy_views_ target_dir, actions
46
+ if actions & %w[new edit] == %w[new edit]
47
+ actions = actions - %w[new edit] + %w[new_and_edit]
48
+ end
49
+
50
+ actions.each do |action|
51
+ VIEW_DEPENDENCIES[action].each do |view_name, rename_to|
52
+ view = "#{BootstrapAdmin.root_dir}/app/views/defaults/#{view_name}.html.haml"
53
+ target = "#{target_dir}/#{rename_to || view_name}.html.haml"
54
+ copy_file view, target
55
+ end
56
+ end
57
+ end
58
+
59
+ end # class OverrideViewsGenerator
60
+ end # module Generators
61
+ end # module BootstrapAdmin