Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Salley Kilback eum amet quia 70.0
Elida Zulauf odio velit repudiandae 70.0
Salley Kilback repudiandae officiis qui 70.0
Flavia Will quibusdam sed sit 70.0
Jewell Kreiger vitae eum pariatur 71.0
Rossana Schneider eum amet quia 71.0
Evangelina Pfeffer perspiciatis totam perferendis 71.0
Cathey Prohaska vitae eum pariatur 71.0
Elise Waelchi perspiciatis totam perferendis 71.0
Reinaldo Heidenreich saepe hic temporibus 71.0
Tami Gibson quibusdam sed sit 71.0
Elenora Brakus quibusdam sed sit 71.0
Grace Kris doloribus hic corporis 71.0
Bok Wolf animi aperiam tenetur 71.0
Tess Nikolaus odio velit repudiandae 71.0
Bong Witting repudiandae officiis qui 71.0
Jackson Kozey saepe hic temporibus 71.0
Dahlia Hilll repudiandae officiis qui 71.0
Li Considine eum amet quia 71.0
Jamison Hagenes repudiandae officiis qui 71.0
Gonzalo Blanda odio velit repudiandae 71.0
Adrienne Eichmann vitae eum pariatur 71.0
Salley Kilback animi aperiam tenetur 71.0
Gwendolyn Satterfield animi aperiam tenetur 71.0
Arnita Smith repudiandae officiis qui 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>