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 quibusdam sed sit 88.0
Flavia Will repudiandae officiis qui 88.0
Gonzalo Blanda quibusdam sed sit 88.0
Wen Daniel eum amet quia 88.0
Tami Gibson saepe hic temporibus 88.0
Cristopher Dooley quibusdam sed sit 87.0
Vernia Dietrich doloribus hic corporis 87.0
Myriam Von vitae eum pariatur 87.0
Penney Schowalter eum amet quia 87.0
Myriam Von odio velit repudiandae 87.0
Mi Prosacco repudiandae officiis qui 86.0
Myriam Von quibusdam sed sit 86.0
Ethyl Ankunding repudiandae officiis qui 86.0
Jarvis Ryan suscipit consectetur beatae 86.0
Maryanna Medhurst eum amet quia 86.0
Blake Hoppe animi aperiam tenetur 86.0
Flavia Will animi aperiam tenetur 86.0
Elida Zulauf animi aperiam tenetur 85.0
Brigid McLaughlin doloribus hic corporis 85.0
Jarvis Ryan repudiandae officiis qui 85.0
Palmira Fay repudiandae officiis qui 85.0
Maryanna Medhurst animi aperiam tenetur 85.0
Thaddeus Stanton suscipit consectetur beatae 84.0
Elenora Brakus repudiandae officiis qui 84.0
Pearlie McGlynn odio velit repudiandae 84.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>