Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Desmond Murray repudiandae officiis qui 33.0
Dona Gutkowski repudiandae officiis qui 53.0
Dorthey Turner repudiandae officiis qui 68.0
Elenora Brakus repudiandae officiis qui 69.0
Eleonore Wisozk repudiandae officiis qui 45.0
Elida Zulauf repudiandae officiis qui 38.0
Elisa Wintheiser repudiandae officiis qui 90.0
Elise Waelchi repudiandae officiis qui 36.0
Elli Dietrich repudiandae officiis qui 46.0
Elsa Goodwin repudiandae officiis qui 59.0
Ethyl Ankunding repudiandae officiis qui 71.0
Evangelina Pfeffer repudiandae officiis qui 49.0
Felisa Jaskolski repudiandae officiis qui 56.0
Flavia Will repudiandae officiis qui 95.0
German Murphy repudiandae officiis qui 89.0
Gonzalo Blanda repudiandae officiis qui 56.0
Grace Kris repudiandae officiis qui 61.0
Gwendolyn Satterfield repudiandae officiis qui 44.0
Huong McKenzie repudiandae officiis qui 90.0
Imelda Heidenreich repudiandae officiis qui 57.0
Isidro McCullough repudiandae officiis qui 73.0
Jackson Kozey repudiandae officiis qui 65.0
Jamie Stehr repudiandae officiis qui 43.0
Jamison Hagenes repudiandae officiis qui 47.0
Jarvis Ryan repudiandae officiis qui 70.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>