Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


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