Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Brigid McLaughlin vitae eum pariatur 62.0
Vernia Dietrich quibusdam sed sit 62.0
Grace Kris repudiandae officiis qui 62.0
Blake Hoppe saepe hic temporibus 62.0
Marna Ritchie eum amet quia 62.0
Myrtle O'Conner repudiandae officiis qui 62.0
German Murphy quibusdam sed sit 61.0
Mi Prosacco saepe hic temporibus 61.0
Tami Gibson repudiandae officiis qui 61.0
Alise Rolfson animi aperiam tenetur 61.0
Arnita Smith odio velit repudiandae 61.0
Blake Hoppe repudiandae officiis qui 61.0
Elsa Goodwin perspiciatis totam perferendis 61.0
Myriam Von animi aperiam tenetur 61.0
Britney Ruecker repudiandae officiis qui 61.0
Reinaldo Heidenreich perspiciatis totam perferendis 61.0
German Murphy odio velit repudiandae 61.0
Jarvis Ryan eum amet quia 61.0
Vernia Dietrich eum amet quia 61.0
Gwendolyn Satterfield doloribus hic corporis 61.0
Isidro McCullough quibusdam sed sit 61.0
Shannon Botsford suscipit consectetur beatae 61.0
Marna Ritchie animi aperiam tenetur 61.0
Verla Friesen suscipit consectetur beatae 61.0
Tess Nikolaus doloribus hic corporis 61.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>