ryana-sortable_table 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
 - data/README.textile +86 -0
 - data/Rakefile +31 -0
 - data/VERSION.yml +4 -0
 - data/lib/sortable_table.rb +3 -0
 - data/lib/sortable_table/app/controllers/application_controller.rb +46 -0
 - data/lib/sortable_table/app/helpers/application_helper.rb +69 -0
 - data/lib/sortable_table/test/test_helper.rb +50 -0
 - data/rails/init.rb +1 -0
 - data/test/rails_root/Rakefile +10 -0
 - data/test/rails_root/app/controllers/application.rb +5 -0
 - data/test/rails_root/app/controllers/users_controller.rb +9 -0
 - data/test/rails_root/app/helpers/application_helper.rb +3 -0
 - data/test/rails_root/app/helpers/users_helper.rb +2 -0
 - data/test/rails_root/app/models/user.rb +2 -0
 - data/test/rails_root/app/views/layouts/users.html.erb +17 -0
 - data/test/rails_root/app/views/users/index.html.erb +19 -0
 - data/test/rails_root/config/boot.rb +109 -0
 - data/test/rails_root/config/database.yml +19 -0
 - data/test/rails_root/config/environment.rb +26 -0
 - data/test/rails_root/config/environments/development.rb +17 -0
 - data/test/rails_root/config/environments/test.rb +28 -0
 - data/test/rails_root/config/initializers/new_rails_defaults.rb +15 -0
 - data/test/rails_root/config/initializers/sortable_table.rb +8 -0
 - data/test/rails_root/config/routes.rb +6 -0
 - data/test/rails_root/db/development.sqlite3 +0 -0
 - data/test/rails_root/db/migrate/20080819225020_create_users.rb +15 -0
 - data/test/rails_root/db/production.sqlite3 +0 -0
 - data/test/rails_root/db/schema.rb +23 -0
 - data/test/rails_root/db/test.sqlite3 +0 -0
 - data/test/rails_root/log/development.log +2710 -0
 - data/test/rails_root/log/production.log +0 -0
 - data/test/rails_root/log/server.log +0 -0
 - data/test/rails_root/log/test.log +764 -0
 - data/test/rails_root/public/404.html +30 -0
 - data/test/rails_root/public/422.html +30 -0
 - data/test/rails_root/public/500.html +30 -0
 - data/test/rails_root/public/dispatch.cgi +10 -0
 - data/test/rails_root/public/dispatch.fcgi +24 -0
 - data/test/rails_root/public/dispatch.rb +10 -0
 - data/test/rails_root/public/favicon.ico +0 -0
 - data/test/rails_root/public/images/rails.png +0 -0
 - data/test/rails_root/public/images/sort-ascending-arrow.gif +0 -0
 - data/test/rails_root/public/images/sort-descending-arrow.gif +0 -0
 - data/test/rails_root/public/index.html +274 -0
 - data/test/rails_root/public/javascripts/application.js +2 -0
 - data/test/rails_root/public/javascripts/controls.js +963 -0
 - data/test/rails_root/public/javascripts/dragdrop.js +972 -0
 - data/test/rails_root/public/javascripts/effects.js +1120 -0
 - data/test/rails_root/public/javascripts/prototype.js +4225 -0
 - data/test/rails_root/public/robots.txt +5 -0
 - data/test/rails_root/public/stylesheets/scaffold.css +53 -0
 - data/test/rails_root/public/stylesheets/sortable.css +10 -0
 - data/test/rails_root/script/about +3 -0
 - data/test/rails_root/script/console +3 -0
 - data/test/rails_root/script/dbconsole +3 -0
 - data/test/rails_root/script/destroy +3 -0
 - data/test/rails_root/script/generate +3 -0
 - data/test/rails_root/script/performance/benchmarker +3 -0
 - data/test/rails_root/script/performance/profiler +3 -0
 - data/test/rails_root/script/performance/request +3 -0
 - data/test/rails_root/script/plugin +3 -0
 - data/test/rails_root/script/process/inspector +3 -0
 - data/test/rails_root/script/process/reaper +3 -0
 - data/test/rails_root/script/process/spawner +3 -0
 - data/test/rails_root/script/runner +3 -0
 - data/test/rails_root/script/server +3 -0
 - data/test/rails_root/test/factories/user_factory.rb +17 -0
 - data/test/rails_root/test/functional/users_controller_test.rb +15 -0
 - data/test/rails_root/test/helper_testcase.rb +38 -0
 - data/test/rails_root/test/test_helper.rb +22 -0
 - data/test/rails_root/test/unit/helpers/application_helper_test.rb +53 -0
 - data/test/rails_root/vendor/plugins/helper_test/MIT-LICENSE +20 -0
 - data/test/rails_root/vendor/plugins/helper_test/README +33 -0
 - data/test/rails_root/vendor/plugins/helper_test/about.yml +7 -0
 - data/test/rails_root/vendor/plugins/helper_test/generators/helper_test/helper_test_generator.rb +22 -0
 - data/test/rails_root/vendor/plugins/helper_test/generators/helper_test/templates/helper_test.rb +13 -0
 - data/test/rails_root/vendor/plugins/helper_test/generators/helper_test/templates/helper_testcase.rb +38 -0
 - metadata +176 -0
 
    
        data/MIT-LICENSE
    ADDED
    
    | 
         @@ -0,0 +1,20 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Copyright (c) 2008 Dan Croak
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Permission is hereby granted, free of charge, to any person obtaining
         
     | 
