Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Myriam Von animi aperiam tenetur 52.0
Myriam Von doloribus hic corporis 66.0
Myriam Von eum amet quia 39.0
Myriam Von odio velit repudiandae 87.0
Myriam Von perspiciatis totam perferendis 79.0
Myriam Von quibusdam sed sit 86.0
Myriam Von repudiandae officiis qui 98.0
Myriam Von saepe hic temporibus 44.0
Myriam Von suscipit consectetur beatae 31.0
Myriam Von vitae eum pariatur 87.0
Mi Prosacco animi aperiam tenetur 41.0
Mi Prosacco doloribus hic corporis 59.0
Mi Prosacco eum amet quia 47.0
Mi Prosacco odio velit repudiandae 49.0
Mi Prosacco perspiciatis totam perferendis 41.0
Mi Prosacco quibusdam sed sit 28.0
Mi Prosacco repudiandae officiis qui 86.0
Mi Prosacco saepe hic temporibus 40.0
Mi Prosacco suscipit consectetur beatae 75.0
Mi Prosacco vitae eum pariatur 100.0
Milagros Lemke animi aperiam tenetur 98.0
Milagros Lemke doloribus hic corporis 77.0
Milagros Lemke eum amet quia 81.0
Milagros Lemke odio velit repudiandae 56.0
Milagros Lemke perspiciatis totam perferendis 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>