Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Jewell Swaniawski eum amet quia 84.0
Elli Dietrich doloribus hic corporis 84.0
Thaddeus Stanton suscipit consectetur beatae 84.0
Maryanna Medhurst animi aperiam tenetur 85.0
Palmira Fay repudiandae officiis qui 85.0
Elida Zulauf animi aperiam tenetur 85.0
Jarvis Ryan repudiandae officiis qui 85.0
Brigid McLaughlin doloribus hic corporis 85.0
Ethyl Ankunding repudiandae officiis qui 86.0
Myriam Von quibusdam sed sit 86.0
Mi Prosacco repudiandae officiis qui 86.0
Maryanna Medhurst eum amet quia 86.0
Jarvis Ryan suscipit consectetur beatae 86.0
Flavia Will animi aperiam tenetur 86.0
Blake Hoppe animi aperiam tenetur 86.0
Myriam Von vitae eum pariatur 87.0
Vernia Dietrich doloribus hic corporis 87.0
Cristopher Dooley quibusdam sed sit 87.0
Myriam Von odio velit repudiandae 87.0
Penney Schowalter eum amet quia 87.0
Shara Labadie repudiandae officiis qui 88.0
Gonzalo Blanda quibusdam sed sit 88.0
Elli Dietrich quibusdam sed sit 88.0
Wen Daniel eum amet quia 88.0
Flavia Will repudiandae officiis qui 88.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>