| 
      
 4 
     | 
    
         
            +
            a copy of this software and associated documentation files (the
         
     | 
| 
      
 5 
     | 
    
         
            +
            "Software"), to deal in the Software without restriction, including
         
     | 
| 
      
 6 
     | 
    
         
            +
            without limitation the rights to use, copy, modify, merge, publish,
         
     | 
| 
      
 7 
     | 
    
         
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         
     | 
| 
      
 8 
     | 
    
         
            +
            permit persons to whom the Software is furnished to do so, subject to
         
     | 
| 
      
 9 
     | 
    
         
            +
            the following conditions:
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            The above copyright notice and this permission notice shall be
         
     | 
| 
      
 12 
     | 
    
         
            +
            included in all copies or substantial portions of the Software.
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         
     | 
| 
      
 15 
     | 
    
         
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         
     | 
| 
      
 16 
     | 
    
         
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         
     | 
| 
      
 17 
     | 
    
         
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         
     | 
| 
      
 18 
     | 
    
         
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         
     | 
| 
      
 19 
     | 
    
         
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         
     | 
| 
      
 20 
     | 
    
         
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         
     | 
    
        data/README.textile
    ADDED
    
    | 
         @@ -0,0 +1,86 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            h1. Sortable Table
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Sort HTML tables in a Rails app.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            h2. Install
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                script/plugin install git://github.com/dancroak/sortable_table.git
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            In test/test_helper.rb: 
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                class Test::Unit::TestCase
         
     | 
| 
      
 12 
     | 
    
         
            +
                  include SortableTable::Test::TestHelper
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            In app/controllers/application_controller.rb:
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                class ApplicationController < ActionController::Base
         
     | 
| 
      
 18 
     | 
    
         
            +
                  include SortableTable::App::Controllers::ApplicationController
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            In app/helpers/application_helper.rb:
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                module ApplicationHelper
         
     | 
| 
      
 24 
     | 
    
         
            +
                  include SortableTable::App::Helpers::ApplicationHelper
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            h2. Conventions
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            params[:sort] and params[:order]
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            h2. Examples
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            Use the sortable_attributes macro to list the... sortable attributes.
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            Then, in your index action, pass the sort_order method to your usual
         
     | 
| 
      
 36 
     | 
    
         
            +
            order parameter for will paginate or named scope call.
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                class UsersController < Admin::BaseController
         
     | 
| 
      
 39 
     | 
    
         
            +
                
         
     | 
| 
      
 40 
     | 
    
         
            +
                  sortable_attributes :name, :email
         
     | 
| 
      
 41 
     | 
    
         
            +
                  
         
     | 
| 
      
 42 
     | 
    
         
            +
                  def index
         
     | 
| 
      
 43 
     | 
    
         
            +
                    @users = User.paginate :page => params[:page], :order => sort_order
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
      
 45 
     | 
    
         
            +
                
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            Time-saving Shoulda macros for your tests:
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                class UsersControllerTest < ActionController::TestCase
         
     | 
| 
      
 51 
     | 
    
         
            +
                
         
     | 
| 
      
 52 
     | 
    
         
            +
                  context 'GET to index with sort and order params' do
         
     | 
