Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Shane Glover quibusdam sed sit 52.0
Shane Glover repudiandae officiis qui 27.0
Shane Glover saepe hic temporibus 58.0
Shane Glover suscipit consectetur beatae 69.0
Shane Glover vitae eum pariatur 62.0
Shannon Botsford animi aperiam tenetur 83.0
Shannon Botsford doloribus hic corporis 60.0
Shannon Botsford eum amet quia 70.0
Shannon Botsford odio velit repudiandae 33.0
Shannon Botsford perspiciatis totam perferendis 51.0
Shannon Botsford quibusdam sed sit 69.0
Shannon Botsford repudiandae officiis qui 23.0
Shannon Botsford saepe hic temporibus 95.0
Shannon Botsford suscipit consectetur beatae 52.0
Shannon Botsford vitae eum pariatur 54.0
Shara Labadie animi aperiam tenetur 82.0
Shara Labadie doloribus hic corporis 31.0
Shara Labadie eum amet quia 49.0
Shara Labadie odio velit repudiandae 50.0
Shara Labadie perspiciatis totam perferendis 56.0
Shara Labadie quibusdam sed sit 72.0
Shara Labadie repudiandae officiis qui 51.0
Shara Labadie saepe hic temporibus 80.0
Shara Labadie suscipit consectetur beatae 60.0
Shara Labadie vitae eum pariatur 68.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>