Repository URL to install this package:
|
Version:
0.1.1 ▾
|
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