| 
      
 53 
     | 
    
         
            +
                    setup do
         
     | 
| 
      
 54 
     | 
    
         
            +
                      5.times do |each|
         
     | 
| 
      
 55 
     | 
    
         
            +
                        Factory :user,
         
     | 
| 
      
 56 
     | 
    
         
            +
                          :name => "name #{each}",
         
     | 
| 
      
 57 
     | 
    
         
            +
                          :email => "email#{each}@example.com"
         
     | 
| 
      
 58 
     | 
    
         
            +
                      end
         
     | 
| 
      
 59 
     | 
    
         
            +
                    end
         
     | 
| 
      
 60 
     | 
    
         
            +
                  
         
     | 
| 
      
 61 
     | 
    
         
            +
                    should_sort_by :name
         
     | 
| 
      
 62 
     | 
    
         
            +
                    should_sort_by :email
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
                
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
            And some sugar for your views:
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                %h1 Users
         
     | 
| 
      
 70 
     | 
    
         
            +
                
         
     | 
| 
      
 71 
     | 
    
         
            +
                %table
         
     | 
| 
      
 72 
     | 
    
         
            +
                  %tr
         
     | 
| 
      
 73 
     | 
    
         
            +
                    = sortable_table_header :name => 'Name', :sort => 'name'
         
     | 
| 
      
 74 
     | 
    
         
            +
                    = sortable_table_header :name => 'E-mail', :sort => 'email'
         
     | 
| 
      
 75 
     | 
    
         
            +
                
         
     | 
| 
      
 76 
     | 
    
         
            +
                  - @users.each do |each|
         
     | 
| 
      
 77 
     | 
    
         
            +
                    %tr
         
     | 
| 
      
 78 
     | 
    
         
            +
                      %td= each.name
         
     | 
| 
      
 79 
     | 
    
         
            +
                      %td= each.email
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            Authors
         
     | 
| 
      
 82 
     | 
    
         
            +
            -------
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
            Dan Croak, Joe Ferris, and Boston.rb.
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
            Copyright (c) 2008 Dan Croak, released under the MIT license
         
     | 
    
        data/Rakefile
    ADDED
    
    | 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rake'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rake/testtask'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'date'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
         
     | 
| 
      
 5 
     | 
    
         
            +
            test_files_pattern = 'test/rails_root/test/{unit,functional,other}/**/*_test.rb'
         
     | 
| 
      
 6 
     | 
    
         
            +
            Rake::TestTask.new do |t|
         
     | 
| 
      
 7 
     | 
    
         
            +
              t.libs << 'lib'
         
     | 
| 
      
 8 
     | 
    
         
            +
              t.pattern = test_files_pattern
         
     | 
| 
      
 9 
     | 
    
         
            +
              t.verbose = false
         
     | 
| 
      
 10 
     | 
    
         
            +
            end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
         
     | 
| 
      
 12 
     | 
    
         
            +
            desc "Run the test suite"
         
     | 
| 
      
 13 
     | 
    
         
            +
            task :default => :test
         
     | 
| 
      
 14 
     | 
    
         
            +
             
         
     | 
| 
      
 15 
     | 
    
         
            +
            spec = Gem::Specification.new do |s|
         
     | 
| 
      
 16 
     | 
    
         
            +
              s.name = "sortable_table"
         
     | 
| 
      
 17 
     | 
    
         
            +
              s.summary = "Sort HTML tables in a Rails app."
         
     | 
| 
      
 18 
     | 
    
         
            +
              s.email = "dcroak@thoughtbot.com"
         
     | 
| 
      
 19 
     | 
    
         
            +
              s.homepage = "http://github.com/dancroak/sortable_table"
         
     | 
| 
      
 20 
     | 
    
         
            +
              s.description = "Sort HTML tables in a Rails app."
         
     | 
| 
      
 21 
     | 
    
         
            +
              s.authors = ["Dan Croak", "Joe Ferris", "Boston.rb"]
         
     | 
| 
      
 22 
     | 
    
         
            +
              s.files = FileList["[A-Z]*", "{lib,rails,test}/**/*"]
         
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
         
     | 
| 
      
 25 
     | 
    
         
            +
            begin
         
     | 
| 
      
 26 
     | 
    
         
            +
              require 'rubygems'
         
     | 
