Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Penney Schowalter repudiandae officiis qui 81.0
Raquel Runolfsson repudiandae officiis qui 73.0
Rebecca Rempel repudiandae officiis qui 70.0
Reinaldo Heidenreich repudiandae officiis qui 94.0
Rossana Schneider repudiandae officiis qui 28.0
Royce Spencer repudiandae officiis qui 54.0
Salley Kilback repudiandae officiis qui 69.0
Shane Glover repudiandae officiis qui 55.0
Shannon Botsford repudiandae officiis qui 57.0
Shara Labadie repudiandae officiis qui 85.0
Sixta Bashirian repudiandae officiis qui 56.0
Sylvester Hane repudiandae officiis qui 90.0
Tamera Bogan repudiandae officiis qui 35.0
Tami Gibson repudiandae officiis qui 95.0
Tamika Cronin repudiandae officiis qui 62.0
Terisa Ruecker repudiandae officiis qui 89.0
Tess Nikolaus repudiandae officiis qui 55.0
Thaddeus Stanton repudiandae officiis qui 32.0
Treena Wolf repudiandae officiis qui 42.0
Verla Friesen repudiandae officiis qui 55.0
Vernia Dietrich repudiandae officiis qui 66.0
Vivien Murray repudiandae officiis qui 45.0
Wen Daniel repudiandae officiis qui 57.0
Wiley Wuckert repudiandae officiis qui 58.0
Winfred Franecki repudiandae officiis qui 49.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>