Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Grace Kris perspiciatis totam perferendis 81.0
Sylvester Hane suscipit consectetur beatae 81.0
Rossana Schneider vitae eum pariatur 81.0
Raquel Runolfsson animi aperiam tenetur 81.0
Rebecca Rempel repudiandae officiis qui 80.0
Li Considine animi aperiam tenetur 80.0
Carlota Gottlieb eum amet quia 80.0
Thaddeus Stanton animi aperiam tenetur 80.0
Jarvis Ryan repudiandae officiis qui 80.0
Arnita Smith perspiciatis totam perferendis 80.0
Nelson Leannon suscipit consectetur beatae 80.0
Reinaldo Heidenreich eum amet quia 80.0
Flavia Will animi aperiam tenetur 80.0
Desmond Murray eum amet quia 80.0
Juliana Hauck saepe hic temporibus 80.0
Alex Legros odio velit repudiandae 80.0
German Murphy saepe hic temporibus 80.0
Carlota Gottlieb odio velit repudiandae 79.0
Ashleigh Kris doloribus hic corporis 79.0
Beverlee Auer saepe hic temporibus 79.0
Rebecca Rempel suscipit consectetur beatae 79.0
Adrienne Eichmann saepe hic temporibus 79.0
Jon Lindgren doloribus hic corporis 79.0
Jamison Hagenes doloribus hic corporis 79.0
Britney Ruecker quibusdam sed sit 79.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>