Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Gwendolyn Satterfield quibusdam sed sit 80.0
Gwendolyn Satterfield repudiandae officiis qui 59.0
Gwendolyn Satterfield saepe hic temporibus 94.0
Gwendolyn Satterfield suscipit consectetur beatae 95.0
Gwendolyn Satterfield vitae eum pariatur 46.0
Huong McKenzie animi aperiam tenetur 56.0
Huong McKenzie doloribus hic corporis 65.0
Huong McKenzie eum amet quia 51.0
Huong McKenzie odio velit repudiandae 74.0
Huong McKenzie perspiciatis totam perferendis 63.0
Huong McKenzie quibusdam sed sit 33.0
Huong McKenzie repudiandae officiis qui 39.0
Huong McKenzie saepe hic temporibus 51.0
Huong McKenzie suscipit consectetur beatae 81.0
Huong McKenzie vitae eum pariatur 53.0
Imelda Heidenreich animi aperiam tenetur 41.0
Imelda Heidenreich doloribus hic corporis 79.0
Imelda Heidenreich eum amet quia 107.0
Imelda Heidenreich odio velit repudiandae 62.0
Imelda Heidenreich perspiciatis totam perferendis 54.0
Imelda Heidenreich quibusdam sed sit 58.0
Imelda Heidenreich repudiandae officiis qui 78.0
Imelda Heidenreich saepe hic temporibus 70.0
Imelda Heidenreich suscipit consectetur beatae 78.0
Imelda Heidenreich vitae eum pariatur 54.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>