Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Crissy Brekke quibusdam sed sit 65.0
Clifton Hintz quibusdam sed sit 65.0
Ethyl Ankunding saepe hic temporibus 65.0
Dania Crona doloribus hic corporis 65.0
Juliana Hauck saepe hic temporibus 65.0
Bridgett Reilly odio velit repudiandae 65.0
Ashleigh Kris animi aperiam tenetur 65.0
Lillie Hamill suscipit consectetur beatae 65.0
Micheal Jenkins perspiciatis totam perferendis 65.0
Wen Daniel vitae eum pariatur 65.0
Arnita Smith eum amet quia 65.0
Shannon Botsford doloribus hic corporis 65.0
Jewell Kreiger perspiciatis totam perferendis 65.0
Malvina Zulauf eum amet quia 65.0
Kaye Greenfelder odio velit repudiandae 65.0
Jackson Kozey perspiciatis totam perferendis 66.0
Bok Wolf perspiciatis totam perferendis 66.0
Milagros Lemke saepe hic temporibus 66.0
Kaye Greenfelder suscipit consectetur beatae 66.0
Claudette Hagenes saepe hic temporibus 66.0
Cathey Prohaska eum amet quia 66.0
Myriam Von doloribus hic corporis 66.0
Elise Waelchi eum amet quia 66.0
Crissy Brekke suscipit consectetur beatae 66.0
Lillie Hamill saepe hic temporibus 66.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>