Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Lesia Hyatt saepe hic temporibus 84.0
Bok Wolf eum amet quia 83.0
Jewell Swaniawski perspiciatis totam perferendis 83.0
Jamison Hagenes suscipit consectetur beatae 83.0
Rossana Schneider quibusdam sed sit 83.0
Jewell Kreiger odio velit repudiandae 83.0
Clifton Hintz repudiandae officiis qui 83.0
Lynell Stamm animi aperiam tenetur 82.0
Elsa Goodwin vitae eum pariatur 82.0
Myriam Von quibusdam sed sit 82.0
Kellie Cassin suscipit consectetur beatae 82.0
Alex Legros doloribus hic corporis 82.0
Desmond Murray odio velit repudiandae 82.0
Brigid McLaughlin eum amet quia 82.0
Wen Daniel odio velit repudiandae 82.0
Malvina Zulauf saepe hic temporibus 82.0
Myriam Von saepe hic temporibus 82.0
German Murphy doloribus hic corporis 82.0
Dahlia Hilll suscipit consectetur beatae 82.0
Tess Nikolaus repudiandae officiis qui 82.0
Adrienne Eichmann saepe hic temporibus 81.0
Awilda Schumm animi aperiam tenetur 81.0
Shannon Botsford perspiciatis totam perferendis 81.0
Jamie Stehr odio velit repudiandae 81.0
Pearlie McGlynn doloribus hic corporis 81.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>