Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Penney Schowalter perspiciatis totam perferendis 85.0
Raquel Runolfsson perspiciatis totam perferendis 76.0
Rebecca Rempel perspiciatis totam perferendis 47.0
Reinaldo Heidenreich perspiciatis totam perferendis 61.0
Rossana Schneider perspiciatis totam perferendis 54.0
Royce Spencer perspiciatis totam perferendis 56.0
Salley Kilback perspiciatis totam perferendis 95.0
Shane Glover perspiciatis totam perferendis 62.0
Shannon Botsford perspiciatis totam perferendis 50.0
Shara Labadie perspiciatis totam perferendis 74.0
Sixta Bashirian perspiciatis totam perferendis 115.0
Sylvester Hane perspiciatis totam perferendis 33.0
Tamera Bogan perspiciatis totam perferendis 63.0
Tami Gibson perspiciatis totam perferendis 84.0
Tamika Cronin perspiciatis totam perferendis 67.0
Terisa Ruecker perspiciatis totam perferendis 57.0
Tess Nikolaus perspiciatis totam perferendis 50.0
Thaddeus Stanton perspiciatis totam perferendis 62.0
Treena Wolf perspiciatis totam perferendis 68.0
Verla Friesen perspiciatis totam perferendis 89.0
Vernia Dietrich perspiciatis totam perferendis 84.0
Vivien Murray perspiciatis totam perferendis 95.0
Wen Daniel perspiciatis totam perferendis 56.0
Wiley Wuckert perspiciatis totam perferendis 92.0
Winfred Franecki perspiciatis totam perferendis 74.0

Grid:

class TimeEntriesGrid < BaseGrid

  #
  # 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[:g]) 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>