| 
      
 27 
     | 
    
         
            +
              require 'jeweler'
         
     | 
| 
      
 28 
     | 
    
         
            +
              Jeweler.gemspec = spec
         
     | 
| 
      
 29 
     | 
    
         
            +
            rescue LoadError 
         
     | 
| 
      
 30 
     | 
    
         
            +
              puts "Jeweler not available. sudo gem install technicalpickles-jeweler --source=http://gems.github.com"
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
    
        data/VERSION.yml
    ADDED
    
    
| 
         @@ -0,0 +1,46 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SortableTable
         
     | 
| 
      
 2 
     | 
    
         
            +
              module App
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Controllers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module ApplicationController
         
     | 
| 
      
 5 
     | 
    
         
            +
              
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def self.included(base)
         
     | 
| 
      
 7 
     | 
    
         
            +
                      base.class_eval do
         
     | 
| 
      
 8 
     | 
    
         
            +
                        include InstanceMethods
         
     | 
| 
      
 9 
     | 
    
         
            +
                        extend ClassMethods
         
     | 
| 
      
 10 
     | 
    
         
            +
                      end
         
     | 
| 
      
 11 
     | 
    
         
            +
                    end
         
     | 
| 
      
 12 
     | 
    
         
            +
                    
         
     | 
| 
      
 13 
     | 
    
         
            +
                    module ClassMethods
         
     | 
| 
      
 14 
     | 
    
         
            +
                      def sortable_attributes(*args)
         
     | 
| 
      
 15 
     | 
    
         
            +
                        mappings           = args.last.is_a?(Hash) ? args.pop : {}
         
     | 
| 
      
 16 
     | 
    
         
            +
                        acceptable_columns = args.collect(&:to_s) + mappings.keys.collect(&:to_s)
         
     | 
| 
      
 17 
     | 
    
         
            +
                        
         
     | 
| 
      
 18 
     | 
    
         
            +
                        define_method(:sort_order) do |*default| 
         
     | 
| 
      
 19 
     | 
    
         
            +
                          direction = params[:order] == 'ascending' ? 'asc' : 'desc'
         
     | 
| 
      
 20 
     | 
    
         
            +
                          column    = params[:sort] || 'created_on'
         
     | 
| 
      
 21 
     | 
    
         
            +
                          if params[:sort] && acceptable_columns.include?(column)
         
     | 
| 
      
 22 
     | 
    
         
            +
                            column = mappings[column.to_sym] || column
         
     | 
| 
      
 23 
     | 
    
         
            +
                            "#{column} #{direction}"
         
     | 
| 
      
 24 
     | 
    
         
            +
                          else
         
     | 
| 
      
 25 
     | 
    
         
            +
                            "#{acceptable_columns.first} #{default_sort_direction(default)}"
         
     | 
| 
      
 26 
     | 
    
         
            +
                          end
         
     | 
| 
      
 27 
     | 
    
         
            +
                        end
         
     | 
| 
      
 28 
     | 
    
         
            +
                      end
         
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
                    
         
     | 
| 
      
 31 
     | 
    
         
            +
                    module InstanceMethods
         
     | 
| 
      
 32 
     | 
    
         
            +
                      def default_sort_direction(default)
         
     | 
| 
      
 33 
     | 
    
         
            +
                        if default.any? && default.first.is_a?(Hash) && default.first.has_key?(:default)
         
     | 
| 
      
 34 
     | 
    
         
            +
                          default.first[:default] == 'ascending' ? 'asc' : 'desc'
         
     | 
| 
      
 35 
     | 
    
         
            +
                        else
         
     | 
| 
      
 36 
     | 
    
         
            +
                          'desc'  
         
     | 
| 
      
 37 
     | 
    
         
            +
                        end
         
     | 
| 
      
 38 
     | 
    
         
            +
                      end
         
     | 
| 
      
 39 
     | 
    
         
            +
                    end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
              end  
         
     | 
| 
      
 44 
     | 
    
         
            +
            end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,69 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SortableTable
         
     | 
| 
      
 2 
     | 
    
         
            +
              module App
         
     | 
| 
      
 3 
     | 
    
         
            +
                module Helpers
         
     | 
| 
      
 4 
     | 
    
         
            +
                  module ApplicationHelper
         
     | 
