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 84.0
Raquel Runolfsson repudiandae officiis qui 77.0
Rebecca Rempel repudiandae officiis qui 76.0
Reinaldo Heidenreich repudiandae officiis qui 43.0
Rossana Schneider repudiandae officiis qui 50.0
Royce Spencer repudiandae officiis qui 57.0
Salley Kilback repudiandae officiis qui 85.0
Shane Glover repudiandae officiis qui 27.0
Shannon Botsford repudiandae officiis qui 23.0
Shara Labadie repudiandae officiis qui 51.0
Sixta Bashirian repudiandae officiis qui 64.0
Sylvester Hane repudiandae officiis qui 93.0
Tamera Bogan repudiandae officiis qui 79.0
Tami Gibson repudiandae officiis qui 64.0
Tamika Cronin repudiandae officiis qui 89.0
Terisa Ruecker repudiandae officiis qui 68.0
Tess Nikolaus repudiandae officiis qui 84.0
Thaddeus Stanton repudiandae officiis qui 52.0
Treena Wolf repudiandae officiis qui 86.0
Verla Friesen repudiandae officiis qui 57.0
Vernia Dietrich repudiandae officiis qui 75.0
Vivien Murray repudiandae officiis qui 58.0
Wen Daniel repudiandae officiis qui 40.0
Wiley Wuckert repudiandae officiis qui 59.0
Winfred Franecki repudiandae officiis qui 44.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>