effective_resources 1.18.0 → 1.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +25 -0
- data/app/controllers/admin/select2_ajax_controller.rb +24 -0
- data/app/controllers/concerns/effective/select2_ajax_controller.rb +52 -0
- data/app/helpers/effective_resources_helper.rb +14 -0
- data/app/models/effective/resources/relation.rb +26 -9
- data/config/routes.rb +13 -0
- data/lib/effective_resources/version.rb +1 -1
- metadata +5 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c0c85319423568e1dd19b9b1055bdd0c320bed118398156cc6cf8e8891c6d116
         | 
| 4 | 
            +
              data.tar.gz: 6f9729378c464d1de1fcd1556dc33c5591374efccee47e14044d99f278ff6ca9
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 11cedc4d9ee5dce6389bcb9e3505e6638abd6ef3ffefe2383f3ea91ea95cf1eff76c02185c563b3b595e4e0ee808828cd1f3bf6d8f758fef287b7437a9c45f45
         | 
| 7 | 
            +
              data.tar.gz: d3a9a54642101af184239b0cb63c33c8a9d66431061da366f1d8dbdd99ec70d2f645248aa5f7de3e235d2c77b7cf2675b8d46168a5c2da782ac937f47853d58e
         | 
    
        data/README.md
    CHANGED
    
    | @@ -354,6 +354,31 @@ You can also call `render_wizard_sidebar(resource)` without the block syntax. | |
| 354 354 |  | 
| 355 355 | 
             
            If you add `f.hidden_field(:skip_to_step, value: 'stepc')` you can control the next step.
         | 
| 356 356 |  | 
| 357 | 
            +
            ## Select2 Ajax Controller
         | 
| 358 | 
            +
             | 
| 359 | 
            +
            This gem provides an admin endpoint for select2 AJAX to fetch users.
         | 
| 360 | 
            +
             | 
| 361 | 
            +
            To use this endpoint please add
         | 
| 362 | 
            +
             | 
| 363 | 
            +
            ```
         | 
| 364 | 
            +
            can :admin, :effective_resources
         | 
| 365 | 
            +
            ```
         | 
| 366 | 
            +
             | 
| 367 | 
            +
            And then create a select field like this:
         | 
| 368 | 
            +
             | 
| 369 | 
            +
            ```
         | 
| 370 | 
            +
              = f.select :user_id, current_user.class.all,
         | 
| 371 | 
            +
                ajax_url: effective_resources.users_admin_select2_ajax_index_path
         | 
| 372 | 
            +
            ```
         | 
| 373 | 
            +
             | 
| 374 | 
            +
            To format the results, add a method to your User class. It can return html.
         | 
| 375 | 
            +
             | 
| 376 | 
            +
            ```
         | 
| 377 | 
            +
            def to_select2
         | 
| 378 | 
            +
              "<span>#{user.first_name} #{user.last_name}</span> <small>#{user.email}</small>"
         | 
| 379 | 
            +
            end
         | 
| 380 | 
            +
            ```
         | 
| 381 | 
            +
             | 
| 357 382 | 
             
            ## Testing
         | 
| 358 383 |  | 
| 359 384 | 
             
            Run tests by:
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            module Admin
         | 
| 2 | 
            +
              class Select2AjaxController < ApplicationController
         | 
| 3 | 
            +
                before_action(:authenticate_user!) if defined?(Devise)
         | 
| 4 | 
            +
                before_action { EffectiveResources.authorize!(self, :admin, :effective_resources) }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                include Effective::Select2AjaxController
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def users
         | 
| 9 | 
            +
                  collection = current_user.class.all
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  respond_with_select2_ajax(collection) do |user|
         | 
| 12 | 
            +
                    { id: user.to_param, text: user.try(:to_select2) || to_select2(user) }
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                private
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def to_select2(user)
         | 
| 19 | 
            +
                  "<span>#{user.first_name} #{user.last_name}</span> <small>#{user.email}</small>"
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            module Effective
         | 
| 2 | 
            +
              module Select2AjaxController
         | 
| 3 | 
            +
                extend ActiveSupport::Concern
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def respond_with_select2_ajax(collection, skip_search: false, &block)
         | 
| 6 | 
            +
                  raise('collection should be an ActiveRecord::Relation') unless collection.kind_of?(ActiveRecord::Relation)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  # Authorize
         | 
| 9 | 
            +
                  EffectiveResources.authorize!(self, :index, collection.klass)
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  # Scope
         | 
| 12 | 
            +
                  if collection.respond_to?(:select2_ajax)
         | 
