Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Adrienne Eichmann repudiandae officiis qui 48.0
Alex Legros repudiandae officiis qui 51.0
Alise Rolfson repudiandae officiis qui 47.0
Almeta Adams repudiandae officiis qui 36.0
Arnita Smith repudiandae officiis qui 71.0
Ashleigh Kris repudiandae officiis qui 107.0
Awilda Schumm repudiandae officiis qui 73.0
Benita Thompson repudiandae officiis qui 43.0
Beverlee Auer repudiandae officiis qui 54.0
Blake Hoppe repudiandae officiis qui 61.0
Bok Wolf repudiandae officiis qui 72.0
Bong Witting repudiandae officiis qui 71.0
Bridgett Reilly repudiandae officiis qui 107.0
Brigid McLaughlin repudiandae officiis qui 66.0
Britney Ruecker repudiandae officiis qui 61.0
Carlota Gottlieb repudiandae officiis qui 72.0
Cathey Prohaska repudiandae officiis qui 46.0
Cherly Kovacek repudiandae officiis qui 51.0
Claudette Hagenes repudiandae officiis qui 72.0
Clifton Hintz repudiandae officiis qui 83.0
Crissy Brekke repudiandae officiis qui 29.0
Cristopher Dooley repudiandae officiis qui 90.0
Dahlia Hilll repudiandae officiis qui 71.0
Dania Crona repudiandae officiis qui 70.0
Deja Corkery repudiandae officiis qui 54.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>