| 
      
 5 
     | 
    
         
            +
                  
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def self.included(base)
         
     | 
| 
      
 7 
     | 
    
         
            +
                      base.class_eval do
         
     | 
| 
      
 8 
     | 
    
         
            +
                        include InstanceMethods
         
     | 
| 
      
 9 
     | 
    
         
            +
                      end
         
     | 
| 
      
 10 
     | 
    
         
            +
                    end
         
     | 
| 
      
 11 
     | 
    
         
            +
                    
         
     | 
| 
      
 12 
     | 
    
         
            +
                    module InstanceMethods
         
     | 
| 
      
 13 
     | 
    
         
            +
                      def sortable_table_header(opts = {})
         
     | 
| 
      
 14 
     | 
    
         
            +
                        raise ArgumentError if opts[:name].nil? || opts[:sort].nil?
         
     | 
| 
      
 15 
     | 
    
         
            +
                        anchor = opts[:anchor].blank? ? "" : "##{opts[:anchor]}"
         
     | 
| 
      
 16 
     | 
    
         
            +
                        content_tag :th, 
         
     | 
| 
      
 17 
     | 
    
         
            +
                          link_to(name_with_desc(opts), 
         
     | 
| 
      
 18 
     | 
    
         
            +
                            sortable_url(opts) + anchor, 
         
     | 
| 
      
 19 
     | 
    
         
            +
                            :title => opts[:title]),
         
     | 
| 
      
 20 
     | 
    
         
            +
                          :class => class_name_for_sortable_table_header_tag(opts)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      end
         
     | 
| 
      
 22 
     | 
    
         
            +
                      
         
     | 
| 
      
 23 
     | 
    
         
            +
                      def class_name_for_sortable_table_header_tag(opts)
         
     | 
| 
      
 24 
     | 
    
         
            +
                        if default_sort_to_most_recent? opts
         
     | 
| 
      
 25 
     | 
    
         
            +
                          'descending'
         
     | 
| 
      
 26 
     | 
    
         
            +
                        elsif re_sort? opts
         
     | 
| 
      
 27 
     | 
    
         
            +
                          params[:order]
         
     | 
| 
      
 28 
     | 
    
         
            +
                        else
         
     | 
| 
      
 29 
     | 
    
         
            +
                          nil
         
     | 
| 
      
 30 
     | 
    
         
            +
                        end
         
     | 
| 
      
 31 
     | 
    
         
            +
                      end
         
     | 
| 
      
 32 
     | 
    
         
            +
                      
         
     | 
| 
      
 33 
     | 
    
         
            +
                      def default_sort_to_most_recent?(opts)
         
     | 
| 
      
 34 
     | 
    
         
            +
                        params[:sort].nil? && opts[:sort] == 'date'
         
     | 
| 
      
 35 
     | 
    
         
            +
                      end
         
     | 
| 
      
 36 
     | 
    
         
            +
                      
         
     | 
| 
      
 37 
     | 
    
         
            +
                      def re_sort?(opts)
         
     | 
| 
      
 38 
     | 
    
         
            +
                        params[:sort] == opts[:sort]
         
     | 
| 
      
 39 
     | 
    
         
            +
                      end
         
     | 
| 
      
 40 
     | 
    
         
            +
                      
         
     | 
| 
      
 41 
     | 
    
         
            +
                      def reverse_order(order)
         
     | 
| 
      
 42 
     | 
    
         
            +
                        order == 'ascending' ? 'descending' : 'ascending'
         
     | 
| 
      
 43 
     | 
    
         
            +
                      end
         
     | 
| 
      
 44 
     | 
    
         
            +
                      
         
     | 
| 
      
 45 
     | 
    
         
            +
                      def name_with_desc(opts)
         
     | 
| 
      
 46 
     | 
    
         
            +
                        return opts[:name] unless opts[:sort] == params[:sort]
         
     | 
| 
      
 47 
     | 
    
         
            +
              
         
     | 
| 
      
 48 
     | 
    
         
            +
                        link_sort_order(opts) == 'descending' ? opts[:name] + " (asc)" : opts[:name] + " (desc)"
         
     | 
| 
      
 49 
     | 
    
         
            +
                      end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                      def sortable_url(opts)
         
     | 
| 
      
 52 
     | 
    
         
            +
                        url_for(params.merge(:sort => opts[:sort], :order => link_sort_order(opts), :page => 1))
         
     | 
