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 103.0
Raquel Runolfsson repudiandae officiis qui 58.0
Rebecca Rempel repudiandae officiis qui 80.0
Reinaldo Heidenreich repudiandae officiis qui 78.0
Rossana Schneider repudiandae officiis qui 69.0
Royce Spencer repudiandae officiis qui 46.0
Salley Kilback repudiandae officiis qui 70.0
Shane Glover repudiandae officiis qui 56.0
Shannon Botsford repudiandae officiis qui 70.0
Shara Labadie repudiandae officiis qui 53.0
Sixta Bashirian repudiandae officiis qui 68.0
Sylvester Hane repudiandae officiis qui 76.0
Tamera Bogan repudiandae officiis qui 66.0
Tami Gibson repudiandae officiis qui 61.0
Tamika Cronin repudiandae officiis qui 82.0
Terisa Ruecker repudiandae officiis qui 113.0
Tess Nikolaus repudiandae officiis qui 47.0
Thaddeus Stanton repudiandae officiis qui 72.0
Treena Wolf repudiandae officiis qui 59.0
Verla Friesen repudiandae officiis qui 42.0
Vernia Dietrich repudiandae officiis qui 69.0
Vivien Murray repudiandae officiis qui 65.0
Wen Daniel repudiandae officiis qui 72.0
Wiley Wuckert repudiandae officiis qui 77.0
Winfred Franecki repudiandae officiis qui 58.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>