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 repudiandae officiis qui 34.0
Raquel Runolfsson repudiandae officiis qui 47.0
Rebecca Rempel repudiandae officiis qui 70.0
Reinaldo Heidenreich repudiandae officiis qui 29.0
Rossana Schneider repudiandae officiis qui 33.0
Royce Spencer repudiandae officiis qui 55.0
Salley Kilback repudiandae officiis qui 54.0
Shane Glover repudiandae officiis qui 110.0
Shannon Botsford repudiandae officiis qui 76.0
Shara Labadie repudiandae officiis qui 88.0
Sixta Bashirian repudiandae officiis qui 95.0
Sylvester Hane repudiandae officiis qui 27.0
Tamera Bogan repudiandae officiis qui 80.0
Tami Gibson repudiandae officiis qui 40.0
Tamika Cronin repudiandae officiis qui 105.0
Terisa Ruecker repudiandae officiis qui 67.0
Tess Nikolaus repudiandae officiis qui 77.0
Thaddeus Stanton repudiandae officiis qui 49.0
Treena Wolf repudiandae officiis qui 57.0
Verla Friesen repudiandae officiis qui 105.0
Vernia Dietrich repudiandae officiis qui 68.0
Vivien Murray repudiandae officiis qui 47.0
Wen Daniel repudiandae officiis qui 33.0
Wiley Wuckert repudiandae officiis qui 60.0
Winfred Franecki repudiandae officiis qui 84.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>