| 
      
 53 
     | 
    
         
            +
                      end
         
     | 
| 
      
 54 
     | 
    
         
            +
                      
         
     | 
| 
      
 55 
     | 
    
         
            +
                      def link_sort_order(opts)
         
     | 
| 
      
 56 
     | 
    
         
            +
                        if default_sort_to_most_recent? opts
         
     | 
| 
      
 57 
     | 
    
         
            +
                          'ascending'
         
     | 
| 
      
 58 
     | 
    
         
            +
                        elsif re_sort? opts
         
     | 
| 
      
 59 
     | 
    
         
            +
                          reverse_order params[:order]
         
     | 
| 
      
 60 
     | 
    
         
            +
                        else
         
     | 
| 
      
 61 
     | 
    
         
            +
                          'ascending'
         
     | 
| 
      
 62 
     | 
    
         
            +
                        end
         
     | 
| 
      
 63 
     | 
    
         
            +
                      end
         
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
                    
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,50 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SortableTable 
         
     | 
| 
      
 2 
     | 
    
         
            +
              module Test
         
     | 
| 
      
 3 
     | 
    
         
            +
                module TestHelper
         
     | 
| 
      
 4 
     | 
    
         
            +
                
         
     | 
| 
      
 5 
     | 
    
         
            +
                  def self.included(base)
         
     | 
| 
      
 6 
     | 
    
         
            +
                    base.class_eval do
         
     | 
| 
      
 7 
     | 
    
         
            +
                      extend ClassMethods
         
     | 
| 
      
 8 
     | 
    
         
            +
                    end
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
                
         
     | 
| 
      
 11 
     | 
    
         
            +
                  module ClassMethods
         
     | 
| 
      
 12 
     | 
    
         
            +
                    def should_sort_by(attribute, &block)
         
     | 
| 
      
 13 
     | 
    
         
            +
                      collection = self.name.underscore.gsub(/_controller_test/, '')
         
     | 
| 
      
 14 
     | 
    
         
            +
                      collection.slice!(0..collection.rindex('/')) if collection.include?('/')
         
     | 
| 
      
 15 
     | 
    
         
            +
                      collection = collection.to_sym
         
     | 
| 
      
 16 
     | 
    
         
            +
                      model_name = collection.to_s.singularize.camelize.constantize
         
     | 
| 
      
 17 
     | 
    
         
            +
                      
         
     | 
| 
      
 18 
     | 
    
         
            +
                      if !block
         
     | 
| 
      
 19 
     | 
    
         
            +
                        if model_name.columns.select{|c| c.name == attribute.to_s }.first.type == :boolean
         
     | 
| 
      
 20 
     | 
    
         
            +
                          block = lambda{|x| x.send(attribute).to_s } 
         
     | 
| 
      
 21 
     | 
    
         
            +
                        end
         
     | 
| 
      
 22 
     | 
    
         
            +
                        block ||= attribute
         
     | 
| 
      
 23 
     | 
    
         
            +
                      end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                      %w(ascending descending).each do |direction|
         
     | 
| 
      
 26 
     | 
    
         
            +
                        should "sort by #{attribute.to_s} #{direction}" do
         
     | 
| 
      
 27 
     | 
    
         
            +
                          assert_not_nil model_name.find(:all).any?,
         
     | 
| 
      
 28 
     | 
    
         
            +
                            "#{model_name}.find(:all) is nil"
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                          get :index, :sort => attribute.to_s, :order => direction
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                          assert_not_nil assigns(collection), 
         
     | 
| 
      
 33 
     | 
    
         
            +
                            "assigns(:#{collection}) is nil"
         
     | 
| 
      
 34 
     | 
    
         
            +
                          assert assigns(collection).size >= 2, 
         
     | 
| 
      
 35 
     | 
    
         
            +
                            "cannot test sorting without at least 2 sortable objects"
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                          expected = assigns(collection).sort_by(&block)
         
     | 
| 
      
 38 
     | 
    
         
            +
                          expected = expected.reverse if direction == 'descending'
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                          assert expected.map(&block) == assigns(collection).map(&block), 
         
     | 
| 
      
 41 
     | 
    
         
            +
                            "expected - #{expected.map(&block).inspect}," <<
         
     | 