| 13 | 
            +
                    collection = collection.select2_ajax
         | 
| 14 | 
            +
                  elsif collection.respond_to?(:sorted)
         | 
| 15 | 
            +
                    collection = collection.sorted
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  # Search
         | 
| 19 | 
            +
                  if (term = params[:term]).present? && !skip_search
         | 
| 20 | 
            +
                    collection = Effective::Resource.new(collection).search_any(term)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  # Paginate
         | 
| 24 | 
            +
                  per_page = 50
         | 
| 25 | 
            +
                  page = (params[:page] || 1).to_i
         | 
| 26 | 
            +
                  last = (collection.reselect(:id).count.to_f / per_page).ceil
         | 
| 27 | 
            +
                  more = page < last
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  offset = [(page - 1), 0].max * per_page
         | 
| 30 | 
            +
                  collection = collection.limit(per_page).offset(offset)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  # Results
         | 
| 33 | 
            +
                  results = collection.map do |resource|
         | 
| 34 | 
            +
                    if block_given?
         | 
| 35 | 
            +
                      option = yield(resource)
         | 
| 36 | 
            +
                      raise('expected a Hash with id and text params') unless option.kind_of?(Hash) && option[:id] && option[:text]
         | 
| 37 | 
            +
                      option
         | 
| 38 | 
            +
                    else
         | 
| 39 | 
            +
                      { id: resource.to_param, text: resource.try(:to_select2) || resource.to_s }
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # Respond
         | 
| 44 | 
            +
                  respond_to do |format|
         | 
| 45 | 
            +
                    format.js do
         | 
| 46 | 
            +
                      render json: { results: results, pagination: { more: more } }
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| @@ -207,6 +207,20 @@ module EffectiveResourcesHelper | |
| 207 207 | 
             
              end
         | 
| 208 208 | 
             
              alias_method :render_resource, :render_resource_partial
         | 
| 209 209 |  | 
| 210 | 
            +
              def render_if_exists(partial, atts = {})
         | 
| 211 | 
            +
                raise('expected a path') unless partial.kind_of?(String)
         | 
| 212 | 
            +
                raise('path should not include spaces') if partial.include?(' ')
         | 
| 213 | 
            +
             | 
| 214 | 
            +
                pieces = partial.to_s.split('/') - [nil, '']
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                file = pieces.last
         | 
| 217 | 
            +
                path = pieces[0..-2].join('/')
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                if lookup_context.exists?(file, [path], :partial)
         | 
| 220 | 
            +
                  render(partial, atts)
         | 
| 221 | 
            +
                end
         | 
| 222 | 
            +
              end
         | 
| 223 | 
            +
             | 
| 210 224 | 
             
              # Tableize attributes
         | 
| 211 225 | 
             
              # This is used by effective_orders, effective_logging, effective_trash and effective_mergery
         | 
| 212 226 | 
             
              def tableize_hash(obj, table: 'table', th: true, sub_table: 'table', sub_th: true, flatten: true)
         | 
| @@ -6,6 +6,10 @@ module Effective | |
| 6 6 | 
             
                  TARGET_LIST_LIMIT = 1500
         | 
| 7 7 | 
             
                  TARGET_KEYS_LIMIT = 30000
         | 
| 8 8 |  | 
| 9 | 
            +
                  DO_NOT_SEARCH_EQUALS = ['unconfirmed_email', 'provider', 'secret', 'crypt', 'salt', 'uid', 'certificate', 'otp', 'ssn']
         | 
| 10 | 
            +
                  DO_NOT_SEARCH_INCLUDE = ['password']
         | 
| 11 | 
            +
                  DO_NOT_SEARCH_END_WITH = ['_url', '_param', '_token', '_type', '_id', '_key', '_ip']
         | 
| 12 | 
            +
             | 
| 9 13 | 
             
                  # This could be active_model? in which we just return the klass itself here
         | 
| 10 14 | 
             
                  # This value ends up being crud_controller resource_scope()
         | 
| 11 15 | 
             
                  def relation
         | 
| @@ -197,18 +201,31 @@ module Effective | |
| 197 201 | 
             
                    end
         | 
| 198 202 |  | 
| 199 203 | 
             
                    # Otherwise, we fall back to a string/text search of all columns
         | 
| 200 | 
            -
                    columns = Array(columns || search_columns)
         | 
| 204 | 
            +
                    columns = Array(columns || search_columns).reject do |column|
         | 
| 205 | 
            +
                      DO_NOT_SEARCH_EQUALS.any? { |value| column == value } ||
         | 
| 206 | 
            +
                      DO_NOT_SEARCH_INCLUDE.any? { |value| column.include?(value) } ||
         | 
