Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Milagros Lemke doloribus hic corporis 66.0
Dania Crona odio velit repudiandae 66.0
Flavia Will quibusdam sed sit 66.0
Blake Hoppe quibusdam sed sit 66.0
Marna Ritchie animi aperiam tenetur 66.0
Kellie Cassin animi aperiam tenetur 65.0
Britney Ruecker doloribus hic corporis 65.0
Awilda Schumm doloribus hic corporis 65.0
Wiley Wuckert odio velit repudiandae 65.0
Shane Glover vitae eum pariatur 65.0
Nelson Leannon odio velit repudiandae 65.0
Tess Nikolaus animi aperiam tenetur 65.0
Verla Friesen quibusdam sed sit 65.0
Elli Dietrich repudiandae officiis qui 65.0
Carlota Gottlieb saepe hic temporibus 65.0
Penney Schowalter perspiciatis totam perferendis 65.0
Marna Ritchie doloribus hic corporis 65.0
Arnita Smith odio velit repudiandae 65.0
Carlota Gottlieb vitae eum pariatur 65.0
Cherly Kovacek animi aperiam tenetur 65.0
Shara Labadie perspiciatis totam perferendis 65.0
Huong McKenzie doloribus hic corporis 65.0
Almeta Adams suscipit consectetur beatae 65.0
Myrtle O'Conner suscipit consectetur beatae 64.0
Alise Rolfson saepe hic temporibus 64.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>