| 
      
 42 
     | 
    
         
            +
                            " but was - #{assigns(collection).map(&block).inspect}"
         
     | 
| 
      
 43 
     | 
    
         
            +
                        end
         
     | 
| 
      
 44 
     | 
    
         
            +
                      end
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
            end
         
     | 
    
        data/rails/init.rb
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "sortable_table"
         
     | 
| 
         @@ -0,0 +1,10 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Add your own tasks in files placed in lib/tasks ending in .rake,
         
     | 
| 
      
 2 
     | 
    
         
            +
            # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            require(File.join(File.dirname(__FILE__), 'config', 'boot'))
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            require 'rake'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'rake/testtask'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require 'rake/rdoctask'
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            require 'tasks/rails'
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         
     | 
| 
      
 2 
     | 
    
         
            +
                   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
         
     | 
| 
      
 5 
     | 
    
         
            +
            <head>
         
     | 
| 
      
 6 
     | 
    
         
            +
              <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
         
     | 
| 
      
 7 
     | 
    
         
            +
              <title>Users: <%= controller.action_name %></title>
         
     | 
| 
      
 8 
     | 
    
         
            +
              <%= stylesheet_link_tag 'scaffold', 'sortable' %>
         
     | 
| 
      
 9 
     | 
    
         
            +
            </head>
         
     | 
| 
      
 10 
     | 
    
         
            +
            <body>
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            <p style="color: green"><%= flash[:notice] %></p>
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            <%= yield  %>
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            </body>
         
     | 
| 
      
 17 
     | 
    
         
            +
            </html>
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <h1>Users</h1>
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            <table>
         
     | 
| 
      
 4 
     | 
    
         
            +
              <tr>
         
     | 
| 
      
 5 
     | 
    
         
            +
                <%= sortable_table_header :name => 'Name', :sort => 'name' %>
         
     | 
| 
      
 6 
     | 
    
         
            +
                <%= sortable_table_header :name => 'Email', :sort => 'email' %>
         
     | 
| 
      
 7 
     | 
    
         
            +
                <%= sortable_table_header :name => 'Age', :sort => 'age' %>
         
     | 
| 
      
 8 
     | 
    
         
            +
                <th>Created On</th>
         
     | 
| 
      
 9 
     | 
    
         
            +
              </tr>
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            <% @users.each do |user| %>
         
     | 
| 
      
 12 
     | 
    
         
            +
              <tr>
         
     | 
| 
      
 13 
     | 
    
         
            +
                <td><%=h user.name %></td>
         
     | 
| 
      
 14 
     | 
    
         
            +
                <td><%=h user.email %></td>
         
     | 
| 
      
 15 
     | 
    
         
            +
                <td><%=h user.age %></td>
         
     | 
| 
      
 16 
     | 
    
         
            +
                <td><%=h user.created_at.to_s %></td>
         
     | 
| 
      
 17 
     | 
    
         
            +
              </tr>
         
     | 
| 
      
 18 
     | 
    
         
            +
            <% end %>
         
     | 
| 
      
 19 
     | 
    
         
            +
            </table>
         
     | 
