Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Elsa Goodwin animi aperiam tenetur 108.0
Elsa Goodwin doloribus hic corporis 92.0
Elsa Goodwin eum amet quia 88.0
Elsa Goodwin odio velit repudiandae 36.0
Elsa Goodwin perspiciatis totam perferendis 54.0
Elsa Goodwin quibusdam sed sit 58.0
Elsa Goodwin repudiandae officiis qui 75.0
Elsa Goodwin saepe hic temporibus 46.0
Elsa Goodwin suscipit consectetur beatae 70.0
Elsa Goodwin vitae eum pariatur 82.0
Elli Dietrich animi aperiam tenetur 38.0
Elli Dietrich doloribus hic corporis 73.0
Elli Dietrich eum amet quia 108.0
Elli Dietrich odio velit repudiandae 59.0
Elli Dietrich perspiciatis totam perferendis 98.0
Elli Dietrich quibusdam sed sit 71.0
Elli Dietrich repudiandae officiis qui 65.0
Elli Dietrich saepe hic temporibus 88.0
Elli Dietrich suscipit consectetur beatae 56.0
Elli Dietrich vitae eum pariatur 44.0
Elise Waelchi animi aperiam tenetur 62.0
Elise Waelchi doloribus hic corporis 74.0
Elise Waelchi eum amet quia 77.0
Elise Waelchi odio velit repudiandae 58.0
Elise Waelchi perspiciatis totam perferendis 105.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>