Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Elli Dietrich perspiciatis totam perferendis 98.0
Cathey Prohaska perspiciatis totam perferendis 98.0
Shane Glover quibusdam sed sit 98.0
Sylvester Hane repudiandae officiis qui 98.0
Pearlie McGlynn suscipit consectetur beatae 98.0
Elise Waelchi vitae eum pariatur 98.0
Treena Wolf vitae eum pariatur 98.0
Raquel Runolfsson odio velit repudiandae 100.0
Treena Wolf doloribus hic corporis 100.0
Benita Thompson doloribus hic corporis 100.0
Gonzalo Blanda perspiciatis totam perferendis 100.0
Ethyl Ankunding vitae eum pariatur 100.0
Dona Gutkowski eum amet quia 100.0
Marna Ritchie quibusdam sed sit 100.0
Bok Wolf odio velit repudiandae 100.0
Cristopher Dooley eum amet quia 101.0
Dorthey Turner suscipit consectetur beatae 102.0
Sixta Bashirian doloribus hic corporis 103.0
Flavia Will doloribus hic corporis 103.0
Verla Friesen saepe hic temporibus 103.0
Bok Wolf repudiandae officiis qui 103.0
Jon Lindgren saepe hic temporibus 104.0
Royce Spencer doloribus hic corporis 104.0
Adrienne Eichmann doloribus hic corporis 104.0
Tess Nikolaus quibusdam sed sit 104.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>