Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Vivien Murray suscipit consectetur beatae 40.0
Alex Legros saepe hic temporibus 40.0
Gwendolyn Satterfield vitae eum pariatur 40.0
Kellie Cassin saepe hic temporibus 40.0
Bong Witting odio velit repudiandae 40.0
Terisa Ruecker saepe hic temporibus 40.0
Grace Kris suscipit consectetur beatae 40.0
Myrtle O'Conner quibusdam sed sit 40.0
Tess Nikolaus vitae eum pariatur 40.0
Winfred Franecki odio velit repudiandae 40.0
Brigid McLaughlin quibusdam sed sit 40.0
Wen Daniel repudiandae officiis qui 40.0
Deja Corkery animi aperiam tenetur 40.0
Elisa Wintheiser doloribus hic corporis 39.0
Jamison Hagenes animi aperiam tenetur 39.0
Arnita Smith suscipit consectetur beatae 39.0
Ophelia Hermiston suscipit consectetur beatae 39.0
Awilda Schumm perspiciatis totam perferendis 39.0
Evangelina Pfeffer doloribus hic corporis 39.0
Marna Ritchie doloribus hic corporis 39.0
Alise Rolfson perspiciatis totam perferendis 39.0
Gonzalo Blanda saepe hic temporibus 39.0
Vivien Murray odio velit repudiandae 39.0
Clifton Hintz repudiandae officiis qui 39.0
Penney Schowalter suscipit consectetur beatae 38.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>