Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Gonzalo Blanda saepe hic temporibus 75.0
Awilda Schumm perspiciatis totam perferendis 75.0
Elisa Wintheiser doloribus hic corporis 75.0
Tami Gibson vitae eum pariatur 75.0
Wen Daniel vitae eum pariatur 75.0
Palmira Fay repudiandae officiis qui 75.0
Jamison Hagenes odio velit repudiandae 75.0
Pearlie McGlynn animi aperiam tenetur 75.0
Lynell Stamm repudiandae officiis qui 75.0
Britney Ruecker doloribus hic corporis 75.0
Milagros Lemke eum amet quia 75.0
Ophelia Hermiston vitae eum pariatur 75.0
Awilda Schumm quibusdam sed sit 75.0
Jewell Kreiger animi aperiam tenetur 75.0
Beverlee Auer animi aperiam tenetur 76.0
Rebecca Rempel animi aperiam tenetur 76.0
Rebecca Rempel vitae eum pariatur 76.0
Mi Prosacco saepe hic temporibus 76.0
Pearlie McGlynn saepe hic temporibus 76.0
Arnita Smith doloribus hic corporis 76.0
Wen Daniel perspiciatis totam perferendis 76.0
Raquel Runolfsson doloribus hic corporis 76.0
Arnita Smith perspiciatis totam perferendis 76.0
Myriam Von odio velit repudiandae 76.0
Kellie Cassin animi aperiam tenetur 76.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>