express_admin 1.4.6 → 1.4.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.
- checksums.yaml +4 -4
- data/app/components/express_admin/nav_bar_actions.rb +7 -0
- data/app/views/shared/express_admin/_navigation_bar.html.et +1 -1
- data/lib/express_admin/standard_actions.rb +139 -8
- data/lib/express_admin/version.rb +1 -1
- data/test/controllers/standard_controller_test.rb +17 -3
- data/test/dummy/app/controllers/admin/categories_controller.rb +5 -6
- data/test/dummy/app/controllers/admin/parts_controller.rb +11 -0
- data/test/dummy/app/controllers/admin/widgets_controller.rb +5 -6
- data/test/dummy/app/models/part.rb +3 -0
- data/test/dummy/app/models/widget.rb +1 -0
- data/test/dummy/app/views/admin/parts/index.html.et +8 -0
- data/test/dummy/app/views/admin/parts/show.html.et +3 -0
- data/test/dummy/app/views/admin/widgets/index.html.et +6 -8
- data/test/dummy/app/views/admin/widgets/show.html.et +3 -0
- data/test/dummy/config/menu.yml +2 -0
- data/test/dummy/config/routes.rb +6 -1
- data/test/dummy/db/migrate/20150812073447_create_parts.rb +10 -0
- data/test/dummy/db/schema.rb +8 -1
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/test/components/smart_form_test.rb +0 -5
- data/test/dummy/test/components/smart_table_test.rb +0 -1
- data/test/dummy/test/controllers/admin/parts_controller_test.rb +20 -0
- data/test/dummy/test/controllers/admin/widgets_controller_test.rb +20 -0
- data/test/dummy/test/fixtures/parts.yml +10 -0
- data/test/fixtures/parts.yml +10 -0
- data/test/generators_test_helper.rb +25 -6
- data/test/lib/generators/express_admin/install_generator_test.rb +47 -43
- data/vendor/gems/express_templates/Gemfile.lock +1 -1
- data/vendor/gems/express_templates/express_templates-0.9.6.gem +0 -0
- data/vendor/gems/express_templates/lib/express_templates/components/capabilities/resourceful.rb +13 -5
- data/vendor/gems/express_templates/lib/express_templates/version.rb +1 -1
- data/vendor/gems/express_templates/test/components/forms/express_form_test.rb +4 -0
- data/vendor/gems/express_templates/test/dummy/log/test.log +963 -0
- metadata +68 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: faf9fd31ec56bd2a725c15cfe8b2b902bc9e841b
         | 
| 4 | 
            +
              data.tar.gz: 7d118947bdd9dcda591c6aeae958afbf6600bc14
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 78fd0b1a04e2fa9a3ecfae55300f5644497dc344fe0b3224be6c1e702ea1817be66d1b735d039e1648f2a955c5a5293b09e98f0b8c77c2a60942ea404ea2e796
         | 
| 7 | 
            +
              data.tar.gz: 3a2515fe8b7729c1dfebb11955b9e4b7f250806ffa1a1527d6771281aaa51fc1fd3647d24412b9cebbe39e2bd01b51bce019265e15db5fa9ef0c31daf380f8f7
         | 
| @@ -7,9 +7,13 @@ module ExpressAdmin | |
| 7 7 | 
             
                    include InstanceMethods
         | 
| 8 8 | 
             
                    helper_method :collection
         | 
| 9 9 | 
             
                    helper_method :resource
         | 
| 10 | 
            +
                    helper_method :resource_path
         | 
| 11 | 
            +
                    helper_method :collection_path
         | 
| 10 12 |  | 
| 11 13 | 
             
                    class_attribute :defaults
         | 
| 12 14 | 
             
                    self.defaults = {layout: 'layouts/express_admin/admin'}
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    before_filter :expose_parent_resources
         | 
| 13 17 | 
             
                  end
         | 
| 14 18 | 
             
                end
         | 
| 15 19 |  | 
| @@ -94,14 +98,48 @@ module ExpressAdmin | |
| 94 98 |  | 
| 95 99 | 
             
                  protected
         | 
| 96 100 | 
             
                    def resource_path
         | 
| 97 | 
            -
                       | 
| 101 | 
            +
                      if parent_resource_names.blank?
         | 
