Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Juliana Hauck repudiandae officiis qui 53.0
Sixta Bashirian doloribus hic corporis 53.0
Micheal Jenkins odio velit repudiandae 53.0
Myrtle O'Conner repudiandae officiis qui 53.0
Malvina Zulauf odio velit repudiandae 53.0
Cherly Kovacek suscipit consectetur beatae 53.0
Maryanna Medhurst doloribus hic corporis 53.0
Clifton Hintz odio velit repudiandae 53.0
Almeta Adams odio velit repudiandae 53.0
Alex Legros odio velit repudiandae 53.0
Crissy Brekke repudiandae officiis qui 53.0
Wiley Wuckert eum amet quia 53.0
Sylvester Hane saepe hic temporibus 53.0
Dahlia Hilll suscipit consectetur beatae 53.0
Joelle Hodkiewicz eum amet quia 54.0
Salley Kilback repudiandae officiis qui 54.0
Felisa Jaskolski eum amet quia 54.0
Elsa Goodwin eum amet quia 54.0
Joelle Hodkiewicz repudiandae officiis qui 54.0
Milagros Lemke quibusdam sed sit 54.0
Jon Lindgren odio velit repudiandae 54.0
Crissy Brekke animi aperiam tenetur 54.0
Myrtle O'Conner doloribus hic corporis 54.0
Royce Spencer animi aperiam tenetur 54.0
Treena Wolf eum amet quia 54.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>