Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Royce Spencer animi aperiam tenetur 54.0
Royce Spencer doloribus hic corporis 25.0
Royce Spencer eum amet quia 33.0
Royce Spencer odio velit repudiandae 51.0
Royce Spencer perspiciatis totam perferendis 83.0
Royce Spencer quibusdam sed sit 39.0
Royce Spencer repudiandae officiis qui 55.0
Royce Spencer saepe hic temporibus 81.0
Royce Spencer suscipit consectetur beatae 78.0
Royce Spencer vitae eum pariatur 33.0
Salley Kilback animi aperiam tenetur 68.0
Salley Kilback doloribus hic corporis 46.0
Salley Kilback eum amet quia 54.0
Salley Kilback odio velit repudiandae 94.0
Salley Kilback perspiciatis totam perferendis 47.0
Salley Kilback quibusdam sed sit 77.0
Salley Kilback repudiandae officiis qui 54.0
Salley Kilback saepe hic temporibus 50.0
Salley Kilback suscipit consectetur beatae 52.0
Salley Kilback vitae eum pariatur 80.0
Shane Glover animi aperiam tenetur 57.0
Shane Glover doloribus hic corporis 59.0
Shane Glover eum amet quia 96.0
Shane Glover odio velit repudiandae 65.0
Shane Glover perspiciatis totam perferendis 62.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>