Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Winfred Franecki odio velit repudiandae 105.0
Juliana Hauck eum amet quia 105.0
Malvina Zulauf quibusdam sed sit 105.0
Elsa Goodwin saepe hic temporibus 106.0
Reinaldo Heidenreich quibusdam sed sit 106.0
Arnita Smith doloribus hic corporis 107.0
Ophelia Hermiston quibusdam sed sit 107.0
Claudette Hagenes perspiciatis totam perferendis 108.0
Dahlia Hilll saepe hic temporibus 109.0
Shane Glover repudiandae officiis qui 110.0
Jackson Kozey odio velit repudiandae 110.0
Huong McKenzie suscipit consectetur beatae 110.0
Ophelia Hermiston repudiandae officiis qui 111.0
Elli Dietrich odio velit repudiandae 111.0
Elenora Brakus saepe hic temporibus 112.0
Brigid McLaughlin animi aperiam tenetur 112.0
Lynell Stamm animi aperiam tenetur 113.0
Verla Friesen quibusdam sed sit 113.0
Lynell Stamm saepe hic temporibus 114.0
Gwendolyn Satterfield animi aperiam tenetur 114.0
Maryanna Medhurst quibusdam sed sit 114.0
Elise Waelchi vitae eum pariatur 116.0
Shara Labadie animi aperiam tenetur 125.0
Marna Ritchie perspiciatis totam perferendis 125.0
Verla Friesen eum amet quia 130.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>