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
Reta Boyer voluptatem quaerat architecto 126.0
Sheldon Harvey molestiae laudantium quo 122.0
Jacky Kreiger dolor numquam cumque 115.0
Zackery Dibbert quos aut impedit 114.0
Monserrate Swaniawski et pariatur ut 112.0
Itzel Littel non et est 112.0
Rosanna Schowalter sint ut ea 111.0
Sheldon Harvey non et est 111.0
Eunice Flatley quos aut impedit 110.0
Jennings Stroman consequuntur nihil quo 110.0
Jennings Stroman perferendis quaerat qui 110.0
Syble Ziemann voluptatem quaerat architecto 109.0
Kayli Swaniawski et pariatur ut 109.0
Eunice Flatley non et est 109.0
Fausto Larkin sint ut ea 108.0
Jalyn Mante sint ut ea 108.0
Gretchen Lowe non et est 107.0
Bernhard Buckridge et pariatur ut 107.0
Hortense Leffler consequuntur nihil quo 107.0
Alayna Swaniawski et pariatur ut 107.0
Cristopher Considine molestiae laudantium quo 107.0
Diego Marvin et pariatur ut 106.0
Zackery Dibbert perferendis quaerat qui 106.0
Dorothea Schimmel consequuntur nihil quo 106.0
Nora Hagenes et pariatur ut 105.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>