daru-data_tables 0.1.0 → 0.3.5
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.
- checksums.yaml +4 -4
- data/.CHANGELOG.md.swp +0 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -1
- data/.simplecov +3 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +42 -0
- data/Gemfile +10 -0
- data/README.md +6 -1
- data/Rakefile +3 -0
- data/daru-data_tables.gemspec +2 -3
- data/lib/daru/data_tables/constants_data_table.rb +8 -0
- data/lib/daru/data_tables/core_ext/string.rb +10 -0
- data/lib/daru/data_tables/data_table.rb +68 -4
- data/lib/daru/data_tables/display/display.rb +98 -41
- data/lib/daru/data_tables/display/iruby_notebook.rb +37 -29
- data/lib/daru/data_tables/generate_js/generate_js.rb +62 -15
- data/lib/daru/data_tables/generate_js/param_helpers.rb +6 -2
- data/lib/daru/data_tables/templates/thead.erb +15 -0
- data/lib/daru/data_tables/version.rb +2 -2
- data/lib/tasks/data_tables.rake +5 -3
- data/{lib/daru/data_tables/js → vendor/assets/javascripts}/jquery-latest.min.js +0 -0
- data/{lib/daru/data_tables/js → vendor/assets/javascripts}/jquery.dataTables.js +145 -74
- data/{lib/daru/data_tables/css → vendor/assets/stylesheets}/jquery.dataTables.css +1 -1
- metadata +13 -21
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 1f660b4a3ca5a6cc0f958070666b14269810efbf
         | 
| 4 | 
            +
              data.tar.gz: 869497cb55c683178b0c7267398689206c9687df
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e7c38d078a620932d028ee27add03f862c81ff65cda34cb9b20d76fed581174c377309bac66c7359c6564588584d2c2f973c301bf6896253dd8290aec3a92044
         | 
| 7 | 
            +
              data.tar.gz: 5e055a03905a8ca91ef44b30a9724442929a7cb202f8bbe8f823f5a48c0929ca4c3894026ea762e6e62b3408cb6a255616bea485d1c5d1705195d4abe4499648
         | 
    
        data/.CHANGELOG.md.swp
    ADDED
    
    | Binary file | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/.simplecov
    ADDED
    
    
    
        data/.travis.yml
    CHANGED
    
    
    
        data/CHANGELOG.md
    ADDED
    
    | @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            ## 0.3.5 (2017-12-03)
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            **Enhancements:**
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            - Load large set of data #20
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            - Renmaed to `Daru::View::DataTable.new(data, options)` from
         | 
| 8 | 
            +
            `Daru::DataTables::DataTable.new(data, options)` #23
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            - Remove bunch of js lines in rails #23 :
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            Include js in rails app/assets/javascripts/application.js file as:
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            ```
         | 
| 15 | 
            +
            //= require jquery-latest.min
         | 
| 16 | 
            +
            //= require jquery.dataTables
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            ```
         | 
