Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Raquel Runolfsson perspiciatis totam perferendis 57.0
Myrtle O'Conner animi aperiam tenetur 57.0
Elida Zulauf quibusdam sed sit 57.0
Awilda Schumm vitae eum pariatur 57.0
Jackson Kozey quibusdam sed sit 57.0
Wen Daniel repudiandae officiis qui 57.0
Eleonore Wisozk doloribus hic corporis 57.0
Marna Ritchie suscipit consectetur beatae 58.0
Jarvis Ryan quibusdam sed sit 58.0
Bong Witting eum amet quia 58.0
Pearlie McGlynn vitae eum pariatur 58.0
Ashleigh Kris perspiciatis totam perferendis 58.0
Winfred Franecki odio velit repudiandae 58.0
Jamie Stehr repudiandae officiis qui 58.0
Jon Lindgren saepe hic temporibus 58.0
Thaddeus Stanton animi aperiam tenetur 58.0
Royce Spencer suscipit consectetur beatae 58.0
Tess Nikolaus quibusdam sed sit 58.0
Wiley Wuckert repudiandae officiis qui 58.0
Clifton Hintz odio velit repudiandae 58.0
Rebecca Rempel suscipit consectetur beatae 58.0
Desmond Murray vitae eum pariatur 58.0
Juliana Hauck vitae eum pariatur 58.0
Jarvis Ryan doloribus hic corporis 58.0
Imelda Heidenreich quibusdam sed sit 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>