Gem source code Demo source code
Author: Bogdan Gusiev

User Grid (basic) Time Entry Grid (advanced)

Time Entries Grid


Developer Project Report hours
Elise Waelchi quibusdam sed sit 64.0
Elise Waelchi repudiandae officiis qui 60.0
Elise Waelchi saepe hic temporibus 35.0
Elise Waelchi suscipit consectetur beatae 43.0
Elise Waelchi vitae eum pariatur 52.0
Elli Dietrich animi aperiam tenetur 84.0
Elli Dietrich doloribus hic corporis 68.0
Elli Dietrich eum amet quia 59.0
Elli Dietrich odio velit repudiandae 66.0
Elli Dietrich perspiciatis totam perferendis 56.0
Elli Dietrich quibusdam sed sit 60.0
Elli Dietrich repudiandae officiis qui 63.0
Elli Dietrich saepe hic temporibus 99.0
Elli Dietrich suscipit consectetur beatae 55.0
Elli Dietrich vitae eum pariatur 53.0
Elsa Goodwin animi aperiam tenetur 54.0
Elsa Goodwin doloribus hic corporis 62.0
Elsa Goodwin eum amet quia 96.0
Elsa Goodwin odio velit repudiandae 62.0
Elsa Goodwin perspiciatis totam perferendis 104.0
Elsa Goodwin quibusdam sed sit 56.0
Elsa Goodwin repudiandae officiis qui 54.0
Elsa Goodwin saepe hic temporibus 80.0
Elsa Goodwin suscipit consectetur beatae 51.0
Elsa Goodwin vitae eum pariatur 62.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>