| 19 | 
            +
            CSS files can be included as:
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            ```
         | 
| 22 | 
            +
             *= require jquery.dataTables
         | 
| 23 | 
            +
            ```
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            **Note:**
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            * [GSoC 2018 project](https://github.com/SciRuby/daru-view/wiki/GSoC-2018---Progress-Report)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            * [Wiki page about loading large set in daru-view using daru-data_tables](https://github.com/SciRuby/daru-view/wiki/DataTables-to-load-large-set-data-in-daru-view-table)
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            ## 0.1.0 (2017-09-20)
         | 
| 32 | 
            +
             | 
| 33 | 
            +
            **Features:**
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            - [Discussion at datatables forum](https://github.com/Shekharrajak/daru-data_tables/wiki/Discussion-in-datatables-forum)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            **NOTE:**
         | 
| 38 | 
            +
             | 
| 39 | 
            +
             | 
| 40 | 
            +
            - [GSoC 2017 Blog post](http://shekharrajak.github.io/gsoc_2017_posts/)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            - [Blog post at SciRuby, how daru-data_table gem is used in daru-view](http://sciruby.com/blog/2017/09/01/gsoc-2017-data-visualization-using-daru-view/)
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -5,3 +5,13 @@ gem "daru", git: 'https://github.com/sciruby/daru.git' | |
| 5 5 |  | 
| 6 6 | 
             
            # Specify your gem's dependencies in datatables.gemspec
         | 
| 7 7 | 
             
            gemspec
         | 
| 8 | 
            +
             | 
| 9 | 
            +
             | 
| 10 | 
            +
            group :test do
         | 
| 11 | 
            +
              gem 'coveralls', require: false
         | 
| 12 | 
            +
              gem 'rspec'
         | 
| 13 | 
            +
              gem 'simplecov', require: false
         | 
| 14 | 
            +
              gem 'simplecov-console', require: false
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
             | 
    
        data/README.md
    CHANGED
    
    | @@ -1,12 +1,17 @@ | |
| 1 1 | 
             
            # data_tables
         | 
| 2 2 |  | 
| 3 | 
            +
            [](https://badge.fury.io/rb/daru-data_tables)
         | 
| 4 | 
            +
            [](https://travis-ci.org/shekharrajak/daru-data_tables)
         | 
| 5 | 
            +
            [](https://coveralls.io/github/Shekharrajak/daru-data_tables?branch=master)
         | 
| 6 | 
            +
             | 
| 3 7 | 
             
            This is Ruby gem for the jQuery Javascript library. This gem is created to be used in [daru-view](https://guthub.com/shekharrajak/daru-view). It can create table from Daru::DataFrame and Daru::Vector to display in webpages as well as IRuby notebook.
         | 
| 4 8 |  | 
| 5 9 | 
             
            DataTable is very useful in loading large dataset and also we can load data into pieces.
         | 
| 6 10 |  | 
| 7 11 | 
             
            ## Examples :
         | 
| 8 12 |  | 
| 9 | 
            -
            - [ | 
| 13 | 
            +
            - [Rails examples](https://github.com/Shekharrajak/daru-data_tables/tree/master/spec/dummy_rails)
         | 
| 14 | 
            +
             | 
| 10 15 |  | 
| 11 16 | 
             
            ## Installation
         | 
| 12 17 |  | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/daru-data_tables.gemspec
    CHANGED
    
    | @@ -5,7 +5,7 @@ require "daru/data_tables/version" | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |spec|
         | 
| 7 7 | 
             
              spec.name          = "daru-data_tables"
         | 
| 8 | 
            -
              spec.version       = Daru:: | 
| 8 | 
            +
              spec.version       = Daru::View::VERSION
         | 
| 9 9 | 
             
              spec.authors       = ["shekharrajak"]
         | 
| 10 10 | 
             
              spec.email         = ["shekharstudy@ymail.com"]
         | 
| 11 11 |  | 
| @@ -24,9 +24,8 @@ Gem::Specification.new do |spec| | |
| 24 24 | 
             
              spec.add_development_dependency "rake", "~> 10.0"
         | 
| 25 25 | 
             
              spec.add_development_dependency 'actionview'
         | 
| 26 26 | 
             
              spec.add_development_dependency 'byebug'
         | 
| 27 | 
            +
              spec.add_runtime_dependency 'daru'
         | 
| 27 28 |  | 
| 28 | 
            -
              spec.add_development_dependency 'rspec', '~> 3.4'
         | 
| 29 | 
            -
              spec.add_development_dependency 'simplecov'
         | 
| 30 29 | 
             
              spec.add_development_dependency 'pry', '~> 0.10'
         | 
| 31 30 | 
             
              spec.add_development_dependency 'rubocop'
         | 
| 32 31 | 
             
            end
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            # DataTables CSS dependencies
         | 
| 2 | 
            +
            DATATABLES_DEPENDENCIES_CSS = ['jquery.dataTables.css'].freeze
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # Dependent DataTables JS constants for IRuby notebook
         | 
| 5 | 
            +
            DATATABLES_DEPENDENCIES_IRUBY = ['jquery.dataTables.js'].freeze
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            # Dependent DataTables JS constants for web frameworks
         | 
| 8 | 
            +
            DATATABLES_DEPENDENCIES_WEB = ['jquery-latest.min.js', 'jquery.dataTables.js'].freeze
         | 
| @@ -1,10 +1,74 @@ | |
| 1 1 | 
             
            module Daru
         | 
| 2 | 
            -
              module  | 
| 2 | 
            +
              module View
         | 
| 3 | 
            +
                class Engine < ::Rails::Engine; end if defined?(Rails)
         | 
| 3 4 | 
             
                class DataTable
         | 
| 4 | 
            -
                  attr_accessor :html_options, :element_id, :options
         | 
| 5 | 
            -
                   | 
| 5 | 
            +
                  attr_accessor :html_options, :element_id, :options, :data
         | 
| 6 | 
            +
                  # @param data [Array, Daru::DataFrame, Daru::Vector] The data provided
         | 
| 7 | 
            +
                  #   by the user to generate the datatable
         | 
| 8 | 
            +
                  # @param options [Hash] Various options provided by the user to
         | 
| 9 | 
            +
                  #   incorporate in datatable
         | 
| 10 | 
            +
                  # @return Initializes the Daru::DataTables::DataTable object
         | 
| 11 | 
            +
                  # @example
         | 
| 12 | 
            +
                  #   vec = Daru::Vector.new([1, 2, 3], name: :a)
         | 
| 13 | 
            +
                  #   opts = {searching: false}
         | 
| 14 | 
            +
                  #   table = Daru::DataTables::DataTable.new(vec, opts)
         | 
| 15 | 
            +
                  def initialize(data=[], options={})
         | 
| 6 16 | 
             
                    @element_id = options.delete(:element_id) unless options[:element_id].nil?
         | 
| 7 | 
            -
                    @ | 
| 17 | 
            +
                    @html_options = options.delete(:html_options) unless options[:html_options].nil?
         | 
| 18 | 
            +
                    @html_options ||= default_html_options
         | 
| 19 | 
            +
                    @data = data
         | 
| 20 | 
            +
                    @options = options
         | 
| 21 | 
            +
                    @options[:data] = to_data_array(data)
         | 
| 22 | 
            +
                    row_number = 0
         | 
| 23 | 
            +
                    @options[:data].each do |array|
         | 
| 24 | 
            +
                      array.unshift(row_number)
         | 
| 25 | 
            +
                      row_number += 1
         | 
| 26 | 
            +
                    end
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  private
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def default_html_options
         | 
| 32 | 
            +
                    table_opts = {
         | 
| 33 | 
            +
                      class: 'display',
         | 
| 34 | 
            +
                      cellspacing: '0',
         | 
| 35 | 
            +
                      width: '100%'
         | 
| 36 | 
            +
                    }
         | 
| 37 | 
            +
                    html_options = {
         | 
| 38 | 
            +
                      table_options: table_opts
         | 
| 39 | 
            +
                    }
         | 
| 40 | 
            +
                    html_options
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  # DataTables accept the data as Array of array.
         | 
| 44 | 
            +
                  #
         | 
| 45 | 
            +
                  # TODO : I didn't find use case for Daru::MultiIndex.
         | 
| 46 | 
            +
                  def to_data_array(data_set)
         | 
| 47 | 
            +
                    case
         | 
| 48 | 
            +
                    when data_set.is_a?(Daru::DataFrame)
         | 
| 49 | 
            +
                      return ArgumentError unless data_set.index.is_a?(Daru::Index)
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                      rows = data_set.access_row_tuples_by_indexs(*data_set.index.to_a)
         | 
| 52 | 
            +
                      convert_to_array_of_array(rows)
         | 
| 53 | 
            +
                    when data_set.is_a?(Daru::Vector)
         | 
| 54 | 
            +
                      rows = []
         | 
| 55 | 
            +
                      data_set.to_a.each { |a| rows << [a] }
         | 
| 56 | 
            +
                      rows
         | 
| 57 | 
            +
                    when data_set.is_a?(Array)
         | 
| 58 | 
            +
                      convert_to_array_of_array(data_set)
         | 
| 59 | 
            +
                    else
         | 
| 60 | 
            +
                      raise ArgumentError, 'Invalid Argument Passed!'
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  def convert_to_array_of_array(rows)
         | 
| 65 | 
            +
                    if rows.all? { |row| row.class==Array }
         | 
| 66 | 
            +
                      rows
         | 
| 67 | 
            +
                    else
         | 
| 68 | 
            +
                      tuples = []
         | 
| 69 | 
            +
                      rows.each { |row| tuples << [row] }
         | 
| 70 | 
            +
                      tuples
         | 
| 71 | 
            +
                    end
         | 
| 8 72 | 
             
                  end
         | 
| 9 73 | 
             
                end
         | 
| 10 74 | 
             
              end
         | 
| @@ -3,37 +3,59 @@ require 'erb' | |
| 3 3 | 
             
            require_relative 'iruby_notebook'
         | 
| 4 4 | 
             
            require_relative '../generate_js/generate_js'
         | 
| 5 5 | 
             
            require 'action_view'
         | 
| 6 | 
            +
            require 'daru/data_tables/constants_data_table'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module Daru
         | 
| 8 | 
            -
              module  | 
| 9 | 
            -
                 | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
                     | 
| 21 | 
            -
             | 
| 22 | 
            -
                   | 
| 23 | 
            -
             | 
| 24 | 
            -
                  #  | 
| 25 | 
            -
                  #  | 
| 26 | 
            -
                   | 
| 27 | 
            -
             | 
| 28 | 
            -
                   | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 9 | 
            +
              module View
         | 
| 10 | 
            +
                class DataTables
         | 
| 11 | 
            +
                  # @param dependent_js [Array] dependent js files required
         | 
| 12 | 
            +
                  # @return [String] js code of the dependent files
         | 
| 13 | 
            +
                  def self.init_javascript(
         | 
| 14 | 
            +
                    dependent_js=DATATABLES_DEPENDENCIES_WEB
         | 
| 15 | 
            +
                  )
         | 
| 16 | 
            +
                    # TODO: there are many js and css files, that must be added for
         | 
| 17 | 
            +
                    # more features. Refer: https://datatables.net/download/index
         | 
| 18 | 
            +
                    js =  ''
         | 
| 19 | 
            +
                    js << "\n<script type='text/javascript'>"
         | 
| 20 | 
            +
                    js << Daru::View.generate_init_code_js(dependent_js)
         | 
| 21 | 
            +
                    js << "\n</script>"
         | 
| 22 | 
            +
                    js
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  # @param [Array] dependent css files required
         | 
| 26 | 
            +
                  # @return [String] CSS code of the dependent file(s)
         | 
| 27 | 
            +
                  def self.init_css(
         | 
| 28 | 
            +
                    dependent_css=DATATABLES_DEPENDENCIES_CSS
         | 
| 29 | 
            +
                  )
         | 
| 30 | 
            +
                    css = ''
         | 
| 31 | 
            +
                    css << "\n<style type='text/css'>"
         | 
| 32 | 
            +
                    css << Daru::View.generate_init_code_css(dependent_css)
         | 
| 33 | 
            +
                    css << "\n</style>"
         | 
| 34 | 
            +
                    css
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  # dependent script for the library. It must be added in the head tag
         | 
| 38 | 
            +
                  # of the web application.
         | 
| 39 | 
            +
                  #
         | 
| 40 | 
            +
                  # @return [String] code of the dependent css and js file(s)
         | 
| 41 | 
            +
                  # @example
         | 
| 42 | 
            +
                  #
         | 
| 43 | 
            +
                  # dep_js = DataTables.init_script
         | 
| 44 | 
            +
                  #
         | 
| 45 | 
            +
                  # use in Rails app : <%=raw dep_js %>
         | 
| 46 | 
            +
                  def self.init_script
         | 
| 47 | 
            +
                    init_code = ''
         | 
| 48 | 
            +
                    init_code << init_css
         | 
| 49 | 
            +
                    init_code << init_javascript
         | 
| 50 | 
            +
                    init_code
         | 
| 51 | 
            +
                  end
         | 
| 34 52 | 
             
                end
         | 
| 35 53 |  | 
| 36 54 | 
             
                module Display
         | 
| 55 | 
            +
                  # @param dom [String] The ID of the DIV element that the DataTable
         | 
| 56 | 
            +
                  #   should be rendered in
         | 
| 57 | 
            +
                  # @param options [Hash] options provided
         | 
| 58 | 
            +
                  # @return [String] js script to render the table
         | 
| 37 59 | 
             
                  def show_script(dom=SecureRandom.uuid, options={})
         | 
| 38 60 | 
             
                    script_tag = options.fetch(:script_tag) { true }
         | 
| 39 61 | 
             
                    if script_tag
         | 
| @@ -48,34 +70,36 @@ module Daru | |
| 48 70 | 
             
                  # If table_options is not present then it will assume that table tag is
         | 
| 49 71 | 
             
                  # already present in the web page source, where we are pasting the
         | 
| 50 72 | 
             
                  # html code.
         | 
| 73 | 
            +
                  # @param id [String] The ID of the DIV element that the DataTable
         | 
| 74 | 
            +
                  #   should be rendered in
         | 
| 75 | 
            +
                  # @param options [Hash] options provided
         | 
| 76 | 
            +
                  # @return [String] Generates JavaScript and renders the table in the
         | 
| 77 | 
            +
                  #   final HTML output.
         | 
| 51 78 | 
             
                  def to_html(id=nil, options={})
         | 
| 52 79 | 
             
                    # More things can be added into table_script.erb
         | 
| 53 | 
            -
                    path = File.expand_path(' | 
| 80 | 
            +
                    path = File.expand_path('../templates/table_script.erb', __dir__)
         | 
| 54 81 | 
             
                    template = File.read(path)
         | 
| 55 82 | 
             
                    id ||= SecureRandom.uuid # TODO: remove it or Use it for table tag.
         | 
| 56 | 
            -
                     | 
| 83 | 
            +
                    element_id ||= id
         | 
| 84 | 
            +
                    table_script = show_script(element_id, script_tag: false)
         | 
| 57 85 | 
             
                    html_code = ERB.new(template).result(binding)
         | 
| 58 86 | 
             
                    # table_options is given. That means table html code is not present in
         | 
| 59 87 | 
             
                    # the webpage. So it must generate table code with given options.
         | 
| 60 | 
            -
                     | 
| 61 | 
            -
             | 
| 62 | 
            -
                      table_thead_tbody = options[:table_options].delete(:table_html)
         | 
| 63 | 
            -
                      table_thead_tbody ||= ''
         | 
| 64 | 
            -
                      html_code.concat(
         | 
| 65 | 
            -
                        content_tag('table', table_thead_tbody.html_safe, options[:table_options])
         | 
| 66 | 
            -
                      )
         | 
| 67 | 
            -
                    end
         | 
| 88 | 
            +
                    table_thead = extract_table
         | 
| 89 | 
            +
                    draw_table_thead(element_id, html_code, table_thead)
         | 
| 68 90 | 
             
                    html_code
         | 
| 69 91 | 
             
                  end
         | 
| 70 92 |  | 
| 93 | 
            +
                  # @param dom [String] The ID of the DIV element that the DataTable
         | 
| 94 | 
            +
                  #   should be rendered in
         | 
| 95 | 
            +
                  # @return [void] shows the datatable in IRuby notebook
         | 
| 71 96 | 
             
                  def show_in_iruby(dom=SecureRandom.uuid)
         | 
| 72 97 | 
             
                    IRuby.html(to_html(dom))
         | 
| 73 98 | 
             
                  end
         | 
| 74 99 |  | 
| 75 | 
            -
                  #  | 
| 76 | 
            -
                  #
         | 
| 77 | 
            -
                  #  | 
| 78 | 
            -
                  #  *element_id            [Required] The ID of the DIV element that the table should be rendered in.
         | 
| 100 | 
            +
                  # @param element_id [String] The ID of the DIV element that the DataTable
         | 
| 101 | 
            +
                  #   should be rendered in
         | 
| 102 | 
            +
                  # @return [String] returns the javascript of the DataTable
         | 
| 79 103 | 
             
                  def to_js(element_id)
         | 
| 80 104 | 
             
                    js =  ''
         | 
| 81 105 | 
             
                    js << "\n<script type='text/javascript'>"
         | 
| @@ -83,7 +107,40 @@ module Daru | |
| 83 107 | 
             
                    js << "\n</script>"
         | 
| 84 108 | 
             
                    js
         | 
| 85 109 | 
             
                  end
         | 
| 86 | 
            -
             | 
| 110 | 
            +
             | 
| 111 | 
            +
                  private
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                  def extract_table
         | 
| 114 | 
            +
                    return data.to_html_thead unless data.is_a?(Array)
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                    path = File.expand_path('../templates/thead.erb', __dir__)
         | 
| 117 | 
            +
                    template = File.read(path)
         | 
| 118 | 
            +
                    ERB.new(template).result(binding)
         | 
| 119 | 
            +
                  end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                  def draw_table_thead(element_id, html_code, table_thead)
         | 
| 122 | 
            +
                    if html_options && html_options[:table_options]
         | 
| 123 | 
            +
                      draw_table_thead_from_html_options(element_id, html_code, table_thead)
         | 
| 124 | 
            +
                    # if user provided html_options but not provided html_options[:table_options]
         | 
| 125 | 
            +
                    else
         | 
| 126 | 
            +
                      html_code.concat(
         | 
| 127 | 
            +
                        content_tag(
         | 
| 128 | 
            +
                          'table', table_thead.html_safe, id: element_id, class: 'display'
         | 
| 129 | 
            +
                        )
         | 
| 130 | 
            +
                      )
         | 
| 131 | 
            +
                    end
         | 
| 132 | 
            +
                  end
         | 
| 133 | 
            +
             | 
| 134 | 
            +
                  def draw_table_thead_from_html_options(element_id, html_code, table_thead)
         | 
| 135 | 
            +
                    html_options[:table_options][:id] = element_id
         | 
| 136 | 
            +
                    html_options[:table_options][:class] ||= 'display'
         | 
| 137 | 
            +
                    table_thead = html_options[:table_options].delete(:table_thead) if
         | 
| 138 | 
            +
                    html_options[:table_options][:table_thead]
         | 
| 139 | 
            +
                    html_code.concat(
         | 
| 140 | 
            +
                      content_tag('table', table_thead.html_safe, html_options[:table_options])
         | 
| 141 | 
            +
                    )
         | 
| 142 | 
            +
                  end
         | 
| 143 | 
            +
                end
         | 
| 87 144 |  | 
| 88 145 | 
             
                class DataTable
         | 
| 89 146 | 
             
                  include ActionView::Helpers::TagHelper # to use content_tag
         | 
| @@ -1,44 +1,52 @@ | |
| 1 | 
            +
            require 'daru/data_tables/constants_data_table'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module Daru
         | 
| 2 | 
            -
              module  | 
| 4 | 
            +
              module View
         | 
| 3 5 | 
             
                # generate initializing code
         | 
| 4 6 | 
             
                def self.generate_init_code_js(dependent_js)
         | 
| 5 | 
            -
                  js_dir = File.expand_path( | 
| 6 | 
            -
             | 
| 7 | 
            +
                  js_dir = File.expand_path(
         | 
| 8 | 
            +
                    '../../../../vendor/assets/javascripts', __dir__
         | 
| 9 | 
            +
                  )
         | 
| 10 | 
            +
                  path = File.expand_path('../templates/init.inline.js.erb', __dir__)
         | 
| 7 11 | 
             
                  template = File.read(path)
         | 
| 8 12 | 
             
                  ERB.new(template).result(binding)
         | 
| 9 13 | 
             
                end
         | 
| 10 14 |  | 
| 11 15 | 
             
                def self.generate_init_code_css(dependent_css)
         | 
| 12 | 
            -
                  css_dir = File.expand_path( | 
| 13 | 
            -
             | 
| 16 | 
            +
                  css_dir = File.expand_path(
         | 
| 17 | 
            +
                    '../../../../vendor/assets/stylesheets', __dir__
         | 
| 18 | 
            +
                  )
         | 
| 19 | 
            +
                  path = File.expand_path('../templates/init.inline.css.erb', __dir__)
         | 
| 14 20 | 
             
                  template = File.read(path)
         | 
| 15 21 | 
             
                  ERB.new(template).result(binding)
         | 
| 16 22 | 
             
                end
         | 
| 17 23 |  | 
| 18 | 
            -
                 | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
                   | 
| 29 | 
            -
             | 
| 30 | 
            -
                   | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 24 | 
            +
                class DataTables
         | 
| 25 | 
            +
                  # Enable to show plots on IRuby notebook.
         | 
| 26 | 
            +
                  # Load the dependent JS files in IRuby notebook. Those JS will help in
         | 
| 27 | 
            +
                  # plotting the table in IRuby cell.
         | 
| 28 | 
            +
                  #
         | 
| 29 | 
            +
                  # One can see the loaded JS files in the source code of the notebook.
         | 
| 30 | 
            +
                  # @example
         | 
| 31 | 
            +
                  #
         | 
| 32 | 
            +
                  # DataTables.init_iruby
         | 
| 33 | 
            +
                  #
         | 
| 34 | 
            +
                  def self.init_iruby(
         | 
| 35 | 
            +
                    dependent_js=DATATABLES_DEPENDENCIES_IRUBY
         | 
| 36 | 
            +
                  )
         | 
| 37 | 
            +
                    # dependent_css=['jquery.dataTables.css']
         | 
| 38 | 
            +
                    # Note: Jquery is dependecy for DataTables.
         | 
| 39 | 
            +
                    # Since Jquery is already a dependency for iruby notebook.
         | 
| 40 | 
            +
                    # So it will be loaded into IRuby notebook when `iruby` is run.
         | 
| 41 | 
            +
                    # No need to add it in the `dependent_js`.
         | 
| 42 | 
            +
                    js = generate_init_code_js(dependent_js)
         | 
| 43 | 
            +
                    # TODO: don't know how to import css like js
         | 
| 44 | 
            +
                    # css = generate_init_code_css(dependent_css)
         | 
| 45 | 
            +
                    IRuby.display(IRuby.javascript(js))
         | 
| 46 | 
            +
                    # IRuby.display(css, mime: 'text/stylesheet')
         | 
| 47 | 
            +
                    # FixMe: Don't know, how to add css in IRuby notebook (Means there is
         | 
| 48 | 
            +
                    # no IRuby.stylesheet(..) method)
         | 
| 49 | 
            +
                  end
         | 
| 42 50 | 
             
                end
         | 
| 43 51 | 
             
              end
         | 
| 44 52 | 
             
            end
         | 
| @@ -1,38 +1,85 @@ | |
| 1 1 | 
             
            require_relative 'param_helpers'
         | 
| 2 | 
            +
            require_relative '../core_ext/string'
         | 
| 2 3 |  | 
| 3 4 | 
             
            module Daru
         | 
| 4 | 
            -
              module  | 
| 5 | 
            +
              module View
         | 
| 5 6 | 
             
                module JsHelpers
         | 
| 6 | 
            -
                  include Daru:: | 
| 7 | 
            +
                  include Daru::View::ParamHelpers
         | 
| 7 8 |  | 
| 8 | 
            -
                  #  | 
| 9 | 
            -
                  #
         | 
| 10 | 
            -
                  #  | 
| 11 | 
            -
                  #  *element_id            [Required] The ID of the DIV element that the DataTable should be rendered in.
         | 
| 9 | 
            +
                  # @param id [String] The ID of the DIV element that the DataTable
         | 
| 10 | 
            +
                  #   should be rendered in
         | 
| 11 | 
            +
                  # @return [String] Generates JavaScript function for rendering the Table.
         | 
| 12 12 | 
             
                  def draw_js(element_id)
         | 
| 13 | 
            +
                    if options[:data] && options[:data].length >= 50_000
         | 
| 14 | 
            +
                      data_array = extract_data_array
         | 
| 15 | 
            +
                      draw_ajax_option
         | 
| 16 | 
            +
                    end
         | 
| 13 17 | 
             
                    js = ''
         | 
| 14 | 
            -
                    # js << "\n$(function() {"
         | 
| 15 18 | 
             
                    js << "\n$(document).ready(function() {"
         | 
| 16 19 | 
             
                    js << "\n"
         | 
| 17 | 
            -
                     | 
| 18 | 
            -
                    js << "\n | 
| 19 | 
            -
                    js << "\n | 
| 20 | 
            -
                    js << "\n | 
| 20 | 
            +
                    js << "\n\tvar data_array = #{data_array};" unless options[:data]
         | 
| 21 | 
            +
                    js << "\n\t$('##{element_id}').DataTable("
         | 
| 22 | 
            +
                    js << "\n\t\t#{js_parameters(@options)}"
         | 
| 23 | 
            +
                    js << "\n\t);"
         | 
| 21 24 | 
             
                    js << "\n"
         | 
| 22 25 | 
             
                    js << "\n});"
         | 
| 23 26 | 
             
                    js
         | 
| 24 27 | 
             
                  end
         | 
| 25 28 |  | 
| 29 | 
            +
                  # @param id [String] The ID of the DIV element that the DataTable
         | 
| 30 | 
            +
                  #   should be rendered in
         | 
| 31 | 
            +
                  # @return [String] Generates JavaScript function for rendering the Table
         | 
| 32 | 
            +
                  #   in IRuby notebook
         | 
| 26 33 | 
             
                  def draw_js_iruby(element_id)
         | 
| 34 | 
            +
                    if options[:data] && options[:data].length >= 50_000
         | 
| 35 | 
            +
                      data_array = extract_data_array
         | 
| 36 | 
            +
                      draw_ajax_option
         | 
| 37 | 
            +
                    end
         | 
| 27 38 | 
             
                    js = ''
         | 
| 28 39 | 
             
                    js << "\n$( function () {"
         | 
| 29 | 
            -
                    js << "\n | 
| 30 | 
            -
                    js << "\n | 
| 31 | 
            -
                    js << "\n | 
| 40 | 
            +
                    js << "\n\tvar data_array = #{data_array};" unless options[:data]
         | 
| 41 | 
            +
                    js << "\n\tvar table = $('##{element_id}').DataTable("
         | 
| 42 | 
            +
                    js << "\n\t\t#{js_parameters(@options)}"
         | 
| 43 | 
            +
                    js << "\n\t);"
         | 
| 32 44 | 
             
                    js << "\n"
         | 
| 33 45 | 
             
                    js << "\n});"
         | 
| 34 46 | 
             
                    js
         | 
| 35 47 | 
             
                  end
         | 
| 36 | 
            -
             | 
| 48 | 
            +
             | 
| 49 | 
            +
                  # @return [Array, void] returns data Array if present in the options
         | 
| 50 | 
            +
                  def extract_data_array
         | 
| 51 | 
            +
                    options.delete(:data) unless options[:data].nil?
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  # @return [void] adds serverSide and ajax options
         | 
| 55 | 
            +
                  def draw_ajax_option
         | 
| 56 | 
            +
                    ajax_str = ''
         | 
| 57 | 
            +
                    ajax_str << "\nfunction ( data, callback, settings ) {"
         | 
| 58 | 
            +
                    ajax_str << "\n\tvar out = [];"
         | 
| 59 | 
            +
                    ajax_str << "\n\tfor (var i=data.start; i<data.start+data.length; i++) {"
         | 
| 60 | 
            +
                    ajax_str << "\n\t\tif (i < data_array.length) {"
         | 
| 61 | 
            +
                    ajax_str << "\n\t\t\tout.push( data_array[i] );"
         | 
| 62 | 
            +
                    ajax_str << "\n\t\t}"
         | 
| 63 | 
            +
                    ajax_str << "\n\t}"
         | 
| 64 | 
            +
                    ajax_str << "\n\tsetTimeout( function () {"
         | 
| 65 | 
            +
                    ajax_str << set_callback_ajax
         | 
| 66 | 
            +
                    ajax_str << "\n\t}, 50 );"
         | 
| 67 | 
            +
                    ajax_str << "\n}"
         | 
| 68 | 
            +
                    @options[:serverSide] = true
         | 
| 69 | 
            +
                    @options[:ajax] = ajax_str.js_code
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  # @return [String] returns the callback js from the server
         | 
| 73 | 
            +
                  def set_callback_ajax
         | 
| 74 | 
            +
                    callback_js = ''
         | 
| 75 | 
            +
                    callback_js << "\n\t\tcallback( {"
         | 
| 76 | 
            +
                    callback_js << "\n\t\t\tdraw: data.draw,"
         | 
| 77 | 
            +
                    callback_js << "\n\t\t\tdata: out,"
         | 
| 78 | 
            +
                    callback_js << "\n\t\t\trecordsTotal: data_array.length,"
         | 
| 79 | 
            +
                    callback_js << "\n\t\t\trecordsFiltered: data_array.length,"
         | 
| 80 | 
            +
                    callback_js << "\n\t\t} );"
         | 
| 81 | 
            +
                    callback_js
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 37 84 | 
             
              end
         | 
| 38 85 | 
             
            end
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            require 'date'
         | 
| 2 2 |  | 
| 3 3 | 
             
            module Daru
         | 
| 4 | 
            -
              module  | 
| 4 | 
            +
              module View
         | 
| 5 5 | 
             
                module ParamHelpers
         | 
| 6 6 | 
             
                  def js_parameters(options)
         | 
| 7 7 | 
             
                    return '' if options.nil?
         | 
| @@ -26,6 +26,8 @@ module Daru | |
| 26 26 | 
             
                  # rubocop:disable  Metrics/CyclomaticComplexity, Metrics/AbcSize
         | 
| 27 27 | 
             
                  def typecast(value, type=nil)
         | 
| 28 28 | 
             
                    case
         | 
| 29 | 
            +
                    when value.respond_to?(:js_code) && value.js_code?
         | 
| 30 | 
            +
                      value
         | 
| 29 31 | 
             
                    when value.is_a?(String)
         | 
| 30 32 | 
             
                      value.to_json
         | 
| 31 33 | 
             
                    when value.is_a?(Integer) || value.is_a?(Float)
         | 
| @@ -50,6 +52,8 @@ module Daru | |
| 50 52 | 
             
                      value
         | 
| 51 53 | 
             
                    end
         | 
| 52 54 | 
             
                  end
         | 
| 53 | 
            -
             | 
| 55 | 
            +
                  # rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength
         | 
| 56 | 
            +
                  # rubocop:enable Metrics/CyclomaticComplexity, Metrics/AbcSize
         | 
| 57 | 
            +
                end
         | 
| 54 58 | 
             
              end
         | 
| 55 59 | 
             
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            <thead>
         | 
| 2 | 
            +
              <tr>
         | 
| 3 | 
            +
                <th></th>
         | 
| 4 | 
            +
                <% column_number = 0 %>
         | 
| 5 | 
            +
                <% if data.sample.is_a?(Array)%>
         | 
| 6 | 
            +
                  <% columns = data.sample.length - 1 %>
         | 
| 7 | 
            +
                <% else %>
         | 
| 8 | 
            +
                  <% columns = 1 %>
         | 
| 9 | 
            +
                <% end %>
         | 
| 10 | 
            +
                <% columns.times do %>
         | 
| 11 | 
            +
                  <th>Column: <%=column_number%></th>
         | 
| 12 | 
            +
                  <% column_number += 1 %>
         | 
| 13 | 
            +
                <% end %>
         | 
| 14 | 
            +
              </tr>
         | 
| 15 | 
            +
            </thead>
         | 
    
        data/lib/tasks/data_tables.rake
    CHANGED
    
    | @@ -10,21 +10,23 @@ end | |
| 10 10 | 
             
            namespace :data_tables do
         | 
| 11 11 | 
             
              desc "Update datatables javascript and stylesheets dependent files"
         | 
| 12 12 | 
             
              task :update => [:js, :css, :jquery]
         | 
| 13 | 
            +
              sh "mkdir -p vendor/assets/javascripts/"
         | 
| 13 14 | 
             
              task :js do
         | 
| 14 15 | 
             
                say "Grabbing Core js from datatables codebase..." do
         | 
| 15 | 
            -
                  sh "curl -# https://nightly.datatables.net/js/jquery.dataTables.js -L --compressed -o  | 
| 16 | 
            +
                  sh "curl -# https://nightly.datatables.net/js/jquery.dataTables.js -L --compressed -o vendor/assets/javascripts/jquery.dataTables.js"
         | 
| 16 17 | 
             
                end
         | 
| 17 18 | 
             
              end
         | 
| 18 19 |  | 
| 20 | 
            +
              sh "mkdir -p vendor/assets/stylesheets/"
         | 
| 19 21 | 
             
              task :css do
         | 
| 20 22 | 
             
                say "Grabbing css from the datatables website..." do
         | 
| 21 | 
            -
                  sh "curl -# https://nightly.datatables.net/css/jquery.dataTables.css -L --compressed -o  | 
| 23 | 
            +
                  sh "curl -# https://nightly.datatables.net/css/jquery.dataTables.css -L --compressed -o vendor/assets/stylesheets/jquery.dataTables.css"
         | 
| 22 24 | 
             
                end
         | 
| 23 25 | 
             
              end
         | 
| 24 26 |  | 
| 25 27 | 
             
              task :jquery do
         | 
| 26 28 | 
             
                say "Grabbing jquery from the jquery website..." do
         | 
| 27 | 
            -
                  sh "curl -# http://code.jquery.com/jquery-latest.min.js -L --compressed -o  | 
| 29 | 
            +
                  sh "curl -# http://code.jquery.com/jquery-latest.min.js -L --compressed -o vendor/assets/javascripts/jquery-latest.min.js"
         | 
| 28 30 | 
             
                end
         | 
| 29 31 | 
             
              end
         | 
| 30 32 | 
             
            end
         | 
| 
            File without changes
         | 
| @@ -1,15 +1,15 @@ | |
| 1 | 
            -
            /*! DataTables 1.10. | 
| 2 | 
            -
             * ©2008- | 
| 1 | 
            +
            /*! DataTables 1.10.20-dev
         | 
| 2 | 
            +
             * ©2008-2018 SpryMedia Ltd - datatables.net/license
         | 
| 3 3 | 
             
             */
         | 
| 4 4 |  | 
| 5 5 | 
             
            /**
         | 
| 6 6 | 
             
             * @summary     DataTables
         | 
| 7 7 | 
             
             * @description Paginate, search and order HTML tables
         | 
| 8 | 
            -
             * @version     1.10. | 
| 8 | 
            +
             * @version     1.10.20-dev
         | 
| 9 9 | 
             
             * @file        jquery.dataTables.js
         | 
| 10 10 | 
             
             * @author      SpryMedia Ltd
         | 
| 11 11 | 
             
             * @contact     www.datatables.net
         | 
| 12 | 
            -
             * @copyright   Copyright 2008- | 
| 12 | 
            +
             * @copyright   Copyright 2008-2018 SpryMedia Ltd.
         | 
| 13 13 | 
             
             *
         | 
| 14 14 | 
             
             * This source file is free software, available under the following license:
         | 
| 15 15 | 
             
             *   MIT license - http://datatables.net/license
         | 
| @@ -909,8 +909,11 @@ | |
| 909 909 | 
             
            				var s = allSettings[i];
         | 
| 910 910 |  | 
| 911 911 | 
             
            				/* Base check on table node */
         | 
| 912 | 
            -
            				if ( | 
| 913 | 
            -
             | 
| 912 | 
            +
            				if (
         | 
| 913 | 
            +
            					s.nTable == this ||
         | 
| 914 | 
            +
            					(s.nTHead && s.nTHead.parentNode == this) ||
         | 
| 915 | 
            +
            					(s.nTFoot && s.nTFoot.parentNode == this)
         | 
| 916 | 
            +
            				) {
         | 
| 914 917 | 
             
            					var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
         | 
| 915 918 | 
             
            					var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
         | 
| 916 919 |  | 
| @@ -967,11 +970,7 @@ | |
| 967 970 |  | 
| 968 971 | 
             
            			// Backwards compatibility, before we apply all the defaults
         | 
| 969 972 | 
             
            			_fnCompatOpts( oInit );
         | 
| 970 | 
            -
            			
         | 
| 971 | 
            -
            			if ( oInit.oLanguage )
         | 
| 972 | 
            -
            			{
         | 
| 973 | 
            -
            				_fnLanguageCompat( oInit.oLanguage );
         | 
| 974 | 
            -
            			}
         | 
| 973 | 
            +
            			_fnLanguageCompat( oInit.oLanguage );
         | 
| 975 974 |  | 
| 976 975 | 
             
            			// If the length menu is given, but the init display length is not, use the length menu
         | 
| 977 976 | 
             
            			if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
         | 
| @@ -1354,8 +1353,10 @@ | |
| 1354 1353 | 
             
            	// - fr - Swiss Franc
         | 
| 1355 1354 | 
             
            	// - kr - Swedish krona, Norwegian krone and Danish krone
         | 
| 1356 1355 | 
             
            	// - \u2009 is thin space and \u202F is narrow no-break space, both used in many
         | 
| 1356 | 
            +
            	// - Ƀ - Bitcoin
         | 
| 1357 | 
            +
            	// - Ξ - Ethereum
         | 
| 1357 1358 | 
             
            	//   standards as thousands separators.
         | 
| 1358 | 
            -
            	var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
         | 
| 1359 | 
            +
            	var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi;
         | 
| 1359 1360 |  | 
| 1360 1361 |  | 
| 1361 1362 | 
             
            	var _empty = function ( d ) {
         | 
| @@ -1730,33 +1731,43 @@ | |
| 1730 1731 | 
             
            	 */
         | 
| 1731 1732 | 
             
            	function _fnLanguageCompat( lang )
         | 
| 1732 1733 | 
             
            	{
         | 
| 1734 | 
            +
            		// Note the use of the Hungarian notation for the parameters in this method as
         | 
| 1735 | 
            +
            		// this is called after the mapping of camelCase to Hungarian
         | 
| 1733 1736 | 
             
            		var defaults = DataTable.defaults.oLanguage;
         | 
| 1734 | 
            -
            		var zeroRecords = lang.sZeroRecords;
         | 
| 1735 1737 |  | 
| 1736 | 
            -
            		 | 
| 1737 | 
            -
             | 
| 1738 | 
            -
             | 
| 1739 | 
            -
             | 
| 1740 | 
            -
            			defaults.sEmptyTable === "No data available in table" )
         | 
| 1741 | 
            -
            		{
         | 
| 1742 | 
            -
            			_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
         | 
| 1738 | 
            +
            		// Default mapping
         | 
| 1739 | 
            +
            		var defaultDecimal = defaults.sDecimal;
         | 
| 1740 | 
            +
            		if ( defaultDecimal ) {
         | 
| 1741 | 
            +
            			_addNumericSort( defaultDecimal );
         | 
| 1743 1742 | 
             
            		}
         | 
| 1744 1743 |  | 
| 1745 | 
            -
            		 | 
| 1746 | 
            -
             | 
| 1747 | 
            -
            			defaults.sLoadingRecords === "Loading..." )
         | 
| 1748 | 
            -
            		{
         | 
| 1749 | 
            -
            			_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
         | 
| 1750 | 
            -
            		}
         | 
| 1744 | 
            +
            		if ( lang ) {
         | 
| 1745 | 
            +
            			var zeroRecords = lang.sZeroRecords;
         | 
| 1751 1746 |  | 
| 1752 | 
            -
             | 
| 1753 | 
            -
             | 
| 1754 | 
            -
            			lang. | 
| 1755 | 
            -
             | 
| 1747 | 
            +
            			// Backwards compatibility - if there is no sEmptyTable given, then use the same as
         | 
| 1748 | 
            +
            			// sZeroRecords - assuming that is given.
         | 
| 1749 | 
            +
            			if ( ! lang.sEmptyTable && zeroRecords &&
         | 
| 1750 | 
            +
            				defaults.sEmptyTable === "No data available in table" )
         | 
| 1751 | 
            +
            			{
         | 
| 1752 | 
            +
            				_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
         | 
| 1753 | 
            +
            			}
         | 
| 1754 | 
            +
            	
         | 
| 1755 | 
            +
            			// Likewise with loading records
         | 
| 1756 | 
            +
            			if ( ! lang.sLoadingRecords && zeroRecords &&
         | 
| 1757 | 
            +
            				defaults.sLoadingRecords === "Loading..." )
         | 
| 1758 | 
            +
            			{
         | 
| 1759 | 
            +
            				_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
         | 
| 1760 | 
            +
            			}
         | 
| 1761 | 
            +
            	
         | 
| 1762 | 
            +
            			// Old parameter name of the thousands separator mapped onto the new
         | 
| 1763 | 
            +
            			if ( lang.sInfoThousands ) {
         | 
| 1764 | 
            +
            				lang.sThousands = lang.sInfoThousands;
         | 
| 1765 | 
            +
            			}
         | 
| 1756 1766 |  | 
| 1757 | 
            -
             | 
| 1758 | 
            -
             | 
| 1759 | 
            -
             | 
| 1767 | 
            +
            			var decimal = lang.sDecimal;
         | 
| 1768 | 
            +
            			if ( decimal && defaultDecimal !== decimal ) {
         | 
| 1769 | 
            +
            				_addNumericSort( decimal );
         | 
| 1770 | 
            +
            			}
         | 
| 1760 1771 | 
             
            		}
         | 
| 1761 1772 | 
             
            	}
         | 
| 1762 1773 |  | 
| @@ -3128,7 +3139,7 @@ | |
| 3128 3139 | 
             
            				}
         | 
| 3129 3140 | 
             
            			}
         | 
| 3130 3141 |  | 
| 3131 | 
            -
            			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );
         | 
| 3142 | 
            +
            			_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );
         | 
| 3132 3143 | 
             
            		}
         | 
| 3133 3144 |  | 
| 3134 3145 | 
             
            		// Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
         | 
| @@ -3453,7 +3464,7 @@ | |
| 3453 3464 | 
             
            				// iRowCount and j are not currently documented. Are they at all
         | 
| 3454 3465 | 
             
            				// useful?
         | 
| 3455 3466 | 
             
            				_fnCallbackFire( oSettings, 'aoRowCallback', null,
         | 
| 3456 | 
            -
            					[nRow, aoData._aData, iRowCount, j] );
         | 
| 3467 | 
            +
            					[nRow, aoData._aData, iRowCount, j, iDataIndex] );
         | 
| 3457 3468 |  | 
| 3458 3469 | 
             
            				anRows.push( nRow );
         | 
| 3459 3470 | 
             
            				iRowCount++;
         | 
| @@ -3857,12 +3868,12 @@ | |
| 3857 3868 | 
             
            		{
         | 
| 3858 3869 | 
             
            			ajaxData = ajax.data;
         | 
| 3859 3870 |  | 
| 3860 | 
            -
            			var newData =  | 
| 3871 | 
            +
            			var newData = typeof ajaxData === 'function' ?
         | 
| 3861 3872 | 
             
            				ajaxData( data, oSettings ) :  // fn can manipulate data or return
         | 
| 3862 3873 | 
             
            				ajaxData;                      // an object object or array to merge
         | 
| 3863 3874 |  | 
| 3864 3875 | 
             
            			// If the function returned something, use that alone
         | 
| 3865 | 
            -
            			data =  | 
| 3876 | 
            +
            			data = typeof ajaxData === 'function' && newData ?
         | 
| 3866 3877 | 
             
            				newData :
         | 
| 3867 3878 | 
             
            				$.extend( true, data, newData );
         | 
| 3868 3879 |  | 
| @@ -3926,7 +3937,7 @@ | |
| 3926 3937 | 
             
            				url: ajax || oSettings.sAjaxSource
         | 
| 3927 3938 | 
             
            			} ) );
         | 
| 3928 3939 | 
             
            		}
         | 
| 3929 | 
            -
            		else if (  | 
| 3940 | 
            +
            		else if ( typeof ajax === 'function' )
         | 
| 3930 3941 | 
             
            		{
         | 
| 3931 3942 | 
             
            			// Is a function - let the caller define what needs to be done
         | 
| 3932 3943 | 
             
            			oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
         | 
| @@ -4809,7 +4820,12 @@ | |
| 4809 4820 | 
             
            		} );
         | 
| 4810 4821 |  | 
| 4811 4822 | 
             
            		for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
         | 
| 4812 | 
            -
            			select[0][ i ] = new Option( | 
| 4823 | 
            +
            			select[0][ i ] = new Option(
         | 
| 4824 | 
            +
            				typeof language[i] === 'number' ?
         | 
| 4825 | 
            +
            					settings.fnFormatNumber( language[i] ) :
         | 
| 4826 | 
            +
            					language[i],
         | 
| 4827 | 
            +
            				lengths[i]
         | 
| 4828 | 
            +
            			);
         | 
| 4813 4829 | 
             
            		}
         | 
| 4814 4830 |  | 
| 4815 4831 | 
             
            		var div = $('<div><label/></div>').addClass( classes.sLength );
         | 
| @@ -5355,14 +5371,18 @@ | |
| 5355 5371 | 
             
            		// both match, but we want to hide it completely. We want to also fix their
         | 
| 5356 5372 | 
             
            		// width to what they currently are
         | 
| 5357 5373 | 
             
            		_fnApplyToChildren( function(nSizer, i) {
         | 
| 5358 | 
            -
            			nSizer.innerHTML = '<div class="dataTables_sizing" | 
| 5374 | 
            +
            			nSizer.innerHTML = '<div class="dataTables_sizing">'+headerContent[i]+'</div>';
         | 
| 5375 | 
            +
            			nSizer.childNodes[0].style.height = "0";
         | 
| 5376 | 
            +
            			nSizer.childNodes[0].style.overflow = "hidden";
         | 
| 5359 5377 | 
             
            			nSizer.style.width = headerWidths[i];
         | 
| 5360 5378 | 
             
            		}, headerSrcEls );
         | 
| 5361 5379 |  | 
| 5362 5380 | 
             
            		if ( footer )
         | 
| 5363 5381 | 
             
            		{
         | 
| 5364 5382 | 
             
            			_fnApplyToChildren( function(nSizer, i) {
         | 
| 5365 | 
            -
            				nSizer.innerHTML = '<div class="dataTables_sizing" | 
| 5383 | 
            +
            				nSizer.innerHTML = '<div class="dataTables_sizing">'+footerContent[i]+'</div>';
         | 
| 5384 | 
            +
            				nSizer.childNodes[0].style.height = "0";
         | 
| 5385 | 
            +
            				nSizer.childNodes[0].style.overflow = "hidden";
         | 
| 5366 5386 | 
             
            				nSizer.style.width = footerWidths[i];
         | 
| 5367 5387 | 
             
            			}, footerSrcEls );
         | 
| 5368 5388 | 
             
            		}
         | 
| @@ -6556,7 +6576,7 @@ | |
| 6556 6576 | 
             
            	{
         | 
| 6557 6577 | 
             
            		$(n)
         | 
| 6558 6578 | 
             
            			.on( 'click.DT', oData, function (e) {
         | 
| 6559 | 
            -
            					n.blur(); // Remove focus outline for mouse users
         | 
| 6579 | 
            +
            					$(n).blur(); // Remove focus outline for mouse users
         | 
| 6560 6580 | 
             
            					fn(e);
         | 
| 6561 6581 | 
             
            				} )
         | 
| 6562 6582 | 
             
            			.on( 'keypress.DT', oData, function (e){
         | 
| @@ -7796,13 +7816,26 @@ | |
| 7796 7816 | 
             
            			}
         | 
| 7797 7817 | 
             
            		}
         | 
| 7798 7818 | 
             
            		else if ( order == 'current' || order == 'applied' ) {
         | 
| 7799 | 
            -
            			 | 
| 7800 | 
            -
            				displayMaster.slice() | 
| 7801 | 
            -
             | 
| 7802 | 
            -
             | 
| 7803 | 
            -
             | 
| 7804 | 
            -
             | 
| 7805 | 
            -
             | 
| 7819 | 
            +
            			if ( search == 'none') {
         | 
| 7820 | 
            +
            				a = displayMaster.slice();
         | 
| 7821 | 
            +
            			}
         | 
| 7822 | 
            +
            			else if ( search == 'applied' ) {
         | 
| 7823 | 
            +
            				a = displayFiltered.slice();
         | 
| 7824 | 
            +
            			}
         | 
| 7825 | 
            +
            			else if ( search == 'removed' ) {
         | 
| 7826 | 
            +
            				// O(n+m) solution by creating a hash map
         | 
| 7827 | 
            +
            				var displayFilteredMap = {};
         | 
| 7828 | 
            +
            	
         | 
| 7829 | 
            +
            				for ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {
         | 
| 7830 | 
            +
            					displayFilteredMap[displayFiltered[i]] = null;
         | 
| 7831 | 
            +
            				}
         | 
| 7832 | 
            +
            	
         | 
| 7833 | 
            +
            				a = $.map( displayMaster, function (el) {
         | 
| 7834 | 
            +
            					return ! displayFilteredMap.hasOwnProperty(el) ?
         | 
| 7835 | 
            +
            						el :
         | 
| 7836 | 
            +
            						null;
         | 
| 7837 | 
            +
            				} );
         | 
| 7838 | 
            +
            			}
         | 
| 7806 7839 | 
             
            		}
         | 
| 7807 7840 | 
             
            		else if ( order == 'index' || order == 'original' ) {
         | 
| 7808 7841 | 
             
            			for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
         | 
| @@ -7835,14 +7868,13 @@ | |
| 7835 7868 | 
             
            	 * {array}     - jQuery array of nodes, or simply an array of TR nodes
         | 
| 7836 7869 | 
             
            	 *
         | 
| 7837 7870 | 
             
            	 */
         | 
| 7838 | 
            -
            	
         | 
| 7839 | 
            -
            	
         | 
| 7840 7871 | 
             
            	var __row_selector = function ( settings, selector, opts )
         | 
| 7841 7872 | 
             
            	{
         | 
| 7842 7873 | 
             
            		var rows;
         | 
| 7843 7874 | 
             
            		var run = function ( sel ) {
         | 
| 7844 7875 | 
             
            			var selInt = _intVal( sel );
         | 
| 7845 7876 | 
             
            			var i, ien;
         | 
| 7877 | 
            +
            			var aoData = settings.aoData;
         | 
| 7846 7878 |  | 
| 7847 7879 | 
             
            			// Short cut - selector is a number and no options provided (default is
         | 
| 7848 7880 | 
             
            			// all records, so no need to check if the index is in there, since it
         | 
| @@ -7867,23 +7899,26 @@ | |
| 7867 7899 | 
             
            			// Selector - function
         | 
| 7868 7900 | 
             
            			if ( typeof sel === 'function' ) {
         | 
| 7869 7901 | 
             
            				return $.map( rows, function (idx) {
         | 
| 7870 | 
            -
            					var row =  | 
| 7902 | 
            +
            					var row = aoData[ idx ];
         | 
| 7871 7903 | 
             
            					return sel( idx, row._aData, row.nTr ) ? idx : null;
         | 
| 7872 7904 | 
             
            				} );
         | 
| 7873 7905 | 
             
            			}
         | 
| 7874 7906 |  | 
| 7875 | 
            -
            			// Get nodes in the order from the `rows` array with null values removed
         | 
| 7876 | 
            -
            			var nodes = _removeEmpty(
         | 
| 7877 | 
            -
            				_pluck_order( settings.aoData, rows, 'nTr' )
         | 
| 7878 | 
            -
            			);
         | 
| 7879 | 
            -
            	
         | 
| 7880 7907 | 
             
            			// Selector - node
         | 
| 7881 7908 | 
             
            			if ( sel.nodeName ) {
         | 
| 7882 | 
            -
            				 | 
| 7883 | 
            -
             | 
| 7909 | 
            +
            				var rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup
         | 
| 7910 | 
            +
            				var cellIdx = sel._DT_CellIndex;
         | 
| 7911 | 
            +
            	
         | 
| 7912 | 
            +
            				if ( rowIdx !== undefined ) {
         | 
| 7913 | 
            +
            					// Make sure that the row is actually still present in the table
         | 
| 7914 | 
            +
            					return aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?
         | 
| 7915 | 
            +
            						[ rowIdx ] :
         | 
| 7916 | 
            +
            						[];
         | 
| 7884 7917 | 
             
            				}
         | 
| 7885 | 
            -
            				else if (  | 
| 7886 | 
            -
            					return [  | 
| 7918 | 
            +
            				else if ( cellIdx ) {
         | 
| 7919 | 
            +
            					return aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel.parentNode ?
         | 
| 7920 | 
            +
            						[ cellIdx.row ] :
         | 
| 7921 | 
            +
            						[];
         | 
| 7887 7922 | 
             
            				}
         | 
| 7888 7923 | 
             
            				else {
         | 
| 7889 7924 | 
             
            					var host = $(sel).closest('*[data-dt-row]');
         | 
| @@ -7912,6 +7947,11 @@ | |
| 7912 7947 | 
             
            				// need to fall through to jQuery in case there is DOM id that
         | 
| 7913 7948 | 
             
            				// matches
         | 
| 7914 7949 | 
             
            			}
         | 
| 7950 | 
            +
            			
         | 
| 7951 | 
            +
            			// Get nodes in the order from the `rows` array with null values removed
         | 
| 7952 | 
            +
            			var nodes = _removeEmpty(
         | 
| 7953 | 
            +
            				_pluck_order( settings.aoData, rows, 'nTr' )
         | 
| 7954 | 
            +
            			);
         | 
| 7915 7955 |  | 
| 7916 7956 | 
             
            			// Selector - jQuery selector string, array of nodes or jQuery object/
         | 
| 7917 7957 | 
             
            			// As jQuery's .filter() allows jQuery objects to be passed in filter,
         | 
| @@ -8031,6 +8071,11 @@ | |
| 8031 8071 | 
             
            			_fnDeleteIndex( settings.aiDisplay, row );
         | 
| 8032 8072 | 
             
            			_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
         | 
| 8033 8073 |  | 
| 8074 | 
            +
            			// For server-side processing tables - subtract the deleted row from the count
         | 
| 8075 | 
            +
            			if ( settings._iRecordsDisplay > 0 ) {
         | 
| 8076 | 
            +
            				settings._iRecordsDisplay--;
         | 
| 8077 | 
            +
            			}
         | 
| 8078 | 
            +
            	
         | 
| 8034 8079 | 
             
            			// Check for an 'overflow' they case for displaying the table
         | 
| 8035 8080 | 
             
            			_fnLengthOverflow( settings );
         | 
| 8036 8081 |  | 
| @@ -8101,7 +8146,13 @@ | |
| 8101 8146 | 
             
            		}
         | 
| 8102 8147 |  | 
| 8103 8148 | 
             
            		// Set
         | 
| 8104 | 
            -
            		ctx[0].aoData[ this[0] ] | 
| 8149 | 
            +
            		var row = ctx[0].aoData[ this[0] ];
         | 
| 8150 | 
            +
            		row._aData = data;
         | 
| 8151 | 
            +
            	
         | 
| 8152 | 
            +
            		// If the DOM has an id, and the data source is an array
         | 
| 8153 | 
            +
            		if ( $.isArray( data ) && row.nTr.id ) {
         | 
| 8154 | 
            +
            			_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );
         | 
| 8155 | 
            +
            		}
         | 
| 8105 8156 |  | 
| 8106 8157 | 
             
            		// Automatically invalidate
         | 
| 8107 8158 | 
             
            		_fnInvalidate( ctx[0], this[0], 'data' );
         | 
| @@ -8527,6 +8578,12 @@ | |
| 8527 8578 | 
             
            		_fnDrawHead( settings, settings.aoHeader );
         | 
| 8528 8579 | 
             
            		_fnDrawHead( settings, settings.aoFooter );
         | 
| 8529 8580 |  | 
| 8581 | 
            +
            		// Update colspan for no records display. Child rows and extensions will use their own
         | 
| 8582 | 
            +
            		// listeners to do this - only need to update the empty table item here
         | 
| 8583 | 
            +
            		if ( ! settings.aiDisplay.length ) {
         | 
| 8584 | 
            +
            			$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));
         | 
| 8585 | 
            +
            		}
         | 
| 8586 | 
            +
            	
         | 
| 8530 8587 | 
             
            		_fnSaveState( settings );
         | 
| 8531 8588 | 
             
            	};
         | 
| 8532 8589 |  | 
| @@ -8692,7 +8749,10 @@ | |
| 8692 8749 |  | 
| 8693 8750 | 
             
            			// Selector - index
         | 
| 8694 8751 | 
             
            			if ( $.isPlainObject( s ) ) {
         | 
| 8695 | 
            -
            				 | 
| 8752 | 
            +
            				// Valid cell index and its in the array of selectable rows
         | 
| 8753 | 
            +
            				return s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?
         | 
| 8754 | 
            +
            					[s] :
         | 
| 8755 | 
            +
            					[];
         | 
| 8696 8756 | 
             
            			}
         | 
| 8697 8757 |  | 
| 8698 8758 | 
             
            			// Selector - jQuery filtered cells
         | 
| @@ -8755,12 +8815,19 @@ | |
| 8755 8815 | 
             
            			} );
         | 
| 8756 8816 | 
             
            		}
         | 
| 8757 8817 |  | 
| 8818 | 
            +
            		// The default built in options need to apply to row and columns
         | 
| 8819 | 
            +
            		var internalOpts = opts ? {
         | 
| 8820 | 
            +
            			page: opts.page,
         | 
| 8821 | 
            +
            			order: opts.order,
         | 
| 8822 | 
            +
            			search: opts.search
         | 
| 8823 | 
            +
            		} : {};
         | 
| 8824 | 
            +
            	
         | 
| 8758 8825 | 
             
            		// Row + column selector
         | 
| 8759 | 
            -
            		var columns = this.columns( columnSelector,  | 
| 8760 | 
            -
            		var rows = this.rows( rowSelector,  | 
| 8826 | 
            +
            		var columns = this.columns( columnSelector, internalOpts );
         | 
| 8827 | 
            +
            		var rows = this.rows( rowSelector, internalOpts );
         | 
| 8761 8828 | 
             
            		var a, i, ien, j, jen;
         | 
| 8762 8829 |  | 
| 8763 | 
            -
            		 | 
| 8830 | 
            +
            		this.iterator( 'table', function ( settings, idx ) {
         | 
| 8764 8831 | 
             
            			a = [];
         | 
| 8765 8832 |  | 
| 8766 8833 | 
             
            			for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
         | 
| @@ -8771,10 +8838,11 @@ | |
| 8771 8838 | 
             
            					} );
         | 
| 8772 8839 | 
             
            				}
         | 
| 8773 8840 | 
             
            			}
         | 
| 8774 | 
            -
            	
         | 
| 8775 | 
            -
            			return a;
         | 
| 8776 8841 | 
             
            		}, 1 );
         | 
| 8777 8842 |  | 
| 8843 | 
            +
            	    // Now pass through the cell selector for options
         | 
| 8844 | 
            +
            	    var cells = this.cells( a, opts );
         | 
| 8845 | 
            +
            	
         | 
| 8778 8846 | 
             
            		$.extend( cells.selector, {
         | 
| 8779 8847 | 
             
            			cols: columnSelector,
         | 
| 8780 8848 | 
             
            			rows: rowSelector,
         | 
| @@ -9402,7 +9470,7 @@ | |
| 9402 9470 | 
             
            	 *  @type string
         | 
| 9403 9471 | 
             
            	 *  @default Version number
         | 
| 9404 9472 | 
             
            	 */
         | 
| 9405 | 
            -
            	DataTable.version = "1.10. | 
| 9473 | 
            +
            	DataTable.version = "1.10.20-dev";
         | 
| 9406 9474 |  | 
| 9407 9475 | 
             
            	/**
         | 
| 9408 9476 | 
             
            	 * Private data store, containing all of the settings objects that are
         | 
| @@ -12340,8 +12408,8 @@ | |
| 12340 12408 | 
             
            		 *          { "data": "engine" },
         | 
| 12341 12409 | 
             
            		 *          { "data": "browser" },
         | 
| 12342 12410 | 
             
            		 *          { "data": "platform.inner" },
         | 
| 12343 | 
            -
            		 *          { "data": " | 
| 12344 | 
            -
            		 *          { "data": " | 
| 12411 | 
            +
            		 *          { "data": "details.0" },
         | 
| 12412 | 
            +
            		 *          { "data": "details.1" }
         | 
| 12345 12413 | 
             
            		 *        ]
         | 
| 12346 12414 | 
             
            		 *      } );
         | 
| 12347 12415 | 
             
            		 *    } );
         | 
| @@ -14138,7 +14206,7 @@ | |
| 14138 14206 | 
             
            			 *    $.fn.dataTable.ext.type.detect.push(
         | 
| 14139 14207 | 
             
            			 *      function ( data, settings ) {
         | 
| 14140 14208 | 
             
            			 *        // Check the numeric part
         | 
| 14141 | 
            -
            			 *        if ( !  | 
| 14209 | 
            +
            			 *        if ( ! data.substring(1).match(/[0-9]/) ) {
         | 
| 14142 14210 | 
             
            			 *          return null;
         | 
| 14143 14211 | 
             
            			 *        }
         | 
| 14144 14212 | 
             
            			 *
         | 
| @@ -14721,7 +14789,8 @@ | |
| 14721 14789 | 
             
            	$.extend( _ext.type.order, {
         | 
| 14722 14790 | 
             
            		// Dates
         | 
| 14723 14791 | 
             
            		"date-pre": function ( d ) {
         | 
| 14724 | 
            -
            			 | 
| 14792 | 
            +
            			var ts = Date.parse( d );
         | 
| 14793 | 
            +
            			return isNaN(ts) ? -Infinity : ts;
         | 
| 14725 14794 | 
             
            		},
         | 
| 14726 14795 |  | 
| 14727 14796 | 
             
            		// html
         | 
| @@ -14912,7 +14981,8 @@ | |
| 14912 14981 |  | 
| 14913 14982 | 
             
            		text: function () {
         | 
| 14914 14983 | 
             
            			return {
         | 
| 14915 | 
            -
            				display: __htmlEscapeEntities
         | 
| 14984 | 
            +
            				display: __htmlEscapeEntities,
         | 
| 14985 | 
            +
            				filter: __htmlEscapeEntities
         | 
| 14916 14986 | 
             
            			};
         | 
| 14917 14987 | 
             
            		}
         | 
| 14918 14988 | 
             
            	};
         | 
| @@ -15037,6 +15107,7 @@ | |
| 15037 15107 | 
             
            		_fnRenderer: _fnRenderer,
         | 
| 15038 15108 | 
             
            		_fnDataSource: _fnDataSource,
         | 
| 15039 15109 | 
             
            		_fnRowAttributes: _fnRowAttributes,
         | 
| 15110 | 
            +
            		_fnExtend: _fnExtend,
         | 
| 15040 15111 | 
             
            		_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
         | 
| 15041 15112 | 
             
            		                                // in 1.10, so this dead-end function is
         | 
| 15042 15113 | 
             
            		                                // added to prevent errors
         | 
| @@ -414,7 +414,7 @@ table.dataTable td { | |
| 414 414 | 
             
            .dataTables_wrapper.no-footer .dataTables_scrollBody {
         | 
| 415 415 | 
             
              border-bottom: 1px solid #111111;
         | 
| 416 416 | 
             
            }
         | 
| 417 | 
            -
            .dataTables_wrapper.no-footer div.dataTables_scrollHead  | 
| 417 | 
            +
            .dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,
         | 
| 418 418 | 
             
            .dataTables_wrapper.no-footer div.dataTables_scrollBody > table {
         | 
| 419 419 | 
             
              border-bottom: none;
         | 
| 420 420 | 
             
            }
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: daru-data_tables
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.5
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - shekharrajak
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2018-12-02 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -67,27 +67,13 @@ dependencies: | |
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 68 | 
             
                    version: '0'
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            -
              name:  | 
| 71 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 | 
            -
                requirements:
         | 
| 73 | 
            -
                - - "~>"
         | 
| 74 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: '3.4'
         | 
| 76 | 
            -
              type: :development
         | 
| 77 | 
            -
              prerelease: false
         | 
| 78 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 | 
            -
                requirements:
         | 
| 80 | 
            -
                - - "~>"
         | 
| 81 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: '3.4'
         | 
| 83 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 84 | 
            -
              name: simplecov
         | 
| 70 | 
            +
              name: daru
         | 
| 85 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 86 72 | 
             
                requirements:
         | 
| 87 73 | 
             
                - - ">="
         | 
| 88 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 89 75 | 
             
                    version: '0'
         | 
| 90 | 
            -
              type: : | 
| 76 | 
            +
              type: :runtime
         | 
| 91 77 | 
             
              prerelease: false
         | 
| 92 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 93 79 | 
             
                requirements:
         | 
| @@ -129,9 +115,12 @@ executables: [] | |
| 129 115 | 
             
            extensions: []
         | 
| 130 116 | 
             
            extra_rdoc_files: []
         | 
| 131 117 | 
             
            files:
         | 
| 118 | 
            +
            - ".CHANGELOG.md.swp"
         | 
| 132 119 | 
             
            - ".gitignore"
         | 
| 133 120 | 
             
            - ".rubocop.yml"
         | 
| 121 | 
            +
            - ".simplecov"
         | 
| 134 122 | 
             
            - ".travis.yml"
         | 
| 123 | 
            +
            - CHANGELOG.md
         | 
| 135 124 | 
             
            - CODE_OF_CONDUCT.md
         | 
| 136 125 | 
             
            - Gemfile
         | 
| 137 126 | 
             
            - LICENSE.txt
         | 
| @@ -139,20 +128,23 @@ files: | |
| 139 128 | 
             
            - Rakefile
         | 
| 140 129 | 
             
            - daru-data_tables.gemspec
         | 
| 141 130 | 
             
            - lib/daru/data_tables.rb
         | 
| 142 | 
            -
            - lib/daru/data_tables/ | 
| 131 | 
            +
            - lib/daru/data_tables/constants_data_table.rb
         | 
| 132 | 
            +
            - lib/daru/data_tables/core_ext/string.rb
         | 
| 143 133 | 
             
            - lib/daru/data_tables/data_table.rb
         | 
| 144 134 | 
             
            - lib/daru/data_tables/display/display.rb
         | 
| 145 135 | 
             
            - lib/daru/data_tables/display/iruby_notebook.rb
         | 
| 146 136 | 
             
            - lib/daru/data_tables/generate_js/generate_js.rb
         | 
| 147 137 | 
             
            - lib/daru/data_tables/generate_js/param_helpers.rb
         | 
| 148 | 
            -
            - lib/daru/data_tables/js/jquery-latest.min.js
         | 
| 149 | 
            -
            - lib/daru/data_tables/js/jquery.dataTables.js
         | 
| 150 138 | 
             
            - lib/daru/data_tables/templates/init.inline.css.erb
         | 
| 151 139 | 
             
            - lib/daru/data_tables/templates/init.inline.js.erb
         | 
| 152 140 | 
             
            - lib/daru/data_tables/templates/table_script.erb
         | 
| 141 | 
            +
            - lib/daru/data_tables/templates/thead.erb
         | 
| 153 142 | 
             
            - lib/daru/data_tables/version.rb
         | 
| 154 143 | 
             
            - lib/tasks/data_tables.rake
         | 
| 155 144 | 
             
            - travis.yaml
         | 
| 145 | 
            +
            - vendor/assets/javascripts/jquery-latest.min.js
         | 
| 146 | 
            +
            - vendor/assets/javascripts/jquery.dataTables.js
         | 
| 147 | 
            +
            - vendor/assets/stylesheets/jquery.dataTables.css
         | 
| 156 148 | 
             
            homepage: https://github.com/shekharrajak/data_tables
         | 
| 157 149 | 
             
            licenses:
         | 
| 158 150 | 
             
            - MIT
         |