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
Rosanna Schowalter sint ut ea 15.0
Makenna Stark dolor numquam cumque 16.0
Berniece Weimann molestiae laudantium quo 17.0
Makenna Stark minus quaerat quo 19.0
Josefa Spinka voluptatem quaerat architecto 19.0
Anderson Brown non et est 22.0
Kattie Langosh non et est 23.0
Lula Hyatt perferendis quaerat qui 23.0
Eunice Flatley minus quaerat quo 24.0
Estevan Reilly voluptatem quaerat architecto 24.0
Broderick Cartwright dolor numquam cumque 24.0
Pierre Abernathy sint ut ea 25.0
Nora Hagenes voluptatem quaerat architecto 25.0
Zackery Dibbert dolor numquam cumque 25.0
Pierre Abernathy non et est 26.0
Benedict Muller consequuntur nihil quo 27.0
Hortense Leffler sint ut ea 27.0
Floy Bergnaum non et est 27.0
Alycia Stracke sint ut ea 28.0
Kattie Langosh dolor numquam cumque 28.0
Makenna Stark consequuntur nihil quo 28.0
Diego Marvin voluptatem quaerat architecto 28.0
Anderson Brown minus quaerat quo 28.0
Michael King quos aut impedit 28.0
Alycia Stracke perferendis quaerat qui 29.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>