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 quibusdam sed sit 79.0
Raquel Runolfsson quibusdam sed sit 58.0
Rebecca Rempel quibusdam sed sit 76.0
Reinaldo Heidenreich quibusdam sed sit 51.0
Rossana Schneider quibusdam sed sit 83.0
Royce Spencer quibusdam sed sit 48.0
Salley Kilback quibusdam sed sit 73.0
Shane Glover quibusdam sed sit 98.0
Shannon Botsford quibusdam sed sit 110.0
Shara Labadie quibusdam sed sit 33.0
Sixta Bashirian quibusdam sed sit 54.0
Sylvester Hane quibusdam sed sit 62.0
Tamera Bogan quibusdam sed sit 74.0
Tami Gibson quibusdam sed sit 75.0
Tamika Cronin quibusdam sed sit 63.0
Terisa Ruecker quibusdam sed sit 76.0
Tess Nikolaus quibusdam sed sit 104.0
Thaddeus Stanton quibusdam sed sit 43.0
Treena Wolf quibusdam sed sit 62.0
Verla Friesen quibusdam sed sit 65.0
Vernia Dietrich quibusdam sed sit 75.0
Vivien Murray quibusdam sed sit 53.0
Wen Daniel quibusdam sed sit 57.0
Wiley Wuckert quibusdam sed sit 91.0
Winfred Franecki quibusdam sed sit 95.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>