Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced) Document Grid (Mongoid)

Time Entries Grid


Developer Project Report hours
Jennings Stroman dolor numquam cumque 77.0
Kayli Swaniawski dolor numquam cumque 69.0
Floy Bergnaum dolor numquam cumque 89.0
Lemuel Cummings dolor numquam cumque 82.0
Joshuah Wilderman dolor numquam cumque 66.0
Cathryn Boehm dolor numquam cumque 26.0
Shayne Strosin dolor numquam cumque 75.0
Mathilde Huels dolor numquam cumque 27.0
Bernhard Buckridge dolor numquam cumque 77.0
Blaise Lang dolor numquam cumque 80.0
Ike Bergnaum dolor numquam cumque 88.0
Juliana Blick dolor numquam cumque 63.0
Tod Heller dolor numquam cumque 80.0
Charley Carter dolor numquam cumque 62.0
Laury Jewess dolor numquam cumque 60.0
Elaina Schiller dolor numquam cumque 55.0
Estevan Reilly dolor numquam cumque 49.0
Davion Koepp dolor numquam cumque 77.0
Jalyn Mante dolor numquam cumque 44.0
Reta Boyer dolor numquam cumque 40.0
Albina Morissette dolor numquam cumque 73.0
Nora Hagenes dolor numquam cumque 24.0
Alayna Swaniawski dolor numquam cumque 63.0
Gretchen Lowe dolor numquam cumque 45.0
Broderick Cartwright dolor numquam cumque 48.0

Grid:

class TimeEntriesGrid

  include Datagrid

  #
  # Scope
  #

  scope do
    User.select(
      "users.name, projects.name as project_name, accounts.name as account_name, sum(time_entries.hours) as report_hours"
    ).joins(:time_entries => {:project => :account}).group("projects.name", "users.name", "accounts.name").order("users.name")

  end


  #
  # Filters
  #

  filter(:project_id, :enum,
    :select => lambda {Project.all.map {|p| [p.name, p.id]}},
    :multiple => true,
    :include_blank => false
  ) do |value|
    self.where(:time_entries => {:project_id => value})
  end


  filter(:year, :enum,
         :select => lambda { TimeEntry.all.any? ? (TimeEntry.minimum(:date).year..TimeEntry.maximum(:date).year) : []},
    :include_blank => false,
    :default => lambda {Date.today.year}
  ) do |value|
    self.where(["extract(year from time_entries.date) = ?", value.to_i])
  end

  filter(:month, :enum,
         :select => Date::MONTHNAMES[1..12].enum_for(:each_with_index).collect {|name, index| [name, index + 1]},
         :include_blank => false,
         :default => lambda {Date.today.month}
        ) do |value|

    self.where(["extract(month from time_entries.date) = ?", value.to_i])
  end


  #
  # Columns
  #

  column(:user_name, :header => "Developer", :order => "users.name") do
    self.name
  end
  column(:project_name, :header => "Project", :order => "projects.name")
  column(
    :account_name,
    :header => "Company",
    :order => "accounts.name",
  ) do |model|
    format(model.account_name) do
      render :partial => "time_entries/company", :locals => {:model => model}
    end
  end

  column(:report_hours, order: "sum(time_entries.hours)")

end

Controller:

class TimeEntriesController < ApplicationController

  def index
    @time_entries_grid = TimeEntriesGrid.new(params[:time_entries_grid]) do |scope|
      scope.page(params[:page])
    end
  end
end

View:


<h3>Time Entries Grid</h3>


<div class="left">
  <%= datagrid_form_for @time_entries_grid, url: time_entries_path %>
  <br/>

  <%= datagrid_table(@time_entries_grid) %>
  <%= paginate @time_entries_grid.assets %>

</div>

<div class="right">
  <%= render :partial => "shared/source", :object => @time_entries_grid %>
</div>