| 207 | 
            +
                      DO_NOT_SEARCH_END_WITH.any? { |value| column.end_with?(value) }
         | 
| 208 | 
            +
                    end
         | 
| 209 | 
            +
             | 
| 201 210 | 
             
                    fuzzy = true unless fuzzy == false
         | 
| 202 211 |  | 
| 203 | 
            -
                     | 
| 204 | 
            -
             | 
| 205 | 
            -
             | 
| 206 | 
            -
             | 
| 207 | 
            -
             | 
| 208 | 
            -
                       | 
| 209 | 
            -
             | 
| 212 | 
            +
                    # Retval
         | 
| 213 | 
            +
                    searched = relation
         | 
| 214 | 
            +
                    terms = value.split(' ') - [nil, '']
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                    terms.each do |term|
         | 
| 217 | 
            +
                      conditions = (
         | 
| 218 | 
            +
                        if fuzzy
         | 
| 219 | 
            +
                          columns.map { |name| "#{sql_column(name)} #{ilike} :fuzzy" }
         | 
| 220 | 
            +
                        else
         | 
| 221 | 
            +
                          columns.map { |name| "#{sql_column(name)} = :term" }
         | 
| 222 | 
            +
                        end
         | 
| 223 | 
            +
                      ).join(' OR ')
         | 
| 224 | 
            +
             | 
| 225 | 
            +
                      searched = searched.where(conditions, fuzzy: "%#{term}%", term: term)
         | 
| 226 | 
            +
                    end
         | 
| 210 227 |  | 
| 211 | 
            -
                     | 
| 228 | 
            +
                    searched
         | 
| 212 229 | 
             
                  end
         | 
| 213 230 |  | 
| 214 231 | 
             
                  private
         | 
    
        data/config/routes.rb
    ADDED
    
    | @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            Rails.application.routes.draw do
         | 
| 2 | 
            +
              mount EffectiveResources::Engine => '/', as: 'effective_resources'
         | 
| 3 | 
            +
            end
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            EffectiveResources::Engine.routes.draw do
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              namespace :admin do
         | 
| 8 | 
            +
                resources :select2_ajax, only: [] do
         | 
| 9 | 
            +
                  get :users, on: :collection
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: effective_resources
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.18. | 
| 4 | 
            +
              version: 1.18.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Code and Effect
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2022-06- | 
| 11 | 
            +
            date: 2022-06-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         | 
| @@ -133,6 +133,7 @@ files: | |
| 133 133 | 
             
            - README.md
         | 
| 134 134 | 
             
            - app/assets/javascripts/effective_resources.js
         | 
| 135 135 | 
             
            - app/assets/javascripts/effective_resources/effective_ujs.js
         | 
| 136 | 
            +
            - app/controllers/admin/select2_ajax_controller.rb
         | 
| 136 137 | 
             
            - app/controllers/concerns/effective/crud_controller.rb
         | 
| 137 138 | 
             
            - app/controllers/concerns/effective/crud_controller/actions.rb
         | 
| 138 139 | 
             
            - app/controllers/concerns/effective/crud_controller/dsl.rb
         | 
| @@ -142,6 +143,7 @@ files: | |
| 142 143 | 
             
            - app/controllers/concerns/effective/crud_controller/save.rb
         | 
| 143 144 | 
             
            - app/controllers/concerns/effective/crud_controller/submits.rb
         | 
| 144 145 | 
             
            - app/controllers/concerns/effective/flash_messages.rb
         | 
| 146 | 
            +
            - app/controllers/concerns/effective/select2_ajax_controller.rb
         | 
| 145 147 | 
             
            - app/controllers/concerns/effective/wizard_controller.rb
         | 
| 146 148 | 
             
            - app/controllers/concerns/effective/wizard_controller/actions.rb
         | 
| 147 149 | 
             
            - app/controllers/concerns/effective/wizard_controller/before_actions.rb
         | 
| @@ -206,6 +208,7 @@ files: | |
| 206 208 | 
             
            - app/views/effective/resource/_actions_glyphicons.html.haml
         | 
| 207 209 | 
             
            - app/views/layouts/effective_mailer_layout.html.haml
         | 
| 208 210 | 
             
            - config/effective_resources.rb
         | 
| 211 | 
            +
            - config/routes.rb
         | 
| 209 212 | 
             
            - lib/effective_resources.rb
         | 
| 210 213 | 
             
            - lib/effective_resources/effective_gem.rb
         | 
| 211 214 | 
             
            - lib/effective_resources/engine.rb
         |