Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Almeta Adams animi aperiam tenetur 77.0
Jarvis Ryan saepe hic temporibus 77.0
Wiley Wuckert repudiandae officiis qui 77.0
Evangelina Pfeffer doloribus hic corporis 77.0
Clifton Hintz doloribus hic corporis 76.0
Raquel Runolfsson perspiciatis totam perferendis 76.0
Cathey Prohaska perspiciatis totam perferendis 76.0
Elida Zulauf perspiciatis totam perferendis 76.0
Tamera Bogan suscipit consectetur beatae 76.0
Jarvis Ryan suscipit consectetur beatae 76.0
Sylvester Hane repudiandae officiis qui 76.0
Li Considine suscipit consectetur beatae 76.0
Shane Glover odio velit repudiandae 76.0
Winfred Franecki eum amet quia 76.0
Tamera Bogan doloribus hic corporis 76.0
Felisa Jaskolski vitae eum pariatur 76.0
Pearlie McGlynn doloribus hic corporis 76.0
Dona Gutkowski suscipit consectetur beatae 76.0
Micheal Jenkins doloribus hic corporis 76.0
Imelda Heidenreich vitae eum pariatur 76.0
Ethyl Ankunding perspiciatis totam perferendis 75.0
German Murphy eum amet quia 75.0
Alex Legros vitae eum pariatur 75.0
Deja Corkery eum amet quia 75.0
Jewell Kreiger saepe hic temporibus 75.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>