Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


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