Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Evangelina Pfeffer saepe hic temporibus 38.0
Jon Lindgren perspiciatis totam perferendis 38.0
Isidro McCullough quibusdam sed sit 38.0
Lillie Hamill eum amet quia 38.0
Ophelia Hermiston odio velit repudiandae 38.0
Thaddeus Stanton perspiciatis totam perferendis 38.0
Lesia Hyatt eum amet quia 38.0
Dona Gutkowski eum amet quia 38.0
Nelson Leannon suscipit consectetur beatae 38.0
Arnita Smith suscipit consectetur beatae 38.0
Pearlie McGlynn eum amet quia 38.0
Li Considine saepe hic temporibus 38.0
Dorthey Turner repudiandae officiis qui 38.0
Verla Friesen animi aperiam tenetur 38.0
Bong Witting doloribus hic corporis 37.0
Bok Wolf saepe hic temporibus 37.0
Shannon Botsford suscipit consectetur beatae 37.0
Raquel Runolfsson saepe hic temporibus 37.0
Arnita Smith odio velit repudiandae 37.0
Mi Prosacco suscipit consectetur beatae 37.0
Gwendolyn Satterfield doloribus hic corporis 37.0
Kellie Cassin eum amet quia 37.0
Deja Corkery animi aperiam tenetur 37.0
Claudette Hagenes saepe hic temporibus 37.0
Elenora Brakus vitae eum pariatur 37.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>