Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Kellie Cassin perspiciatis totam perferendis 73.0
Huong McKenzie quibusdam sed sit 73.0
Isidro McCullough perspiciatis totam perferendis 73.0
Britney Ruecker vitae eum pariatur 73.0
Tamera Bogan suscipit consectetur beatae 73.0
Reinaldo Heidenreich saepe hic temporibus 73.0
Tess Nikolaus odio velit repudiandae 73.0
Royce Spencer eum amet quia 73.0
Jamie Stehr vitae eum pariatur 73.0
Ashleigh Kris vitae eum pariatur 73.0
Salley Kilback perspiciatis totam perferendis 73.0
Imelda Heidenreich eum amet quia 72.0
Kellie Cassin animi aperiam tenetur 72.0
Shara Labadie quibusdam sed sit 72.0
Elisa Wintheiser suscipit consectetur beatae 72.0
Benita Thompson doloribus hic corporis 72.0
Awilda Schumm doloribus hic corporis 72.0
Jewell Swaniawski animi aperiam tenetur 72.0
Jewell Kreiger animi aperiam tenetur 72.0
Deja Corkery vitae eum pariatur 72.0
Treena Wolf animi aperiam tenetur 72.0
Mi Prosacco perspiciatis totam perferendis 72.0
Dahlia Hilll animi aperiam tenetur 72.0
Ethyl Ankunding quibusdam sed sit 72.0
Desmond Murray perspiciatis totam perferendis 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>