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 << %{' 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 << %{} 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 << '
} @@ -153,29 +163,41 @@ def admin_table(collection, options = {}) end html << '
#{value}
' + 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 %> +
<%= text_field_tag "page", params[:page] || 1, :size => 4, :autocomplete => 'off' %>
+   +
<%= 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