Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Awilda Schumm perspiciatis totam perferendis 37.0
Benita Thompson eum amet quia 36.0
Treena Wolf perspiciatis totam perferendis 36.0
Alise Rolfson repudiandae officiis qui 36.0
Arnita Smith vitae eum pariatur 36.0
Eleonore Wisozk vitae eum pariatur 36.0
Eleonore Wisozk animi aperiam tenetur 36.0
Jarvis Ryan vitae eum pariatur 36.0
Flavia Will eum amet quia 36.0
Jamie Stehr repudiandae officiis qui 36.0
Marna Ritchie quibusdam sed sit 35.0
Malvina Zulauf saepe hic temporibus 35.0
Li Considine saepe hic temporibus 35.0
Jon Lindgren animi aperiam tenetur 35.0
Carlota Gottlieb saepe hic temporibus 35.0
Lillie Hamill vitae eum pariatur 35.0
Rebecca Rempel animi aperiam tenetur 34.0
Jamison Hagenes perspiciatis totam perferendis 34.0
Bridgett Reilly repudiandae officiis qui 34.0
Tamika Cronin quibusdam sed sit 34.0
Sylvester Hane suscipit consectetur beatae 34.0
Juliana Hauck perspiciatis totam perferendis 34.0
Juliana Hauck vitae eum pariatur 34.0
Shannon Botsford saepe hic temporibus 34.0
Penney Schowalter repudiandae officiis qui 34.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>