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 eum amet quia 87.0
Raquel Runolfsson eum amet quia 38.0
Rebecca Rempel eum amet quia 44.0
Reinaldo Heidenreich eum amet quia 57.0
Rossana Schneider eum amet quia 54.0
Royce Spencer eum amet quia 33.0
Salley Kilback eum amet quia 54.0
Shane Glover eum amet quia 96.0
Shannon Botsford eum amet quia 54.0
Shara Labadie eum amet quia 48.0
Sixta Bashirian eum amet quia 67.0
Sylvester Hane eum amet quia 67.0
Tamera Bogan eum amet quia 89.0
Tami Gibson eum amet quia 48.0
Tamika Cronin eum amet quia 28.0
Terisa Ruecker eum amet quia 63.0
Tess Nikolaus eum amet quia 58.0
Thaddeus Stanton eum amet quia 64.0
Treena Wolf eum amet quia 54.0
Verla Friesen eum amet quia 130.0
Vernia Dietrich eum amet quia 77.0
Vivien Murray eum amet quia 90.0
Wen Daniel eum amet quia 88.0
Wiley Wuckert eum amet quia 53.0
Winfred Franecki eum amet quia 82.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>