| 102 | 
            +
                        self.send(scoped_path_helper("#{resource_name}_path"), resource)
         | 
| 103 | 
            +
                      elsif proxy = route_proxy
         | 
| 104 | 
            +
                        proxy.send(scoped_path_helper(nested_resource_path_helper), resource_ids_hash)
         | 
| 105 | 
            +
                      else
         | 
| 106 | 
            +
                        self.send(scoped_path_helper(nested_resource_path_helper), resource_ids_hash)
         | 
| 107 | 
            +
                      end
         | 
| 108 | 
            +
                    end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    def scoped_path_helper(path_helper)
         | 
| 111 | 
            +
                      [scope_name, path_helper].compact.join('_')
         | 
| 112 | 
            +
                    end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                    def collection_path
         | 
| 115 | 
            +
                      if parent_resource_names.blank?
         | 
| 116 | 
            +
                        self.send(scoped_path_helper("#{collection_name}_path"), resource)
         | 
| 117 | 
            +
                      elsif proxy = route_proxy
         | 
| 118 | 
            +
                        proxy.send(scoped_path_helper(nested_collection_path_helper), resource_ids_hash)
         | 
| 119 | 
            +
                      else
         | 
| 120 | 
            +
                        self.send(scoped_path_helper(nested_collection_path_helper), resource_ids_hash)
         | 
| 121 | 
            +
                      end
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    def parent_module_name
         | 
| 125 | 
            +
                      self.class.to_s.match(/(\w+)::/).try(:[], 1)
         | 
| 98 126 | 
             
                    end
         | 
| 99 127 |  | 
| 100 | 
            -
                    def  | 
| 101 | 
            -
                       | 
| 102 | 
            -
             | 
| 128 | 
            +
                    def route_proxy
         | 
| 129 | 
            +
                      engine = "#{parent_module_name}::Engine".constantize rescue nil
         | 
| 130 | 
            +
                      if parent_module_name && engine
         | 
| 131 | 
            +
                        self.send(parent_module_name.underscore)
         | 
| 103 132 | 
             
                      else
         | 
| 104 | 
            -
                         | 
| 133 | 
            +
                        nil
         | 
| 134 | 
            +
                      end
         | 
| 135 | 
            +
                    end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                    def scope_name
         | 
| 138 | 
            +
                      engine = "#{parent_module_name}::Engine".constantize rescue nil
         | 
| 139 | 
            +
                      if parent_module_name && engine.nil?
         | 
| 140 | 
            +
                        return parent_module_name.underscore
         | 
| 141 | 
            +
                      else
         | 
| 142 | 
            +
                        nil
         | 
| 105 143 | 
             
                      end
         | 
| 106 144 | 
             
                    end
         | 
| 107 145 |  | 
| @@ -109,8 +147,24 @@ module ExpressAdmin | |
| 109 147 | 
             
                      self.send("#{resource_name}_params")
         | 
| 110 148 | 
             
                    end
         | 
| 111 149 |  | 
| 150 | 
            +
                    def nested?
         | 
| 151 | 
            +
                      !parent_resource_names.empty?
         | 
| 152 | 
            +
                    end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                    def parent_resource
         | 
| 155 | 
            +
                      self.send("current_#{parent_resource_names.last}")
         | 
| 156 | 
            +
                    end
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                    def end_of_association_chain
         | 
| 159 | 
            +
                      if nested?
         | 
| 160 | 
            +
                        parent_resource.send(resource_name.pluralize)
         | 
| 161 | 
            +
                      else
         | 
| 162 | 
            +
                        resource_class
         | 
| 163 | 
            +
                      end
         | 
| 164 | 
            +
                    end
         | 
| 165 | 
            +
             | 
| 112 166 | 
             
                    def load_collection
         | 
