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
Cristopher Considine consequuntur nihil quo 30.0
Christa Smith sint ut ea 30.0
Jeffry Osinski sint ut ea 31.0
Gus Jewess non et est 31.0
Mathilde Huels voluptatem quaerat architecto 31.0
Kayli Swaniawski consequuntur nihil quo 31.0
Darius Bins quos aut impedit 32.0
Kasey Lemke sint ut ea 32.0
Gus Jewess minus quaerat quo 32.0
Lemuel Cummings minus quaerat quo 32.0
Domingo Franecki molestiae laudantium quo 32.0
Fausto Larkin non et est 32.0
Makenna Jakubowski perferendis quaerat qui 33.0
Anahi Rice sint ut ea 33.0
Cristopher Considine molestiae laudantium quo 33.0
Cristopher Considine voluptatem quaerat architecto 33.0
Austin Heathcote sint ut ea 33.0
Anderson Brown quos aut impedit 34.0
Walter Cremin molestiae laudantium quo 34.0
Austin Heathcote voluptatem quaerat architecto 34.0
Laury Jewess consequuntur nihil quo 34.0
Gus Jewess sint ut ea 34.0
Isabel Okuneva dolor numquam cumque 35.0
Nora Hagenes minus quaerat quo 35.0
Triston Lynch quos aut impedit 35.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>