| 
         @@ -0,0 +1,109 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Don't change this file!
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Configure your app in config/environment.rb and config/environments/*.rb
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Rails
         
     | 
| 
      
 7 
     | 
    
         
            +
              class << self
         
     | 
| 
      
 8 
     | 
    
         
            +
                def boot!
         
     | 
| 
      
 9 
     | 
    
         
            +
                  unless booted?
         
     | 
| 
      
 10 
     | 
    
         
            +
                    preinitialize
         
     | 
| 
      
 11 
     | 
    
         
            +
                    pick_boot.run
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def booted?
         
     | 
| 
      
 16 
     | 
    
         
            +
                  defined? Rails::Initializer
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def pick_boot
         
     | 
| 
      
 20 
     | 
    
         
            +
                  (vendor_rails? ? VendorBoot : GemBoot).new
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def vendor_rails?
         
     | 
| 
      
 24 
     | 
    
         
            +
                  File.exist?("#{RAILS_ROOT}/vendor/rails")
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def preinitialize
         
     | 
| 
      
 28 
     | 
    
         
            +
                  load(preinitializer_path) if File.exist?(preinitializer_path)
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                def preinitializer_path
         
     | 
| 
      
 32 
     | 
    
         
            +
                  "#{RAILS_ROOT}/config/preinitializer.rb"
         
     | 
| 
      
 33 
     | 
    
         
            +
                end
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              class Boot
         
     | 
| 
      
 37 
     | 
    
         
            +
                def run
         
     | 
| 
      
 38 
     | 
    
         
            +
                  load_initializer
         
     | 
| 
      
 39 
     | 
    
         
            +
                  Rails::Initializer.run(:set_load_path)
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
              class VendorBoot < Boot
         
     | 
| 
      
 44 
     | 
    
         
            +
                def load_initializer
         
     | 
| 
      
 45 
     | 
    
         
            +
                  require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
         
     | 
| 
      
 46 
     | 
    
         
            +
                  Rails::Initializer.run(:install_gem_spec_stubs)
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              class GemBoot < Boot
         
     | 
| 
      
 51 
     | 
    
         
            +
                def load_initializer
         
     | 
| 
      
 52 
     | 
    
         
            +
                  self.class.load_rubygems
         
     | 
| 
      
 53 
     | 
    
         
            +
                  load_rails_gem
         
     | 
| 
      
 54 
     | 
    
         
            +
                  require 'initializer'
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                def load_rails_gem
         
     | 
| 
      
 58 
     | 
    
         
            +
                  if version = self.class.gem_version
         
     | 
| 
      
 59 
     | 
    
         
            +
                    gem 'rails', version
         
     | 
| 
      
 60 
     | 
    
         
            +
                  else
         
     | 
| 
      
 61 
     | 
    
         
            +
                    gem 'rails'
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
                rescue Gem::LoadError => load_error
         
     | 
| 
      
 64 
     | 
    
         
            +
                  $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  exit 1
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 69 
     | 
    
         
            +
                  def rubygems_version
         
     | 
| 
      
 70 
     | 
    
         
            +
                    Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                  def gem_version
         
     | 
| 
      
 74 
     | 
    
         
            +
                    if defined? RAILS_GEM_VERSION
         
     | 
| 
      
 75 
     | 
    
         
            +
                      RAILS_GEM_VERSION
         
     | 
| 
      
 76 
     | 
    
         
            +
                    elsif ENV.include?('RAILS_GEM_VERSION')
         
     | 
| 
      
 77 
     | 
    
         
            +
                      ENV['RAILS_GEM_VERSION']
         
     | 
| 
      
 78 
     | 
    
         
            +
                    else
         
     | 
| 
      
 79 
     | 
    
         
            +
                      parse_gem_version(read_environment_rb)
         
     | 
| 
      
 80 
     | 
    
         
            +
                    end
         
     | 
| 
      
 81 
     | 
    
         
            +
                  end
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                  def load_rubygems
         
     | 
| 
      
 84 
     | 
    
         
            +
                    require 'rubygems'
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
                    unless rubygems_version >= '0.9.4'
         
     | 
| 
      
 87 
     | 
    
         
            +
                      $stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_version}). Please `gem update --system` and try again.)
         
     | 
| 
      
 88 
     | 
    
         
            +
                      exit 1
         
     | 
| 
      
 89 
     | 
    
         
            +
                    end
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                  rescue LoadError
         
     | 
| 
      
 92 
     | 
    
         
            +
                    $stderr.puts %(Rails requires RubyGems >= 0.9.4. Please install RubyGems and try again: http://rubygems.rubyforge.org)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    exit 1
         
     | 
| 
      
 94 
     | 
    
         
            +
                  end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                  def parse_gem_version(text)
         
     | 
| 
      
 97 
     | 
    
         
            +
                    $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
         
     | 
| 
      
 98 
     | 
    
         
            +
                  end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                  private
         
     | 
| 
      
 101 
     | 
    
         
            +
                    def read_environment_rb
         
     | 
| 
      
 102 
     | 
    
         
            +
                      File.read("#{RAILS_ROOT}/config/environment.rb")
         
     | 
| 
      
 103 
     | 
    
         
            +
                    end
         
     | 
| 
      
 104 
     | 
    
         
            +
                end
         
     | 
| 
      
 105 
     | 
    
         
            +
              end
         
     | 
| 
      
 106 
     | 
    
         
            +
            end
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
            # All that for this:
         
     | 
| 
      
 109 
     | 
    
         
            +
            Rails.boot!
         
     |