| 113 | 
            -
                      self.instance_variable_set(collection_ivar,  | 
| 167 | 
            +
                      self.instance_variable_set(collection_ivar, end_of_association_chain.all)
         | 
| 114 168 | 
             
                    end
         | 
| 115 169 |  | 
| 116 170 | 
             
                    def collection_ivar
         | 
| @@ -149,7 +203,84 @@ module ExpressAdmin | |
| 149 203 | 
             
                    def resource_name
         | 
| 150 204 | 
             
                      self.class.resource_name
         | 
| 151 205 | 
             
                    end
         | 
| 152 | 
            -
                  end
         | 
| 153 206 |  | 
| 207 | 
            +
                    def nested_resource_path_helper
         | 
| 208 | 
            +
                      (parent_resource_names + [resource_name, 'path']).join('_')
         | 
| 209 | 
            +
                    end
         | 
| 210 | 
            +
             | 
| 211 | 
            +
                    def nested_collection_path_helper
         | 
| 212 | 
            +
                      (parent_resource_names + [collection_name, 'path']).join('_')
         | 
| 213 | 
            +
                    end
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                    def expose_parent_resources
         | 
| 216 | 
            +
                      parent_resources = parent_resource_names
         | 
| 217 | 
            +
                      return if parent_resources.blank?
         | 
| 218 | 
            +
                      previous_parent = nil
         | 
| 219 | 
            +
                      parent_resources.each do |parent_name|
         | 
| 220 | 
            +
                        # TODO: optimize
         | 
| 221 | 
            +
                        parent_id = extract_path_info_from_routes["#{parent_name}_id".to_sym]
         | 
| 222 | 
            +
                        current_parent = "current_#{parent_name}".to_sym
         | 
| 223 | 
            +
                        unless self.respond_to?(current_parent)
         | 
| 224 | 
            +
                          if previous_parent.nil?
         | 
| 225 | 
            +
                            self.class_eval do
         | 
| 226 | 
            +
                              define_method(current_parent) do
         | 
| 227 | 
            +
                                "::#{parent_name.capitalize}".constantize.find(parent_id)
         | 
| 228 | 
            +
                              end
         | 
| 229 | 
            +
                            end
         | 
| 230 | 
            +
                          else
         | 
| 231 | 
            +
                            self.class_eval do
         | 
| 232 | 
            +
                              grandparent_accessor = previous_parent
         | 
| 233 | 
            +
                              define_method(current_parent) do
         | 
| 234 | 
            +
                                grandparent_resource = self.send(grandparent_accessor)
         | 
| 235 | 
            +
                                parent_scope = grandparent_resource.send(parent_name.pluralize)
         | 
| 236 | 
            +
                                parent_scope.find(parent_id)
         | 
| 237 | 
            +
                              end
         | 
| 238 | 
            +
                            end
         | 
| 239 | 
            +
                          end
         | 
| 240 | 
            +
                        end
         | 
| 241 | 
            +
                        previous_parent = current_parent
         | 
| 242 | 
            +
                      end
         | 
| 243 | 
            +
                    end
         | 
| 244 | 
            +
             | 
| 245 | 
            +
                    def parent_resource_names
         | 
| 246 | 
            +
                      path_info = extract_path_info_from_routes
         | 
| 247 | 
            +
                      unless path_info.nil?
         | 
| 248 | 
            +
                        path_info.keys.grep(/_id$/).map do |id|
         | 
| 249 | 
            +
                          id.to_s.gsub(/_id$/, '')
         | 
| 250 | 
            +
                        end
         | 
| 251 | 
            +
                      end
         | 
| 252 | 
            +
                    end
         | 
| 253 | 
            +
             | 
| 254 | 
            +
                    def extract_path_info_from_routes
         | 
| 255 | 
            +
                      recognized_path = nil
         | 
| 256 | 
            +
                      Rails::Engine.subclasses.each do |engine|
         | 
| 257 | 
            +
                        engine_instance = engine.instance
         | 
| 258 | 
            +
                        engine_route = Rails.application.routes.routes.find do |r|
         | 
| 259 | 
            +
                          r.app.app == engine_instance.class
         | 
| 260 | 
            +
                        end
         | 
| 261 | 
            +
                        next unless engine_route
         | 
| 262 | 
            +
                        path_for_engine = request.path.gsub(%r(^#{engine_route.path.spec.to_s}), "")
         | 
| 263 | 
            +
                        begin
         | 
| 264 | 
            +
                          recognized_path = engine_instance.routes.recognize_path(path_for_engine, method: request.method)
         | 
| 265 | 
            +
                        rescue ActionController::RoutingError => e
         | 
| 266 | 
            +
                        end
         | 
| 267 | 
            +
                      end
         | 
| 268 | 
            +
                      if recognized_path.nil?
         | 
| 269 | 
            +
                        begin
         | 
| 270 | 
            +
                          recognized_path = Rails.application.routes.recognize_path(request.path, method: request.method)
         | 
| 271 | 
            +
                        rescue ActionController::RoutingError => e
         | 
| 272 | 
            +
                        end
         | 
| 273 | 
            +
                      end
         | 
| 274 | 
            +
                      recognized_path
         | 
| 275 | 
            +
                    end
         | 
| 276 | 
            +
             | 
| 277 | 
            +
                    def resource_ids_hash
         | 
| 278 | 
            +
                      parent_resource_names.inject({id: resource.to_param}) do |hash, name|
         | 
| 279 | 
            +
                        hash["#{name}_id".to_sym] = self.send("current_#{name}".to_sym).to_param
         | 
| 280 | 
            +
                        hash
         | 
| 281 | 
            +
                      end
         | 
| 282 | 
            +
                    end
         | 
| 283 | 
            +
             | 
| 284 | 
            +
                end
         | 
| 154 285 | 
             
              end
         | 
| 155 | 
            -
            end
         | 
| 286 | 
            +
            end
         | 
| @@ -8,6 +8,9 @@ module ExpressAdmin | |
| 8 8 | 
             
                  def resource_class
         | 
| 9 9 | 
             
                    Widget
         | 
| 10 10 | 
             
                  end
         | 
| 11 | 
            +
                  def parent_resource_names
         | 
| 12 | 
            +
                    [] # skip nested resource handling
         | 
| 13 | 
            +
                  end
         | 
| 11 14 | 
             
                end
         | 
| 12 15 |  | 
| 13 16 | 
             
                def widgets_controller(params = {})
         | 
| @@ -88,10 +91,21 @@ module ExpressAdmin | |
| 88 91 | 
             
                  end
         | 
| 89 92 | 
             
                end
         | 
| 90 93 |  | 
| 91 | 
            -
                 | 
| 94 | 
            +
                test "it should provide collection and resource helpers" do
         | 
| 95 | 
            +
                  controller = widgets_controller
         | 
| 96 | 
            +
                  controller.index
         | 
| 97 | 
            +
                  assert controller.send(:collection).respond_to?(:count), "collection not provided by #index"
         | 
| 98 | 
            +
                  assert controller.send(:resource), "resource not provided by #index"
         | 
| 99 | 
            +
                end
         | 
| 92 100 |  | 
| 93 | 
            -
                 | 
| 101 | 
            +
                test "it should provide a default strong params" do
         | 
| 102 | 
            +
                  assert_raises(ActionController::ParameterMissing) do
         | 
| 103 | 
            +
                    widgets_controller.create
         | 
| 104 | 
            +
                  end
         | 
| 105 | 
            +
                  widgets_controller(widget: {column2: 'nothing'}).create
         | 
| 106 | 
            +
                end
         | 
| 94 107 |  | 
| 108 | 
            +
                # TODO: Implement later
         | 
| 95 109 | 
             
                # test "for nested resources it should try to expose a current method for parent resources"
         | 
| 96 110 | 
             
              end
         | 
| 97 | 
            -
            end
         | 
| 111 | 
            +
            end
         | 
| @@ -1,12 +1,11 @@ | |
| 1 1 | 
             
            module Admin
         | 
| 2 | 
            -
              class CategoriesController <  | 
| 2 | 
            +
              class CategoriesController < ExpressAdmin::StandardController
         | 
| 3 3 |  | 
| 4 | 
            -
                 | 
| 4 | 
            +
                protected
         | 
| 5 5 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                  def category_params
         | 
| 9 | 
            -
                    params.require(:category).permit!
         | 
| 6 | 
            +
                  def resource_class
         | 
| 7 | 
            +
                    ::Category
         | 
| 10 8 | 
             
                  end
         | 
| 9 | 
            +
             | 
| 11 10 | 
             
              end
         | 
| 12 11 | 
             
            end
         | 
| @@ -1,12 +1,11 @@ | |
| 1 1 | 
             
            module Admin
         | 
| 2 | 
            -
              class WidgetsController <  | 
| 2 | 
            +
              class WidgetsController < ExpressAdmin::StandardController
         | 
| 3 3 |  | 
| 4 | 
            -
                 | 
| 4 | 
            +
                protected
         | 
| 5 5 |  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                  def widget_params
         | 
| 9 | 
            -
                    params.require(:widget).permit!
         | 
| 6 | 
            +
                  def resource_class
         | 
| 7 | 
            +
                    ::Widget
         | 
| 10 8 | 
             
                  end
         | 
| 9 | 
            +
             | 
| 11 10 | 
             
              end
         | 
| 12 11 | 
             
            end
         | 
| @@ -1,10 +1,8 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
               | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
               | 
| 6 | 
            -
                 | 
| 7 | 
            -
                  smart_form(:widget)
         | 
| 8 | 
            -
                }
         | 
| 1 | 
            +
            main_region {
         | 
| 2 | 
            +
              smart_table(:widgets)
         | 
| 3 | 
            +
            }
         | 
| 4 | 
            +
            sidebar_region {
         | 
| 5 | 
            +
              widget_box(:widget) {
         | 
| 6 | 
            +
                smart_form(:widget)
         | 
| 9 7 | 
             
              }
         | 
| 10 8 | 
             
            }
         | 
    
        data/test/dummy/config/routes.rb
    CHANGED
    
    
    
        data/test/dummy/db/schema.rb
    CHANGED
    
    | @@ -11,7 +11,7 @@ | |
| 11 11 | 
             
            #
         | 
| 12 12 | 
             
            # It's strongly recommended that you check this file into your version control system.
         | 
| 13 13 |  | 
| 14 | 
            -
            ActiveRecord::Schema.define(version:  | 
| 14 | 
            +
            ActiveRecord::Schema.define(version: 20150812073447) do
         | 
| 15 15 |  | 
| 16 16 | 
             
              create_table "categories", force: :cascade do |t|
         | 
| 17 17 | 
             
                t.string   "name"
         | 
| @@ -19,6 +19,13 @@ ActiveRecord::Schema.define(version: 20150610081204) do | |
| 19 19 | 
             
                t.datetime "updated_at", null: false
         | 
| 20 20 | 
             
              end
         | 
| 21 21 |  | 
| 22 | 
            +
              create_table "parts", force: :cascade do |t|
         | 
| 23 | 
            +
                t.string   "name"
         | 
| 24 | 
            +
                t.integer  "widget_id"
         | 
| 25 | 
            +
                t.datetime "created_at", null: false
         | 
| 26 | 
            +
                t.datetime "updated_at", null: false
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 22 29 | 
             
              create_table "tags", force: :cascade do |t|
         | 
| 23 30 | 
             
                t.string "name"
         | 
| 24 31 | 
             
              end
         | 
    
        data/test/dummy/db/test.sqlite3
    CHANGED
    
    | Binary file | 
| @@ -87,11 +87,6 @@ module ExpressAdmin | |
| 87 87 | 
             
                  assert_match /<div class="[^"]*field-wrapper"/, widget_form
         | 
| 88 88 | 
             
                end
         | 
| 89 89 |  | 
| 90 | 
            -
                test 'path prefix is provided' do
         | 
| 91 | 
            -
                  action_attrib = 'action="/admin/widgets"'
         | 
| 92 | 
            -
                  assert_match action_attrib, widget_form(path_prefix: 'admin')
         | 
| 93 | 
            -
                end
         | 
| 94 | 
            -
             | 
| 95 90 | 
             
                test "options for select come from the related collection" do
         | 
| 96 91 | 
             
                  assert_match /<option.*>Toys<\/option>/, widget_form
         | 
| 97 92 | 
             
                  assert_match /<option.*>Tools<\/option>/, widget_form
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            require "test_helper"
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Admin
         | 
| 4 | 
            +
              class PartsControllerTest < ActionController::TestCase
         | 
| 5 | 
            +
                fixtures :all
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                test "should get show" do
         | 
| 8 | 
            +
                  get :show, category_id: categories(:toys).to_param, widget_id: widgets(:one).to_param, id: parts(:one).to_param
         | 
| 9 | 
            +
                  assert_response :success
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                test "should display the nested index" do
         | 
| 13 | 
            +
                  response = get :index, category_id: categories(:toys).to_param, widget_id: widgets(:one).to_param
         | 
| 14 | 
            +
                  assert_response :success
         | 
| 15 | 
            +
                  assert_match /Some part/, response.body
         | 
| 16 | 
            +
                  refute_match /Another part/, response.body
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         |