Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


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