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
Itzel Littel non et est 9.0
Nora Hagenes sint ut ea 21.0
Blaise Lang dolor numquam cumque 22.0
Ernie Considine perferendis quaerat qui 22.0
Berniece Weimann dolor numquam cumque 23.0
Ernie Considine sint ut ea 23.0
Kamron Graham minus quaerat quo 24.0
Jalyn Mante perferendis quaerat qui 24.0
Minnie Lueilwitz molestiae laudantium quo 25.0
Mikayla Goldner sint ut ea 25.0
Jennings Stroman molestiae laudantium quo 25.0
Maximillian Ryan consequuntur nihil quo 26.0
Moises Kuhlman sint ut ea 26.0
Kattie Langosh quos aut impedit 26.0
Zackery Dibbert et pariatur ut 27.0
Monroe Rowe dolor numquam cumque 28.0
Joelle Jenkins minus quaerat quo 28.0
Michael King dolor numquam cumque 29.0
Mittie Quigley non et est 29.0
Monroe Rowe non et est 30.0
Wyman McClure et pariatur ut 30.0
Eunice Flatley non et est 30.0
Juliana Blick et pariatur ut 31.0
Christa Smith non et est 31.0
Albina Morissette perferendis quaerat qui 31.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>