Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
admin_toolbox / lib / admin_toolbox / previewable.rb
Size: Mime:
module AdminToolbox
  module Previewable
    def self.included(base)
      base.controller do
        private
        include UserMethods
        include UtilityMethods
        helper_method :singular_resource_name, :plural_resource_name
      end

      base.send :action_item, 'Live Preview', only: [:edit, :new] do
        link_to 'Live Preview',
                eval("live_preview_admin_#{plural_resource_name}_path"),
                class: 'live-preview'
      end

      base.send :member_action, :preview do
        render_preview(find_resource)
      end

      base.send :collection_action, :live_preview, :method => :post do
        render_preview(resource_class.new(params[singular_resource_name.to_sym]
                        .deep_reject_key!(:id)
                        .deep_reject_key!(:_destroy).permit!))
      end
    end

    module UserMethods
      # These should work as-is for most models but override per your needs
      # in your resource's controller block.

      def view_instance_var
        # The instance variable of your object used in your view template
        "@#{singular_resource_name}"
      end

      def cannot_preview_alert_message
        # Flash message when an object can't be previewed
        'Item cannot be previewed yet'
      end

      def prep_for_preview(item)
        # Do nothing by default, but if you need to, say stub empty values or
        # set up other stuff before rendering here you go
      end

      def previewable?(item)
        true # We are full of optimism here
      end
    end

    module UtilityMethods
      def singular_resource_name
        active_admin_config.resource_label.downcase.gsub(' ', '_')
      end

      def plural_resource_name
        ActiveSupport::Inflector.pluralize singular_resource_name
      end

      def render_preview(item)
        prep_for_preview(item)
        if previewable?(item)
          instance_variable_set(view_instance_var, item)
          render :layout => 'application',
                 :template => "#{plural_resource_name}/show"
        else
          redirect_to send("admin_#{plural_resource_name}_url"),
                      alert: cannot_preview_alert_message
        end
      end
    end
  end
end

class Hash
  def deep_reject_key!(key)
    keys.each {|k| delete(k) if k == key || self[k] == self[key] }
    values.each {|v| v.deep_reject_key!(key) if v.is_a? Hash }
    self
  end
end