Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Gonzalo Blanda odio velit repudiandae 47.0
Johnny Spinka quibusdam sed sit 47.0
Cherly Kovacek odio velit repudiandae 47.0
Bok Wolf odio velit repudiandae 47.0
Rebecca Rempel quibusdam sed sit 47.0
Salley Kilback quibusdam sed sit 47.0
Verla Friesen eum amet quia 47.0
German Murphy saepe hic temporibus 47.0
Isidro McCullough saepe hic temporibus 47.0
Alise Rolfson suscipit consectetur beatae 47.0
Sixta Bashirian animi aperiam tenetur 47.0
Bridgett Reilly vitae eum pariatur 47.0
Lesia Hyatt animi aperiam tenetur 46.0
Tess Nikolaus odio velit repudiandae 46.0
Elenora Brakus repudiandae officiis qui 46.0
Li Considine suscipit consectetur beatae 46.0
Shannon Botsford quibusdam sed sit 46.0
Jewell Kreiger saepe hic temporibus 46.0
Elenora Brakus odio velit repudiandae 46.0
Tamera Bogan saepe hic temporibus 46.0
Pearlie McGlynn quibusdam sed sit 46.0
Gwendolyn Satterfield vitae eum pariatur 46.0
Flavia Will quibusdam sed sit 46.0
Flavia Will odio velit repudiandae 46.0
Winfred Franecki saepe hic temporibus 46.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>