Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Huong McKenzie perspiciatis totam perferendis 71.0
Crissy Brekke saepe hic temporibus 71.0
Jackson Kozey repudiandae officiis qui 71.0
Arnita Smith odio velit repudiandae 71.0
Joelle Hodkiewicz saepe hic temporibus 71.0
Awilda Schumm vitae eum pariatur 71.0
Jarvis Ryan saepe hic temporibus 71.0
Thaddeus Stanton quibusdam sed sit 71.0
Palmira Fay animi aperiam tenetur 71.0
Ashleigh Kris quibusdam sed sit 71.0
Shara Labadie doloribus hic corporis 71.0
Vivien Murray quibusdam sed sit 71.0
Lesia Hyatt animi aperiam tenetur 71.0
Beverlee Auer doloribus hic corporis 71.0
Elsa Goodwin repudiandae officiis qui 71.0
Elise Waelchi suscipit consectetur beatae 72.0
Deja Corkery vitae eum pariatur 72.0
Micheal Jenkins vitae eum pariatur 72.0
Treena Wolf doloribus hic corporis 72.0
Lynell Stamm vitae eum pariatur 72.0
Thaddeus Stanton doloribus hic corporis 72.0
Bok Wolf quibusdam sed sit 72.0
Imelda Heidenreich saepe hic temporibus 72.0
Raquel Runolfsson doloribus hic corporis 72.0
Benita Thompson odio velit repudiandae 72.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>