diff --git a/Appraisals b/Appraisals
new file mode 100644
index 0000000..6007f61
--- /dev/null
+++ b/Appraisals
@@ -0,0 +1,12 @@
+appraise "rails-2" do
+ gem "iconv"
+ gem "rails", "2.3.18"
+end
+
+appraise "rails-3" do
+ gem "rails", "3.2.14"
+end
+
+appraise "rails-4" do
+ gem "rails", "4.1.8"
+end
diff --git a/Rakefile b/Rakefile
index 857ed95..d7944a9 100644
--- a/Rakefile
+++ b/Rakefile
@@ -15,9 +15,12 @@ begin
s.rubyforge_project = %q{quirkey}
s.summary = %q{An [almost] one command solution for adding admin interfaces/resources to a Rails app.}
s.add_runtime_dependency(%q, [">= 2.3.2", "< 3"])
+ s.add_runtime_dependency(%q, ["~> 2.7", ">= 2.7.0"])
s.add_runtime_dependency(%q, [">= 1.0"])
s.add_runtime_dependency(%q, [">= 0.2.0"])
s.add_runtime_dependency(%q, [">= 2.3.7", "< 3"])
+ s.add_development_dependency(%q, ["~>1.0", ">= 1.0.2"])
+ s.add_development_dependency(%q, ["~> 5.5", ">= 5.5.0"])
s.add_development_dependency(%q, ["~> 1.1", ">= 1.1.0"])
s.add_development_dependency(%q, ["~>10.4", ">= 10.4.2"])
s.add_development_dependency(%q, [">= 2.3.2", "< 3"])
@@ -32,7 +35,7 @@ end
Rake::TestTask.new do |t|
should_test_generator = ENV["TEST_GENERATOR"] == "true"
t.libs << "test"
- files = FileList["test/**/*_test.rb"].delete_if { |f| !should_test_generator && f == "test/qadmin_generator_test.rb" }
+ files = FileList["test/**/*_test.rb"].delete_if { |f| !should_test_generator && f == "test/generator_test.rb" }
t.test_files = files
t.verbose = true
end
diff --git a/lib/qadmin.rb b/lib/qadmin.rb
index 82d0296..3b4b38a 100644
--- a/lib/qadmin.rb
+++ b/lib/qadmin.rb
@@ -1,16 +1,14 @@
-$:.unshift(File.dirname(__FILE__)) unless
- $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
-
require 'iconv'
unless defined?(ActiveSupport)
require 'active_support'
end
-require 'erb'
+require "erubis"
+require 'forwardable'
module Qadmin
- VERSION = '0.2.3'
+ VERSION = '0.3.0'
end
%w{
diff --git a/lib/qadmin/actions/create.erb b/lib/qadmin/actions/create.erb
index 7d76f9a..16c87a6 100644
--- a/lib/qadmin/actions/create.erb
+++ b/lib/qadmin/actions/create.erb
@@ -1,14 +1,16 @@
def create
logger.debug 'Qadmin: Default /create'
- @model_instance = @<%= config.on_create.model_instance_name %> = <%= config.on_create.model_name %>.new(params[:<%= config.on_create.model_instance_name %>])
+ @model_instance = @<%= config.on_create.model_instance_name %> = <%= config.on_create.model_name %>.new(<%= config.on_create.model_instance_name %>_params)
respond_to do |format|
if @<%= config.on_create.model_instance_name %>.save
flash[:message] = '<%= config.on_create.model_human_name %> was successfully created.'
format.html { redirect_to(<%= config.on_create.path_prefix %>_path(@<%= config.on_create.model_instance_name %>)) }
format.xml { render :xml => @<%= config.on_create.model_instance_name %>, :status => :created, :location => @<%= config.on_create.model_instance_name %> }
+ format.js { render :json => {:<%= config.on_create.model_instance_name %> => @<%= config.on_create.model_instance_name %>, :status => :success}}
else
format.html { render_template_for_section('new.html') }
format.xml { render :xml => @<%= config.on_create.model_instance_name %>.errors }
+ format.js { render :json => {:status => :error, :messages => @<%= config.on_create.model_instance_name %>.errors}}
end
end
-end
\ No newline at end of file
+end
diff --git a/lib/qadmin/actions/index.erb b/lib/qadmin/actions/index.erb
index cbef4dc..f5e6a68 100644
--- a/lib/qadmin/actions/index.erb
+++ b/lib/qadmin/actions/index.erb
@@ -16,4 +16,4 @@ def index
format.xml
format.js
end
-end
\ No newline at end of file
+end
diff --git a/lib/qadmin/actions/update.erb b/lib/qadmin/actions/update.erb
index 0b0b6e6..74f0dc0 100644
--- a/lib/qadmin/actions/update.erb
+++ b/lib/qadmin/actions/update.erb
@@ -3,7 +3,7 @@ def update
@model_instance = @<%= config.on_update.model_instance_name %> = <%= config.on_update.model_name %>.find(params[:id])
respond_to do |format|
- if @<%= config.on_update.model_instance_name %>.update_attributes(params[:<%= config.on_update.model_instance_name %>])
+ if @<%= config.on_update.model_instance_name %>.update_attributes(<%= config.on_update.model_instance_name %>_params)
flash[:message] = '<%= config.on_update.model_human_name %> was successfully updated.'
format.html { redirect_to(<%= config.on_update.path_prefix %>_path(@<%= config.on_update.model_instance_name %>)) }
format.xml { head :ok }
diff --git a/lib/qadmin/configuration.rb b/lib/qadmin/configuration.rb
index c691504..6ab0e45 100644
--- a/lib/qadmin/configuration.rb
+++ b/lib/qadmin/configuration.rb
@@ -1,133 +1,159 @@
+require 'active_support/hash_with_indifferent_access'
+require 'active_support/core_ext/string/inflections'
+
module Qadmin
module Configuration
-
+
class Base < ::HashWithIndifferentAccess
-
- attr_accessor :base
-
+
+ attr_reader :base,
+ :controller_class,
+ :controller_name,
+ :model_class,
+ :model_name,
+ :model_instance_name,
+ :model_collection_name,
+ :model_human_name,
+ :namespace,
+ :parent,
+ :default_scope
+
def with_indifferent_access
self
end
-
- def self.hash_accessor(name, options = {})
- options[:default] ||= nil
- coerce = options[:coerce] ? ".#{options[:coerce]}" : ""
- module_eval <<-EOT
- def #{name}
- value = (self[:#{name}] ? self[:#{name}]#{coerce} : self[:#{name}]) ||
- (base && base.respond_to?(:#{name}) ? base.send(:#{name}) : #{options[:default].inspect})
- yield value if block_given?
- value
- end
-
- def #{name}=(value)
- self[:#{name}] = value
- end
- def #{name}?
- !!self[:#{name}]
- end
- EOT
- end
-
- hash_accessor :controller_klass
- hash_accessor :controller_name
- hash_accessor :model_name
- hash_accessor :model_instance_name
- hash_accessor :model_collection_name
- hash_accessor :model_human_name
- hash_accessor :namespace, :default => false
- hash_accessor :parent, :default => false
- hash_accessor :default_scope, :default => false
-
def initialize(options = {})
super
@base = options.delete(:base)
- extract_model_from_options(options)
+ @namespace = false
+ @parent = false
+ @default_scope = false
+ populate_model(options)
end
- def model_klass
- self.model_name.constantize
- end
-
def path_prefix(plural = false)
- name = plural ? model_collection_name : model_instance_name
- if namespace
- "#{namespace}_#{name}"
- else
+ name = plural ? @model_collection_name : @model_instance_name
+ if @namespace.nil?
name
+ else
+ "#{@namespace}_#{name}"
+ end
+ end
+
+ def polymorphic_array(*args)
+ args.compact!
+ if @parent && args.length < 2
+ args.unshift(@parent)
end
+ args.unshift(@namespace) if @namespace
+ args
end
-
+
def form_instance_for(instance)
- if parent
- [parent, instance]
- elsif namespace
- [namespace, instance]
- else
- instance
- end
+ i = instance.class != @model_class ? instance.becomes(@model_class) : instance
+ polymorphic_array(i)
end
-
+
def model_column_names
- model_klass.column_names
+ @columns ||= @model_class.column_names
rescue
[]
end
-
+
def inspect
"#<#{self.class} #{super}>"
end
-
- protected
- def extract_model_from_options(options = {})
- self.controller_klass = options[:controller_klass]
- self.controller_name = options[:controller_name] || controller_klass.to_s.demodulize.gsub(/Controller/,'').underscore
- self.model_name = options[:model_name] || controller_klass.to_s.demodulize.gsub(/Controller/,'').singularize
- self.model_instance_name = options[:model_instance_name] || model_name.underscore
- self.model_collection_name = options[:model_collection_name] || model_instance_name.pluralize
- self.model_human_name = options[:model_human_name] || model_instance_name.humanize
-
- possible_namespace = controller_klass.to_s.underscore.split('/')[0]
- self.namespace = options[:namespace] || (possible_namespace =~ /controller/) ? nil : possible_namespace.to_sym
+
+ private
+
+ # Turn a set of options into the full options needed for configuration
+ def populate_model(properties)
+ @controller_class = properties[:controller_class]
+ @controller_name = properties[:controller_name] || @controller_class.to_s.demodulize.gsub(/Controller/,'').underscore
+ @model_name = properties[:model_name] || @controller_class.to_s.demodulize.gsub(/Controller/,'').singularize
+ @model_instance_name = properties[:model_instance_name] || @model_name.underscore
+ @model_collection_name = properties[:model_collection_name] || @model_instance_name.pluralize
+ @model_human_name = properties[:model_human_name] || @model_instance_name.humanize
+ populate_namespace(properties[:namespace])
+ @model_class = @model_name.constantize
+ self
+ end
+
+ def populate_namespace(namespace)
+ if match = @controller_class.to_s.match(/\A(.+)::\w+\z/)
+ modules = match[1]
+ @namespace = modules.underscore unless modules.nil?
+ end
+ @namespace ||= namespace
+ @namespace = @namespace.to_sym unless @namespace.nil?
end
+
end
module Actions
class Action < Qadmin::Configuration::Base
- hash_accessor :multipart_forms, :default => false
- hash_accessor :controls, :default => []
-
+ attr_reader :multipart_forms,
+ :controls,
+ :control_links
+
+ def initialize(options = {})
+ super
+ @multipart_forms = false
+ @controls = []
+ @control_links = {}
+ end
+
end
-
+
class Index < Action
- hash_accessor :columns, :default => []
- hash_accessor :column_headers, :default => {}
- hash_accessor :column_css, :default => {}
- hash_accessor :row_controls, :default => [:show, :edit, :destroy]
- hash_accessor :attribute_handlers, :default => {}
-
+ attr_reader :columns,
+ :column_headers,
+ :column_css,
+ :controls,
+ :row_controls,
+ :attribute_handlers
+
def initialize(options = {})
super
- self.columns = model_column_names
+ @columns = model_column_names
+ @column_headers = {}
+ @column_css = {}
+ @controls = [:new]
+ @row_controls = [:show, :edit, :destroy]
+ @attribute_handlers = {}
end
-
+
end
class Show < Action
+ def initialize(options = {})
+ super
+ @controls = [:index, :new, :edit, :destroy]
+ end
+
end
class New < Action
+ def initialize(options = {})
+ super
+ @controls = [:index]
+ end
+
end
class Edit < Action
+ def initialize(options = {})
+ super
+ @controls = [:index, :new, :show, :destroy]
+ end
+
end
class Create < Action
-
+
end
class Update < Action
@@ -137,32 +163,44 @@ class Update < Action
class Destroy < Action
end
-
+
end
class Resource < Base
-
+
ACTIONS = [:index, :show, :new, :create, :edit, :update, :destroy].freeze
-
- hash_accessor :available_actions, :default => ACTIONS.dup
- hash_accessor :ports, :default => false
-
- hash_accessor :multipart_forms, :default => false
- hash_accessor :controls, :default => []
-
- ACTIONS.each do |action|
- hash_accessor "on_#{action}"
-
- module_eval <<-EOV
- def on_#{action}
- value = self["on_#{action}"] ||= "Qadmin::Configuration::Actions::#{action.to_s.classify}".constantize.new(self.dup.merge(:base => self))
- yield value if block_given?
- value
+
+ attr_accessor :available_actions
+ attr_reader :ports,
+ :multipart_forms,
+ :control_links
+
+ def initialize(options = {})
+ super
+ @available_actions = options[:available_actions] || ACTIONS.dup
+ @ports = false
+ @multipart_forms = false
+ @control_links = {}
+ @actions = {}
+ populate_model(options)
+ end
+
+ def method_missing(method, *args, &block)
+ if match = method.to_s.match(/\Aon\_(\w+)/)
+ action = match[1]
+ if @available_actions.include?(action.to_sym) && (value = @actions[action]).nil?
+ klass = "Qadmin::Configuration::Actions::#{action.to_s.classify}".constantize
+ value = klass.new(:controller_class => @controller_class)
+ @actions[action] = value
end
- EOV
+ yield(value) if block_given?
+ value
+ else
+ super
+ end
end
-
+
end
end
-end
\ No newline at end of file
+end
diff --git a/lib/qadmin/controller.rb b/lib/qadmin/controller.rb
index 1a97c0b..f6f58b0 100644
--- a/lib/qadmin/controller.rb
+++ b/lib/qadmin/controller.rb
@@ -1,31 +1,51 @@
module Qadmin
module Controller
+ ACTION_TEMPLATE_PATH = File.join(File.dirname(__FILE__), 'actions').freeze
+
+ def self.admin_action_template(action_name)
+ if @qadmin_template && @qadmin_template[action_name]
+ @qadmin_template[action_name]
+ else
+ @qadmin_template ||= {}
+ @qadmin_template[action_name] ||= File.read(File.join(ACTION_TEMPLATE_PATH, "#{action_name}.erb"))
+ end
+ end
+
+ module Macros
- module Macros
-
def qadmin(options = {})
- self.cattr_accessor :qadmin_configuration
- self.qadmin_configuration = Qadmin::Configuration::Resource.new({:controller_klass => self}.merge(options))
- self.delegate(:model_name, :model_klass, :model_collection_name, :model_instance_name, :model_human_name, :to => :qadmin_configuration)
+ send(:extend, Forwardable)
+ send(:cattr_accessor, :qadmin_configuration)
+ send(:def_delegators, :qadmin_configuration, :model_name, :model_class, :model_collection_name, :model_instance_name, :model_human_name)
+ self.qadmin_configuration = Qadmin::Configuration::Resource.new(options.merge(:controller_class => self))
yield(self.qadmin_configuration) if block_given?
- include Qadmin::Controller::Helpers
- include Qadmin::Templates
- include Qadmin::Overlay
+ send(:include, Qadmin::Controller::Helpers)
+ send(:include, Qadmin::Templates)
+ send(:include, Qadmin::Overlay)
self.append_view_path(File.join(File.dirname(__FILE__), 'views'))
- define_admin_actions(qadmin_configuration.available_actions, options)
+ define_admin_actions(self.qadmin_configuration.available_actions, options)
end
-
+
private
-
+
def define_admin_actions(actions, options = {})
- action_template_path = File.join(File.dirname(__FILE__), 'actions')
- raw_action_code = actions.collect {|a| File.read(File.join(action_template_path, "#{a}.erb")) }.join("\n")
- action_code = ERB.new(raw_action_code).result(binding)
+ action_code = actions.collect {|a| Qadmin::Controller.admin_action_template(a) }.join("\n")
+ config = self.qadmin_configuration
helper_methods = %{
- delegate :model_name, :model_klass, :model_collection_name, :model_instance_name, :model_human_name, :to => :qadmin_configuration
- helper_method :qadmin_configuration, :model_name, :model_instance_name, :model_collection_name, :model_human_name, :available_actions
+ extend Forwardable
+
+ def_delegators :qadmin_configuration, :model_name, :model_class, :model_collection_name, :model_instance_name, :model_human_name
+ helper_method :qadmin_configuration, :model_name, :model_instance_name, :model_collection_name, :model_human_name, :available_actions, :parent_instance
}
additional_methods = %{
+ def #{config.model_instance_name}_params
+ if params.respond_to?(:permit)
+ params.require(:#{config.model_instance_name}).permit!
+ else
+ params[:#{config.model_instance_name}]
+ end
+ end
+
def add_form
@origin_div = params[:from]
@num = params[:num]
@@ -39,23 +59,26 @@ def add_form
}
end
end
+
+ private
+ def parent_instance
+ instance_variable_get("@\#{qadmin_configuration.parent}")
+ end
}
action_code = helper_methods << action_code << additional_methods
- self.class_eval(action_code)
- end
-
- def config
- self.qadmin_configuration
+ rendered = Erubis::Eruby.new(action_code).result(binding())
+ self.class_eval(rendered, __FILE__, 57)
end
+
end
module Helpers
-
+
def qadmin_configuration
self.class.qadmin_configuration
end
-
+
end
end
-end
\ No newline at end of file
+end
diff --git a/lib/qadmin/form_builder.rb b/lib/qadmin/form_builder.rb
index b761231..79e24a3 100644
--- a/lib/qadmin/form_builder.rb
+++ b/lib/qadmin/form_builder.rb
@@ -1,7 +1,7 @@
module Qadmin
class FormBuilder < ::ActionView::Helpers::FormBuilder
-
- %w{text_field text_area check_box select}.each do |field|
+
+ %w{text_field password_field text_area check_box select}.each do |field|
module_eval <<-EOT
def labeled_#{field}(method, *args)
options = args.last.is_a?(Hash) ? args.pop : {}
@@ -11,11 +11,11 @@ def labeled_#{field}(method, *args)
\#{label(method, label_text)}
\#{#{field}(method, *args)}
- }
+ }.html_safe
end
EOT
end
-
+
def paperclip_file_field(method, options = {})
html = %{}
label_text = options.delete(:label) || method.to_s.humanize
@@ -26,24 +26,52 @@ def paperclip_file_field(method, options = {})
#{object.send("#{method}_file_name")}
}
+ if object.send(method).is_a?(ActiveRecord::Base)
+ html << hidden_field(method, :value => object.send(method).id)
+ end
end
html << %{
#{file_field(method, options)}
}
- html
+ html.html_safe
end
-
+
def text_field_with_hint(method, options = {})
if object.send(method).blank?
options[:class] = if options[:class]
options[:class] << ' hinted'
- else
+ else
'hinted'
end
options[:value] = options.delete(:hint)
end
text_field(method, options)
end
-
+
+ def image_upload_field(method, options = {})
+ html = %{}
+ label_text = options.delete(:label) || method.to_s.humanize
+ html << label(method, label_text)
+ if object.send("#{method}?")
+ html << %{
+ View existing #{label_text}:
+ #{object.send("#{method}_file_name")}
+
+ }
+ if object.send(method).is_a?(ActiveRecord::Base)
+ html << hidden_field(method, :value => object.send(method).id)
+ end
+ end
+ name = "#{object.class.base_class.to_s.underscore}"
+ html << %{
+
+
+
+
+ No File Chosen
+
+
}
+ html.html_safe
+ end
end
-end
\ No newline at end of file
+end
diff --git a/lib/qadmin/helper.rb b/lib/qadmin/helper.rb
index ce0a563..afae12c 100644
--- a/lib/qadmin/helper.rb
+++ b/lib/qadmin/helper.rb
@@ -3,111 +3,120 @@ module Helper
def control_links(more_links = {})
{
- :index => lambda {|params| link_to(image_tag('qadmin/icon_list.png') + " Back to List", params.merge(:action => 'index')) },
- :new => lambda {|params| link_to(image_tag('qadmin/icon_new.png') + " New", params.merge(:action => 'new')) },
- :edit => lambda {|params| link_to(image_tag('qadmin/icon_edit.png') + " Edit", params.merge({:action => 'edit', :id => obj.id})) },
- :show => lambda {|params| link_to(image_tag('qadmin/icon_show.png') + " View", params.merge({:action => 'show', :id => obj.id})) },
- :destroy => lambda {|params| link_to(image_tag('qadmin/icon_destroy.png') + " Delete", params.merge({:action => 'destroy', :id => obj.id}), :confirm => 'Are you sure?', :method => :delete) },
- :ports => lambda {|params| link_to(image_tag('qadmin/icon_export.png') + " Import/Export", params.merge(:action => 'ports')) },
- :export => lambda {|params| link_to(image_tag('qadmin/icon_export.png') + " Export", params.merge(:action => 'export')) },
- :preview => lambda {|params| link_to(image_tag('qadmin/icon_preview.png') + " Preview", params.merge({:action => 'preview', :id => obj.id})) },
- :sort => lambda {|params| link_to(image_tag('qadmin/icon_sort.png') + " Sort", params.merge({:action => 'sort'})) }
- }.merge(more_links || {})
+ :index => lambda {|params, obj| link_to(image_tag('qadmin/icon_list.png') + " Back to List", params.merge(:action => 'index')) },
+ :new => lambda {|params, obj| link_to(image_tag('qadmin/icon_new.png') + " New", params.merge(:action => 'new')) },
+ :edit => lambda {|params, obj| link_to(image_tag('qadmin/icon_edit.png') + " Edit", params.merge({:action => 'edit', :id => obj.id})) },
+ :show => lambda {|params, obj| link_to(image_tag('qadmin/icon_show.png') + " View", params.merge({:action => 'show', :id => obj.id})) },
+ :destroy => lambda {|params, obj| link_to(image_tag('qadmin/icon_destroy.png') + " Delete", params.merge({:action => 'destroy', :id => obj.id}), :data => {:confirm => 'Are you sure?'}, :method => :delete) },
+ :ports => lambda {|params, obj| link_to(image_tag('qadmin/icon_export.png') + " Import/Export", params.merge(:action => 'ports')) },
+ :export => lambda {|params, obj| link_to(image_tag('qadmin/icon_export.png') + " Export", params.merge(:action => 'export')) },
+ :sort => lambda {|params, obj| link_to(image_tag('qadmin/icon_sort.png') + " Sort", params.merge({:action => 'sort'})) }
+ }.merge((more_links || {}).symbolize_keys)
end
def admin_controls(name, options = {}, &block)
return if respond_to?(:overlay?) && overlay?
- controller = params[:controller] || options[:controller] || name.to_s.tableize
assumed_object = self.instance_variable_get "@#{name}"
- logger.debug "= admin_controls: name : #{name}, assumed_object: #{assumed_object.inspect}"
+ controller = params[:controller] || options[:controller] || name.to_s.tableize
obj = options[:object] || assumed_object || nil
- parent = options[:parent] || false
+ if options[:for]
+ action_config = self.qadmin_configuration.send("on_#{options[:for]}")
+ options[:controls] ||= action_config.controls
+ options[:control_links] ||= action_config.control_links
+ options[:parent] ||= (action_config.parent ? instance_variable_get("@#{action_config.parent}") : nil)
+ options[:ports] ||= action_config.base.ports
+ end
+
+ parent = options[:parent] || false
parent_link_params = parent ? {parent.class.to_s.foreign_key => parent.id} : {}
general_link_params = {:controller => controller}.merge(parent_link_params)
- control_sets = {
- :index => [:new],
- :new => [:index],
- :edit => [:index,:new,:show,:destroy],
- :show => [:index,:new,:edit,:destroy]
- }
-
control_set = (options[:controls] || []).dup
- control_set.unshift(control_sets[options[:for]]) if options[:for]
- control_set << :ports if options[:ports]
- controls = [control_set].flatten.collect {|control| control_links(options[:control_links])[control] }.compact
-
- logger.debug 'control_set: ' + control_set.inspect
+ controls = [control_set].flatten.collect {|control| control_links(options[:control_links])[control.to_sym] }.compact
html = ""
+ return html if !controls || controls.empty?
html << %{}
controls.each do |control|
- control_html = control.respond_to?(:call) ? control.call(params) : control
+ control_html = if control.respond_to?(:call)
+ control.call(params, obj)
+ elsif control.is_a?(Hash)
+ icon = if control[:icon]
+ # if the icon starts with / or http its a url not a name
+ image_tag(control[:icon] =~ /^(\/|http)/ ? control[:icon] : "qadmin/icon_#{control[:icon]}.png")
+ else
+ ""
+ end
+ link_params = params.merge(control[:params] || {})
+ link_params[(control[:member] == true ? :id : control[:member])] = obj.id if control[:member]
+ link_to(icon + " " + control[:text], link_params, control[:link_options])
+ else
+ control
+ end
html << li(control_html)
end
if block_given?
html << capture(&block)
html << %{ }
- concat(html)
+ concat(html.html_safe)
else
html << %{}
html
end
+ html.html_safe
end
def sortable_column_header(attribute_name, text = nil, options = {})
link_text = text || self.qadmin_configuration.on_index.column_headers[attribute_name] || attribute_name.to_s.humanize
- return link_text unless qadmin_configuration.model_klass.can_query?
+ return link_text unless qadmin_configuration.model_class.can_query?
query_parser = model_restful_query_parser(options)
- if qadmin_configuration.model_klass.respond_to?(:reflections) and
- association = qadmin_configuration.model_klass.reflections[attribute_name.to_sym]
+ if qadmin_configuration.model_class.respond_to?(:reflections) and
+ association = qadmin_configuration.model_class.reflections[attribute_name.to_sym]
attribute_name = association.association_foreign_key
end
query_param = options[:query_param] || :query
- logger.debug 'params:' + self.params[query_param].inspect
- logger.debug 'parser:' + query_parser.inspect
- attribute_name = "#{qadmin_configuration.model_klass.table_name}.#{attribute_name}"
+ attribute_name = "#{qadmin_configuration.model_class.table_name}.#{attribute_name}"
sorting_this = query_parser.sort(attribute_name)
- logger.debug "sorting #{attribute_name}:" + sorting_this.inspect
link_text << " #{image_tag("qadmin/icon_#{sorting_this.direction.downcase}.gif")}" if sorting_this
query_parser.clear_default_sort!
query_parser.set_sort(attribute_name, sorting_this ? sorting_this.next_direction : 'desc')
- link_to link_text, self.params.dup.merge(query_param => query_parser.to_query_hash, :anchor => (options[:id] || self.qadmin_configuration.model_collection_name)), :class => 'sortable_column_header'
+ link_to link_text.html_safe, self.params.dup.merge(query_param => query_parser.to_query_hash, :anchor => (options[:id] || self.qadmin_configuration.model_collection_name)), :class => 'sortable_column_header'
end
def model_restful_query_parser(options = {})
query_param = options[:query_param] || :query
- qadmin_configuration.model_klass.restful_query_parser(params[query_param], options)
+ qadmin_configuration.model_class.restful_query_parser(params[query_param], options)
end
def row_control_links(more_links = {})
{
- :destroy => lambda { |obj| link_to(image_tag("qadmin/icon_destroy.png"), {:action => 'destroy', :id => obj.id}, :confirm => 'Are you sure?', :method => :delete)},
- :edit => lambda { |obj| link_to(image_tag('qadmin/icon_edit.png'), {:action => 'edit', :id => obj.id}) },
- :show => lambda { |obj| link_to(image_tag('qadmin/icon_show.png'), {:action => 'show', :id => obj.id}) },
- :preview => lambda { |obj| link_to(image_tag('qadmin/icon_preview.png'), {:action => 'preview', :id => obj.id}) }
+ :destroy => lambda { |params, obj| link_to(image_tag("qadmin/icon_destroy.png"), params.merge({:action => 'destroy', :id => obj.id}), :data => {:confirm => 'Are you sure?'}, :method => :delete)},
+ :edit => lambda { |params, obj| link_to(image_tag('qadmin/icon_edit.png'), params.merge({:action => 'edit', :id => obj.id})) },
+ :show => lambda { |params, obj| link_to(image_tag('qadmin/icon_show.png'), params.merge({:action => 'show', :id => obj.id})) },
}.merge(more_links || {})
end
def admin_table(collection, options = {})
- config = self.qadmin_configuration.on_index
-
- controller = params[:controller] || options[:controller] || config.controller_name
- attributes = options[:attributes] || config.columns
-
- logger.debug "columns: #{attributes.inspect}"
-
-
+ config = self.qadmin_configuration.on_index || {}
+
+ controller = options[:controller] || params[:controller] || config.controller_name
+ attributes = options[:attributes] || options[:columns] || config.columns
+ parent = options[:parent] || false
+
+ parent_link_params = parent ? {parent.class.to_s.foreign_key => parent.id} : {}
+ general_link_params = {:controller => controller}.merge(parent_link_params)
+
row_control_sets = {
:index => [:show,:edit,:destroy]
}
row_control_set = (options[:row_controls] || config.row_controls).dup
- row_control_set.unshift(row_control_sets[options[:for]]) if options[:for]
- row_controls = [row_control_set].flatten.collect{|c| row_control_links(options[:row_control_links])[c] }.compact
+ row_control_set.unshift(row_control_sets[options[:for]]) if row_control_set.empty? && options[:for]
+ row_control_set = [row_control_set].flatten
+ row_controls = row_control_set.collect{|c| row_control_links(options[:row_control_links])[c] }.compact
- logger.debug 'row_control_set: ' + row_control_set.inspect
+ logger.debug "row_controls: #{row_controls.inspect}"
attribute_handlers = HashWithIndifferentAccess.new({
:string => lambda {|h, v, i, c|
@@ -116,32 +125,33 @@ def admin_table(collection, options = {})
:boolean => lambda {|h, v, i, c| yes?(v) },
:false_class => lambda {|h, v, i, c| 'No' },
:true_class => lambda {|h, v, i, c| 'Yes' },
- :text => lambda {|h, v, i, c|
- h.truncate(v, :length => 30, :omission => "... #{h.link_to('More', h.send("#{qadmin_configuration.path_prefix}_path", i))}")
+ :text => lambda {|h, v, i, c|
+ h.truncate(v, :length => 30, :omission => "... #{h.link_to('More', h.send("#{qadmin_configuration.path_prefix}_path", i))}")
},
:reflection => lambda {|h, v, i, c| h.link_to(v.to_s, v) },
:hash => lambda {|h, v, i, c| v.inspect },
- :array => lambda {|h, v, i, c| v.inspect }
+ :array => lambda {|h, v, i, c| v.inspect },
+ :datetime => lambda {|h, v, i, c| v.in_time_zone("Eastern Time (US & Canada)") }
})
attribute_handlers.merge!(options[:attribute_handlers] || config.attribute_handlers)
- logger.debug "attribute_handlers #{attribute_handlers.inspect}"
+
model_column_types = HashWithIndifferentAccess.new
attributes.each do |attribute_name|
- if column = config.model_klass.columns.detect {|c| c.name.to_s == attribute_name.to_s }
- if serialized_klass = config.model_klass.serialized_attributes[attribute_name]
- column = serialized_klass.to_s.downcase.to_sym
+ if column = config.model_class.columns.detect {|c| c.name.to_s == attribute_name.to_s }
+ if serialized_class = config.model_class.serialized_attributes[attribute_name]
+ column = serialized_class.to_s.downcase.to_sym
else
column = column.type
end
- elsif !column && reflection = config.model_klass.reflections[attribute_name] && respond_to?("#{attribute_name}_path")
+ elsif !column && reflection = config.model_class.reflections[attribute_name] && respond_to?("#{attribute_name}_path")
column = :reflection
end
model_column_types[attribute_name] = column if column
end
html = ""
- html << ''
+ html << ''
attributes.each_with_index do |attribute, i|
css = (config.column_css[attribute] ? config.column_css[attribute] : (i == 0 ? 'first_col' : ''))
html << %{}
@@ -153,29 +163,41 @@ def admin_table(collection, options = {})
end
html << ' '
collection.each do |instance|
+ next if !instance
html << %{}
attributes.each_with_index do |attribute, i|
- raw_value = instance.send(attribute)
- handler = attribute_handlers[model_column_types[attribute] || raw_value.class.to_s.demodulize.underscore]
- value = if handler
- handler.call(self, raw_value, instance, config)
- else
- if i == 0
- link_to(raw_value, send("#{qadmin_configuration.path_prefix}_path", instance))
+ begin
+ raw_value = instance.send(attribute)
+ handler = attribute_handlers[attribute]
+ handler ||= attribute_handlers[model_column_types[attribute] || raw_value.class.to_s.demodulize.underscore]
+ value = if handler
+ handler.call(self, raw_value, instance, config)
else
- h(raw_value)
+ if i == 0
+ link_to(raw_value, send("#{qadmin_configuration.path_prefix}_path", instance))
+ else
+ h(raw_value)
+ end
end
+ rescue => e
+ logger.warn e
+ value = ""
end
css = (config.column_css[attribute] ? config.column_css[attribute] : (i == 0 ? 'first_col' : ''))
html << %{#{value} }
end
row_controls.each do |row_control|
- row_control_html = row_control.respond_to?(:call) ? row_control.call(instance) : row_control
+ row_control_html = row_control.respond_to?(:call) ? row_control.call(general_link_params, instance) : row_control
html << td(row_control_html)
end
html << ' '
end
html << '
'
+ html.html_safe
+ end
+
+ def admin_pagination(collection)
+ render(partial_for_section('pagination'), :collection => collection).html_safe
end
def alt_rows
@@ -196,13 +218,14 @@ def td(content, *args)
def simple_admin_menu(*controllers)
html = %{}
+ }
+ simple_menu(*controllers) do |name,controller|
+ li(link_to(name, :controller => controller))
+ end
+ html << %{
+
+ }
+ html.html_safe
end
def simple_menu(*controllers, &block)
@@ -216,7 +239,7 @@ def simple_menu(*controllers, &block)
end
html << yield(name.to_s,controller)
end
- html
+ html.html_safe
end
def like_current_page?(options)
@@ -242,11 +265,26 @@ def fieldset(legend = nil, options = {}, &block)
def labeled_show_column(object, method, options = {})
html = %{}
html << label(object, method, options[:label] || nil)
- show_value = options.has_key?(:value) ? options[:value] : object.send(method)
- show_value = 'blank ' if show_value.blank?
+ raw_value = options.has_key?(:value) ? options[:value] : object.send(method)
+ show_value = if raw_value.blank? && raw_value != false
+ 'blank '
+ elsif raw_value.is_a?(Array) || raw_value.is_a?(Hash)
+ h(raw_value.inspect)
+ elsif with_value = options.delete(:with_value) and with_value.is_a?(Proc)
+ h(with_value.call(raw_value))
+ elsif raw_value.is_a?(ActiveRecord::Base)
+ link = if options[:path_helper]
+ send options[:path_helper], raw_value
+ else
+ [options[:namespace], raw_value].compact
+ end
+ link_to(h(raw_value.to_s), link)
+ else
+ raw_value
+ end
html << %{#{show_value} }
html << %{
}
- html
+ html.html_safe
end
def labeled_show_paperclip_attachment(object, method, options = {})
@@ -264,4 +302,6 @@ def labeled_show_paperclip_attachment(object, method, options = {})
labeled_show_column(object, method, options.merge(:value => value))
end
end
-end
\ No newline at end of file
+
+
+end
diff --git a/lib/qadmin/railtie.rb b/lib/qadmin/railtie.rb
new file mode 100644
index 0000000..85bf405
--- /dev/null
+++ b/lib/qadmin/railtie.rb
@@ -0,0 +1,6 @@
+require 'qadmin'
+require 'qadmin/form_builder'
+
+ActionController::Base.send(:extend, Qadmin::Controller::Macros)
+ActionView::Base.send(:include, Qadmin::Helper)
+ActionView::Base.default_form_builder = Qadmin::FormBuilder
diff --git a/lib/qadmin/templates.rb b/lib/qadmin/templates.rb
index a9df3eb..a8dd3a5 100644
--- a/lib/qadmin/templates.rb
+++ b/lib/qadmin/templates.rb
@@ -2,17 +2,18 @@ module Qadmin
module Templates
def self.included(klass)
- if klass.respond_to?(:helper_method)
+ if klass.respond_to?(:helper_method)
klass.module_eval do
helper_method :template_for_section, :partial_for_section
end
end
end
- protected
+ protected
def render_template_for_section(action = nil, options = {})
action ||= action_name
- render template_for_section(action), options
+ rendered = render(template_for_section(action), options)
+ rendered.is_a?(Array) ? rendered.collect {|r| r.html_safe } : r.html_safe
end
def template_for_section(template_name, file_name = nil, options = {})
@@ -40,14 +41,16 @@ def default_section_template(template_name, options = {})
def current_section_name(options = {})
options[:section_name] ? options[:section_name] : (@section ? @section.name : controller_path)
end
-
- def template_exists?(template_path)
- logger.info "Checking for template: #{template_path}"
- self.view_paths.find_template(template_path)
- rescue ActionView::MissingTemplate
- logger.info "Template not found: #{template_path}"
- false
+
+ if !defined?(:template_exists?)
+ def template_exists?(template_path)
+ logger.debug "Checking for template: #{template_path}"
+ self.view_paths.find_template(template_path)
+ rescue ActionView::MissingTemplate
+ logger.debug "Template not found: #{template_path}"
+ false
+ end
end
end
-end
\ No newline at end of file
+end
diff --git a/lib/qadmin/views/default/_pagination.html.erb b/lib/qadmin/views/default/_pagination.html.erb
new file mode 100644
index 0000000..355115b
--- /dev/null
+++ b/lib/qadmin/views/default/_pagination.html.erb
@@ -0,0 +1,14 @@
+
+
+
<%= collection.total_entries %> Total
+ <% form_tag request.path, :method => :get do %>
+
Page: <%= text_field_tag "page", params[:page] || 1, :size => 4, :autocomplete => 'off' %>
+
+
Per Page: <%= select_tag "per_page", options_for_select(%w{5 10 25 50 100}, "#{params[:per_page] || 25}") %>
+
+
<%= submit_tag 'go', :name => nil %>
+ <% end %>
+
+ <%= will_paginate(collection) %>
+
+
diff --git a/lib/qadmin/views/default/edit.html.erb b/lib/qadmin/views/default/edit.html.erb
index 4406c88..2874b05 100644
--- a/lib/qadmin/views/default/edit.html.erb
+++ b/lib/qadmin/views/default/edit.html.erb
@@ -1,6 +1,6 @@
<%= model_human_name %>: Edit
-<%= admin_controls model_instance_name, :for => :edit, :controls => qadmin_configuration.on_edit.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_index.parent}") %>
+<%= admin_controls model_instance_name, :for => :edit %>
<%= error_messages_for model_instance_name %>
@@ -9,4 +9,4 @@
<%= f.submit "Update" %>
<% end %>
-<%= admin_controls model_instance_name, :for => :edit, :controls => qadmin_configuration.on_edit.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_index.parent}") %>
+<%= admin_controls model_instance_name, :for => :edit %>
diff --git a/lib/qadmin/views/default/index.html.erb b/lib/qadmin/views/default/index.html.erb
index 6f0eac7..bee6f94 100644
--- a/lib/qadmin/views/default/index.html.erb
+++ b/lib/qadmin/views/default/index.html.erb
@@ -1,17 +1,9 @@
-<%= model_human_name.pluralize %>
+<%= qadmin_configuration.parent ? "#{parent_instance}: " : '' %><%= model_human_name.pluralize %>
-<%= admin_controls model_instance_name, :for => :index, :ports => qadmin_configuration.ports, :controls => qadmin_configuration.on_index.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_index.parent}") %>
+<%= admin_controls model_instance_name, :for => :index %>
-
-
- <%= will_paginate(@model_collection) %>
-
-<%= admin_table(@model_collection, :for => :index) %>
-<%= will_paginate(@model_collection) %>
+<%= admin_pagination(@model_collection) %>
+<%= admin_table(@model_collection, :for => :index, :row_controls => qadmin_configuration.on_index.row_controls) %>
+<%= admin_pagination(@model_collection) %>
-<%= admin_controls model_instance_name, :for => :index, :ports => qadmin_configuration.ports, :controls => qadmin_configuration.on_index.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_index.parent}") %>
+<%= admin_controls model_instance_name, :for => :index %>
diff --git a/lib/qadmin/views/default/new.html.erb b/lib/qadmin/views/default/new.html.erb
index dad73f9..f2913bc 100644
--- a/lib/qadmin/views/default/new.html.erb
+++ b/lib/qadmin/views/default/new.html.erb
@@ -1,6 +1,6 @@
<%= model_human_name %>: New
-<%= admin_controls model_instance_name, :for => :new, :controls => qadmin_configuration.on_new.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_new.parent}") %>
+<%= admin_controls model_instance_name, :for => :new %>
<%= error_messages_for model_instance_name %>
@@ -9,4 +9,4 @@
<%= f.submit "Create" %>
<% end %>
-<%= admin_controls model_instance_name, :for => :new, :controls => qadmin_configuration.on_new.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_new.parent}") %>
+<%= admin_controls model_instance_name, :for => :new %>
diff --git a/lib/qadmin/views/default/show.html.erb b/lib/qadmin/views/default/show.html.erb
index f0f60a7..118c629 100644
--- a/lib/qadmin/views/default/show.html.erb
+++ b/lib/qadmin/views/default/show.html.erb
@@ -1,13 +1,14 @@
<%= model_human_name.pluralize %>: <%= @model_instance.to_s %>
-<%= admin_controls model_instance_name, :for => :show, :object => @model_instance, :controls => qadmin_configuration.on_show.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_show.parent}") %>
+<%= admin_controls model_instance_name, :for => :show %>
- <%=
+ <%=
begin
- render model_instance_name, :object => @model_instance
+ render model_instance_name, :object => @model_instance
rescue ActionView::MissingTemplate, Errno::ENOENT => e
logger.warn e
- render 'default/instance', :object => @model_instance
+ render 'default/instance', :object => @model_instance
end
%>
-<%= admin_controls model_instance_name, :for => :show, :object => @model_instance, :controls => qadmin_configuration.on_show.controls, :parent => instance_variable_get("@#{qadmin_configuration.on_show.parent}") %>
\ No newline at end of file
+
+<%= admin_controls model_instance_name, :for => :show %>
diff --git a/qadmin.gemspec b/qadmin.gemspec
index 99359b6..ef8015d 100644
--- a/qadmin.gemspec
+++ b/qadmin.gemspec
@@ -1,106 +1,97 @@
# Generated by jeweler
# DO NOT EDIT THIS FILE DIRECTLY
-# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
+# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
# -*- encoding: utf-8 -*-
Gem::Specification.new do |s|
- s.name = %q{qadmin}
+ s.name = "qadmin"
s.version = "0.2.3"
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Aaron Quint"]
- s.date = %q{2009-10-27}
- s.description = %q{An [almost] one command solution for adding admin interfaces/resources to a Rails app.}
+ s.date = "2009-04-07"
+ s.description = "An [almost] one command solution for adding admin interfaces/resources to a Rails app."
s.email = ["aaron@quirkey.com"]
s.extra_rdoc_files = [
"LICENSE",
- "README.rdoc"
+ "README.rdoc"
]
s.files = [
- ".gitignore",
- "History.txt",
- "LICENSE",
- "PostInstall.txt",
- "README.rdoc",
- "Rakefile",
- "init.rb",
- "lib/qadmin.rb",
- "lib/qadmin/actions/create.erb",
- "lib/qadmin/actions/destroy.erb",
- "lib/qadmin/actions/edit.erb",
- "lib/qadmin/actions/index.erb",
- "lib/qadmin/actions/new.erb",
- "lib/qadmin/actions/show.erb",
- "lib/qadmin/actions/update.erb",
- "lib/qadmin/configuration.rb",
- "lib/qadmin/controller.rb",
- "lib/qadmin/form_builder.rb",
- "lib/qadmin/helper.rb",
- "lib/qadmin/overlay.rb",
- "lib/qadmin/page_titles.rb",
- "lib/qadmin/templates.rb",
- "lib/qadmin/views/default/edit.html.erb",
- "lib/qadmin/views/default/index.html.erb",
- "lib/qadmin/views/default/new.html.erb",
- "lib/qadmin/views/default/show.html.erb",
- "qadmin.gemspec",
- "rails/init.rb",
- "rails_generators/qadmin/USAGE",
- "rails_generators/qadmin/qadmin_generator.rb",
- "rails_generators/qadmin/templates/_form.html.erb",
- "rails_generators/qadmin/templates/_instance.html.erb",
- "rails_generators/qadmin/templates/controller.rb",
- "rails_generators/qadmin/templates/functional_test.rb",
- "rails_generators/qadmin/templates/images/icon_asc.gif",
- "rails_generators/qadmin/templates/images/icon_desc.gif",
- "rails_generators/qadmin/templates/images/icon_destroy.png",
- "rails_generators/qadmin/templates/images/icon_edit.png",
- "rails_generators/qadmin/templates/images/icon_export.png",
- "rails_generators/qadmin/templates/images/icon_find.png",
- "rails_generators/qadmin/templates/images/icon_import.png",
- "rails_generators/qadmin/templates/images/icon_list.png",
- "rails_generators/qadmin/templates/images/icon_new.png",
- "rails_generators/qadmin/templates/images/icon_next.gif",
- "rails_generators/qadmin/templates/images/icon_prev.gif",
- "rails_generators/qadmin/templates/images/icon_show.png",
- "rails_generators/qadmin/templates/images/icon_sort.png",
- "rails_generators/qadmin/templates/images/indicator_medium.gif",
- "rails_generators/qadmin/templates/layout.html.erb",
- "rails_generators/qadmin/templates/style.css",
- "script/console",
- "script/destroy",
- "script/generate",
- "script/txt2html",
- "test/test_generator_helper.rb",
- "test/test_helper.rb",
- "test/test_qadmin_configuration.rb",
- "test/test_qadmin_controller.rb",
- "test/test_qadmin_generator.rb"
- ]
- s.homepage = %q{http://github.com/quirkey/qadmin}
- s.post_install_message = %q{PostInstall.txt}
- s.rdoc_options = ["--charset=UTF-8"]
- s.require_paths = ["lib"]
- s.rubyforge_project = %q{quirkey}
- s.rubygems_version = %q{1.3.5}
- s.summary = %q{An [almost] one command solution for adding admin interfaces/resources to a Rails app.}
- s.test_files = [
+ "History.txt",
+ "LICENSE",
+ "PostInstall.txt",
+ "README.rdoc",
+ "Rakefile",
+ "init.rb",
+ "lib/qadmin.rb",
+ "lib/qadmin/actions/create.erb",
+ "lib/qadmin/actions/destroy.erb",
+ "lib/qadmin/actions/edit.erb",
+ "lib/qadmin/actions/index.erb",
+ "lib/qadmin/actions/new.erb",
+ "lib/qadmin/actions/show.erb",
+ "lib/qadmin/actions/update.erb",
+ "lib/qadmin/configuration.rb",
+ "lib/qadmin/controller.rb",
+ "lib/qadmin/form_builder.rb",
+ "lib/qadmin/helper.rb",
+ "lib/qadmin/overlay.rb",
+ "lib/qadmin/page_titles.rb",
+ "lib/qadmin/templates.rb",
+ "lib/qadmin/views/default/_instance.html.erb",
+ "lib/qadmin/views/default/_pagination.html.erb",
+ "lib/qadmin/views/default/edit.html.erb",
+ "lib/qadmin/views/default/index.html.erb",
+ "lib/qadmin/views/default/new.html.erb",
+ "lib/qadmin/views/default/show.html.erb",
+ "qadmin.gemspec",
+ "rails/init.rb",
+ "rails_generators/qadmin/USAGE",
+ "rails_generators/qadmin/qadmin_generator.rb",
+ "rails_generators/qadmin/templates/_form.html.erb",
+ "rails_generators/qadmin/templates/_instance.html.erb",
+ "rails_generators/qadmin/templates/controller.rb",
+ "rails_generators/qadmin/templates/functional_test.rb",
+ "rails_generators/qadmin/templates/images/icon_asc.gif",
+ "rails_generators/qadmin/templates/images/icon_desc.gif",
+ "rails_generators/qadmin/templates/images/icon_destroy.png",
+ "rails_generators/qadmin/templates/images/icon_edit.png",
+ "rails_generators/qadmin/templates/images/icon_export.png",
+ "rails_generators/qadmin/templates/images/icon_find.png",
+ "rails_generators/qadmin/templates/images/icon_import.png",
+ "rails_generators/qadmin/templates/images/icon_list.png",
+ "rails_generators/qadmin/templates/images/icon_new.png",
+ "rails_generators/qadmin/templates/images/icon_next.gif",
+ "rails_generators/qadmin/templates/images/icon_prev.gif",
+ "rails_generators/qadmin/templates/images/icon_show.png",
+ "rails_generators/qadmin/templates/images/icon_sort.png",
+ "rails_generators/qadmin/templates/images/indicator_medium.gif",
+ "rails_generators/qadmin/templates/layout.html.erb",
+ "rails_generators/qadmin/templates/style.css",
"test/test_generator_helper.rb",
- "test/test_helper.rb",
- "test/test_qadmin_configuration.rb",
- "test/test_qadmin_controller.rb",
- "test/test_qadmin_generator.rb"
+ "test/test_helper.rb",
+ "test/test_qadmin_configuration.rb",
+ "test/test_qadmin_controller.rb",
+ "test/test_qadmin_generator.rb"
]
+ s.homepage = "http://github.com/quirkey/qadmin"
+ s.post_install_message = "PostInstall.txt"
+ s.require_paths = ["lib"]
+ s.rubyforge_project = "quirkey"
+ s.rubygems_version = "1.8.23"
+ s.summary = "An [almost] one command solution for adding admin interfaces/resources to a Rails app."
if s.respond_to? :specification_version then
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
s.specification_version = 3
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
- s.add_runtime_dependency(%q, [">= 2.3.2", "< 3"])
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
+ s.add_runtime_dependency(%q, [">= 2.3.2"])
+ s.add_runtime_dependency(%q, ["~> 2.7", ">= 2.7.0"])
s.add_runtime_dependency(%q, [">= 1.0"])
- s.add_runtime_dependency(%q, [">= 2.3.7", "< 3"])
+ s.add_runtime_dependency(%q, [">= 2.3.7"])
s.add_runtime_dependency(%q, [">= 0.2.0"])
+ s.add_development_dependency(%q, ["~>1.0", ">= 1.0.2"])
+ s.add_development_dependency(%q, ["~> 5.5", ">= 5.5.0"])
s.add_development_dependency(%q, ["~> 1.1", ">= 1.1.0"])
s.add_development_dependency(%q, ["~>10.4", ">= 10.4.2"])
s.add_development_dependency(%q, [">= 2.3.2", "< 3"])
@@ -108,7 +99,10 @@ Gem::Specification.new do |s|
s.add_development_dependency(%q, [">= 1.2.0"])
else
s.add_dependency(%q, [">= 2.3.2", "< 3"])
+ s.add_dependency(%q, ["~>1.0", ">= 1.0.2"])
+ s.add_dependency(%q, ["~> 2.7", ">= 2.7.0"])
s.add_dependency(%q, [">= 1.0"])
+ s.add_dependency(%q, ["~> 5.5", ">= 5.5.0"])
s.add_dependency(%q, ["~> 1.1", ">= 1.1.0"])
s.add_dependency(%q, ["~>10.4", ">= 10.4.2"])
s.add_dependency(%q, [">= 2.3.2", "< 3"])
@@ -119,7 +113,10 @@ Gem::Specification.new do |s|
end
else
s.add_dependency(%q, [">= 2.3.2", "< 3"])
+ s.add_dependency(%q, ["~>1.0", ">= 1.0.2"])
+ s.add_dependency(%q, ["~> 2.7", ">= 2.7.0"])
s.add_dependency(%q, [">= 1.0"])
+ s.add_dependency(%q, ["~> 5.5", ">= 5.5.0"])
s.add_dependency(%q, ["~> 1.1", ">= 1.1.0"])
s.add_dependency(%q, ["~>10.4", ">= 10.4.2"])
s.add_dependency(%q, [">= 2.3.2", "< 3"])
diff --git a/rails/init.rb b/rails/init.rb
index f81b424..5a1cdcc 100644
--- a/rails/init.rb
+++ b/rails/init.rb
@@ -1,5 +1 @@
-require File.join(File.dirname(__FILE__), '..', 'lib', 'qadmin')
-
-ActionController::Base.send(:extend, Qadmin::Controller::Macros)
-ActionView::Base.send(:include, Qadmin::Helper)
-ActionView::Base.default_form_builder = Qadmin::FormBuilder
\ No newline at end of file
+require 'qadmin/railtie'
diff --git a/test/qadmin_configuration_test.rb b/test/configuration_test.rb
similarity index 59%
rename from test/qadmin_configuration_test.rb
rename to test/configuration_test.rb
index c72d5ea..094e2c6 100644
--- a/test/qadmin_configuration_test.rb
+++ b/test/configuration_test.rb
@@ -1,48 +1,61 @@
require "helper"
-class TestQadminConfiguration < Test::Unit::TestCase
+class Qadmin::ConfigurationTest < Minitest::Test
context "Configuring a Resource" do
- setup do
- @configuration = Qadmin::Configuration::Resource.new(:controller_klass => ThingsController)
- end
- context "initializing" do
- should "extrapolate the model klass names" do
+ context "root namespace" do
+
+ setup do
+ class ::Thing
+ end
+ @configuration = Qadmin::Configuration::Resource.new(:controller_class => ThingsController)
+ end
+
+ should "extrapolate the model info" do
assert_nil @configuration.namespace
assert_equal "Thing", @configuration.model_name
assert_equal "Thing", @configuration.model_human_name
assert_equal "things", @configuration.model_collection_name
end
+ should "have no namespace" do
+ assert_equal 'thing', @configuration.path_prefix
+ assert_equal 'thing', @configuration.on_create.path_prefix
+ end
+
should "create special config objects for each action" do
@configuration.available_actions.each do |action|
assert_equal "Qadmin::Configuration::Actions::#{action.to_s.classify}", @configuration.send("on_#{action}").class.to_s
end
end
- should "extract the namespace from a namespaced controller" do
- @configuration = Qadmin::Configuration::Resource.new(:controller_klass => Admin::ItemsController)
+ end
+
+ context "admin namespace" do
+
+ setup do
+ module ::Admin
+ class Item
+ end
+ end
+ @configuration = Qadmin::Configuration::Resource.new(:controller_class => ::Admin::ItemsController)
+ end
+
+ should "populate the model info" do
assert_equal :admin, @configuration.namespace
assert_equal "Item", @configuration.model_name
assert_equal "Item", @configuration.model_human_name
assert_equal "items", @configuration.model_collection_name
end
- end
-
- context "path_prefix" do
- should "include namespace if set" do
- @configuration.namespace = :admin
- assert_equal 'admin_thing', @configuration.path_prefix
- assert_equal 'admin_thing', @configuration.on_create.path_prefix
+ should "include path prefix" do
+ assert_equal 'admin_item', @configuration.path_prefix
+ assert_equal 'admin_item', @configuration.on_create.path_prefix
end
- should "not include nil namespace" do
- assert_equal 'thing', @configuration.path_prefix
- assert_equal 'thing', @configuration.on_create.path_prefix
- end
end
+
end
end
diff --git a/test/qadmin_controller_test.rb b/test/controller_test.rb
similarity index 90%
rename from test/qadmin_controller_test.rb
rename to test/controller_test.rb
index 8fe28c5..d560d91 100644
--- a/test/qadmin_controller_test.rb
+++ b/test/controller_test.rb
@@ -1,6 +1,6 @@
require "helper"
-class TestQadminController < Test::Unit::TestCase
+class Qadmin::ControllerTest < Minitest::Test
protected
def crud_actions
@@ -59,13 +59,15 @@ class NoOptionsController < MockController
context "with two instances in different controllers" do
setup do
class ::NewExclude < ActiveRecord::Base; end
- class NewExcludeController < MockController
+ class ::NewExcludeController < MockController
qadmin do |config|
config.available_actions = config.available_actions - [:show, :new]
end
end
@exclude_controller = NewExcludeController.new
- class NewOnlyController < MockController
+ class ::NewOnly
+ end
+ class ::NewOnlyController < MockController
qadmin :model_name => 'Item', :available_actions => [:index, :show]
end
@only_controller = NewOnlyController.new
diff --git a/test/qadmin_generator_test.rb b/test/generator_test.rb
similarity index 97%
rename from test/qadmin_generator_test.rb
rename to test/generator_test.rb
index ac4b4f5..c3c883a 100644
--- a/test/qadmin_generator_test.rb
+++ b/test/generator_test.rb
@@ -1,7 +1,7 @@
require "generator_helper"
require "rails_generator"
-class TestQadminGenerator < Test::Unit::TestCase
+class Qadmin::GeneratorTest < Minitest::Test
include RubiGen::GeneratorTestHelper
def setup
diff --git a/test/helper.rb b/test/helper.rb
index 0709288..1fef02c 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -1,6 +1,6 @@
require 'rubygems'
require 'stringio'
-require 'test/unit'
+require 'minitest/autorun'
require 'mocha'
require 'shoulda'
@@ -12,15 +12,15 @@ module ActiveRecord
class Base
class << self
attr_accessor :pluralize_table_names
-
+
def protected_attributes
[]
end
-
+
def column_names
['id'] #content_columns.collect {|c| c.name }
end
-
+
end
self.pluralize_table_names = true
end
@@ -39,7 +39,7 @@ def initialize(name, type)
def human_name
name.to_s.humanize
end
-
+
def default
nil
end
@@ -63,7 +63,7 @@ def content_columns
MockColumn.new(name, type)
end
end
-
+
def column_names
[] #content_columns.collect {|c| c.name }
end
@@ -74,11 +74,11 @@ class MockController
class << self
def append_view_path(paths)
end
-
+
def helper_method(*args)
end
end
-
+
extend Qadmin::Controller::Macros
end
@@ -86,4 +86,4 @@ module Admin
class ItemsController < MockController; end
end
-class ThingsController < MockController; end
\ No newline at end of file
+class ThingsController < MockController; end