Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Kaye Greenfelder perspiciatis totam perferendis 87.0
Gonzalo Blanda eum amet quia 87.0
Carlota Gottlieb quibusdam sed sit 87.0
Treena Wolf perspiciatis totam perferendis 87.0
Bong Witting repudiandae officiis qui 87.0
Adrienne Eichmann perspiciatis totam perferendis 87.0
Micheal Jenkins quibusdam sed sit 86.0
Thaddeus Stanton suscipit consectetur beatae 86.0
Sixta Bashirian odio velit repudiandae 86.0
Terisa Ruecker vitae eum pariatur 86.0
Flavia Will suscipit consectetur beatae 85.0
Bok Wolf quibusdam sed sit 85.0
Shara Labadie repudiandae officiis qui 85.0
Ophelia Hermiston quibusdam sed sit 85.0
German Murphy eum amet quia 85.0
Lillie Hamill repudiandae officiis qui 85.0
Salley Kilback suscipit consectetur beatae 85.0
Ophelia Hermiston eum amet quia 85.0
Vernia Dietrich vitae eum pariatur 85.0
Jon Lindgren eum amet quia 84.0
Bong Witting saepe hic temporibus 84.0
Britney Ruecker saepe hic temporibus 84.0
Britney Ruecker odio velit repudiandae 84.0
Shannon Botsford vitae eum pariatur 84.0
Treena Wolf doloribus hic corporis 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>