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 52.0
Raquel Runolfsson repudiandae officiis qui 43.0
Rebecca Rempel repudiandae officiis qui 69.0
Reinaldo Heidenreich repudiandae officiis qui 58.0
Rossana Schneider repudiandae officiis qui 88.0
Royce Spencer repudiandae officiis qui 96.0
Salley Kilback repudiandae officiis qui 64.0
Shane Glover repudiandae officiis qui 85.0
Shannon Botsford repudiandae officiis qui 58.0
Shara Labadie repudiandae officiis qui 97.0
Sixta Bashirian repudiandae officiis qui 56.0
Sylvester Hane repudiandae officiis qui 98.0
Tamera Bogan repudiandae officiis qui 33.0
Tami Gibson repudiandae officiis qui 48.0
Tamika Cronin repudiandae officiis qui 48.0
Terisa Ruecker repudiandae officiis qui 43.0
Tess Nikolaus repudiandae officiis qui 82.0
Thaddeus Stanton repudiandae officiis qui 33.0
Treena Wolf repudiandae officiis qui 61.0
Verla Friesen repudiandae officiis qui 33.0
Vernia Dietrich repudiandae officiis qui 51.0
Vivien Murray repudiandae officiis qui 49.0
Wen Daniel repudiandae officiis qui 51.0
Wiley Wuckert repudiandae officiis qui 44.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>